如何在Google ML Engine上实现以字符串为输入的中文情感分析及预处理?
嘿,我来帮你把在Google ML Engine上构建中文情感分析模型的流程理清楚,包括你提到的字符串预处理,还有部署后怎么传字符串调用模型——结合你的代码片段来完善细节:
一、完善字符串预处理流程
你已经写了开头的几步,我帮你补全并优化,确保处理逻辑完整:
import tensorflow as tf # 定义输入占位符,给它起个明确的名字,方便后续部署调用 input_x = tf.placeholder(tf.string, [None], name="input_sentence") # 第一步:替换所有空白字符(包括换行符、空格、制表符),清理文本 # 用[\s\n]+匹配连续的空白/换行,替换为空字符串 cleaned_x = tf.regex_replace(input_x, r'[\s\n]+', '', name="clean_text") # 第二步:将每个字符串拆分为单个字符的序列 # string_split返回的是SparseTensor(稀疏张量),必须转成DenseTensor才能后续处理 chars_sparse = tf.string_split(cleaned_x, delimiter='', skip_empty=True) chars_dense = tf.sparse_tensor_to_dense(chars_sparse, default_value='', name="char_sequence") # 第三步:填充/截断到固定长度(这里设为1000,你可以根据需求调整) # 用tf.shape获取动态长度,因为批量输入里每个句子的字符数可能不一样 seq_length = tf.shape(chars_dense)[1] pad_length = tf.maximum(0, 1000 - seq_length) # 填充到固定长度,不足的补空字符串,超过的就截断 fixed_length_chars = tf.pad(chars_dense, paddings=[[0, 0], [0, pad_length]], mode='CONSTANT', constant_values='', name="padded_chars") fixed_length_chars = tf.slice(fixed_length_chars, [0, 0], [-1, 1000], name="truncated_chars")
这里几个关键点要注意:
- 替换空白的时候要把换行符
\n也包含进去,不然换行符会留在文本里 tf.string_split返回的稀疏张量必须转成稠密张量,不然没法做填充操作- 用动态长度
tf.shape而不是静态shape,因为批量输入的句子长度是不固定的
二、把字符序列转成模型能训练的数值特征
预处理完字符后,得把字符转成索引或者嵌入向量,才能喂给模型训练:
# 假设你已经有预定义的字符词汇表(可以从训练数据中统计生成) # 记得把<PAD>(填充)和<UNK>(未知字符)放在前面 char_vocab = tf.constant(['<PAD>', '<UNK>', '我', '爱', '你', '好', '坏', ...]) # 构建字符到索引的映射表,未知字符默认映射到<UNK>的索引(这里是1) char_to_idx = tf.contrib.lookup.index_table_from_tensor(char_vocab, default_value=1) # 将字符序列转换为索引序列,这样模型就能处理了 char_indices = char_to_idx.lookup(fixed_length_chars)
三、模型构建与ML Engine部署准备
在ML Engine上训练和本地逻辑差不多,但要注意保存模型时必须定义明确的输入输出签名,这样部署后才能直接接收字符串输入:
如果你用的是tf.estimator框架,可以这么导出模型:
# 定义输入特征规范,告诉ML Engine我们接收的是字符串类型的输入 feature_spec = {'input_sentence': tf.FixedLenFeature([], tf.string)} serving_input_receiver_fn = tf.estimator.export.build_parsing_serving_input_receiver_fn(feature_spec) # 训练完成后导出SavedModel,这个格式是ML Engine要求的 estimator.export_saved_model(export_dir_base='./saved_model', serving_input_receiver_fn=serving_input_receiver_fn)
如果用的是低级API,就手动定义签名:
# 假设your_model_output是你的模型最终输出(比如情感分类的概率/标签) predict_signature = tf.saved_model.signature_def_utils.predict_signature_def( inputs={'input_sentence': input_x}, outputs={'sentiment': your_model_output} ) # 保存模型 builder = tf.saved_model.builder.SavedModelBuilder('./saved_model') builder.add_meta_graph_and_variables( sess, [tf.saved_model.tag_constants.SERVING], signature_def_map={ tf.saved_model.signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY: predict_signature } ) builder.save()
四、在ML Engine上运行模型(预测)
模型部署到ML Engine后,有两种常用的调用方式:
方式1:用gcloud命令行调用
单条预测:
gcloud ml-engine predict --model=your_model_name --version=your_version --json-instances='{"input_sentence": "我今天心情特别好"}'
批量预测:先准备一个predict_inputs.json文件,内容如下:
{"input_sentence": "我今天心情特别好"} {"input_sentence": "这个产品用起来太糟心了"} {"input_sentence": "今天的天气还不错"}
然后运行命令:
gcloud ml-engine predict --model=your_model_name --version=your_version --json-instances=predict_inputs.json
方式2:用Python客户端调用
适合集成到你的应用里:
from googleapiclient import discovery from oauth2client.client import GoogleCredentials # 获取Google Cloud认证 credentials = GoogleCredentials.get_application_default() ml_service = discovery.build('ml', 'v1', credentials=credentials) # 替换成你的项目ID、模型名和版本号 project_id = "your-google-cloud-project-id" model_name = "your-sentiment-model" version_name = "v1" # 构造请求体,输入是字符串列表 request_body = { "instances": [ {"input_sentence": "我今天心情特别好"}, {"input_sentence": "这个产品用起来太糟心了"} ] } # 发送预测请求 response = ml_service.projects().predict( name=f"projects/{project_id}/models/{model_name}/versions/{version_name}", body=request_body ).execute() # 打印结果 print(response)
注意:这里的input_sentence必须和你模型里占位符的name完全一致,不然ML Engine找不到输入!
内容的提问来源于stack exchange,提问作者Henry Chen
相关产品推荐
相关产品推荐

