Alink教程(Python版)

第23.5节 中文情感分析示例

情感分析是对带有情感色彩(褒义贬义/正向负向)的主观性文本进行分析,以确定该文本的观点、喜好、情感倾向。本文将针对顾客对酒店的评论数据,进行建模,并通过模型进行预测。演示情感分析中的常用操作,包括分词,文本向量化,及使用朴素贝叶斯(Naive Bayes)方法进行建模、预测。

使用的酒店评论数据集链接为:https://raw.githubusercontent.com/SophonPlus/ChineseNlpCorpus/master/datasets/ChnSentiCorp_htl_all/ChnSentiCorp_htl_all.csv

将数据下载到本地,在本人Mac上的存储路径为: /Users/yangxu/alink/data/ChnSentiCorp_htl_all.txt


每条记录包括评论内容和标记喜好的标签,标签只有2个值:1代表喜欢,0为不喜欢。下图显示了4条数据:

下面我们使用Alink来进行分析、建模。

使用CsvSourceBatchOp读取URL数据,代码如下:

source = CsvSourceBatchOp()\
.setFilePath('/Users/yangxu/alink/data/ChnSentiCorp_htl_all.txt')\
.setSchemaStr('label long, review string')\
.setIgnoreFirstLine(True)

设置列名分别为label和review,数据类型分别为整型和字符串类型,由于该CSV数据第一行保存的是列名,需要设置读取数据时忽略第一行。

下面,我们选择5条数据打印显示出来,看一下数据源是否有问题

source.firstN(5).print()

结果如下:

然后,我们设置Pipeline,将整个处理和模型过程封装在里面,代码如下:

pipeline = Pipeline(
    Imputer().setSelectedCols(["review"]).setOutputCols(["featureText"]).setStrategy("value").setFillValue("null"),
    Segment().setSelectedCol("featureText"),
    StopWordsRemover().setSelectedCol("featureText"),
    DocCountVectorizer().setFeatureType("TF").setSelectedCol("featureText").setOutputCol("featureVector"),
    LogisticRegression().setVectorCol("featureVector").setLabelCol("label").setPredictionCol("pred")
)

解释一下各个算法组件的作用:

  1. Imputer:对“review”列进行缺失值填充,方式是填充字符串值“null”,结果写到“featureText“列。
  2. Segment:是进行分词操作,即将原句子分解为单词,之间用空格分隔。由于没有输入结果列,分词结果会直接替换调输入列的值。
  3. StopWordsRemover:是将分词结果中的停用词去掉。
  4. DocCountVectorizer:对“featureText“列出现的单词进行统计,并根据计算出的TF值,将句子映射为向量,向量长度为单词个数,并保存在"featureVector"列。
  5. LogisticRegression:是使用LogisticRegression分类模型。分类预测放在“pred” 列。

下面,我们就可以进入模型训练阶段。通过Pipeline的fit()方法,可以得到整个流程的模型(PipelineModel),记作变量model,代码如下:

model = pipeline.fit(source)


使用model可以对批式/流式数据进行预测,都是调用model的transform()方法。

model.transform(source).select(["pred", "label", "review"]).firstN(10).print()


运行结果为: