Chinese-sentiment-analysis-with-Doc2Vec
简介
中文语料的情感分析基本步骤如下:
爬取相关的语料或者下载相关语料(本文使用了对于宾馆评价的相关语料作为例子)
将语料进行预处理并分词
用某种量化的表达形式来对语料进行数字化处理
基于监督学习的分类器训练
开发环境 Python-v3(3.6):
- gensim==3.0.1
- jieba==0.39
- scikit-learn==0.19.1
- tensorflow==1.2.1
- numpy==1.13.1+mkl
示例代码参考 https://github.com/lybroman/Chinese-sentiment-analysis-with-Doc2Vec
https://github.com/lybroman/Chinese-sentiment-analysis-with-Doc2Vec
在 repo 中有两个 zip 文件分别为 train.zip 和 test.zip 数据, 当然你也可以直接在加载语料时将部分数据用作测试数据(详见后文).
数据预处理(preprocess.py)
zip 数据中为大量的 txt 文档, 每一个的后缀是评分, 例如
72_1380108_2006-11-9_1.0.txt
, 那么该评分为 1.0 分(其实就是差评啦). 我们需要做的是将所有评分划分为 1,2,3,4,5 档, 顾名思义就是评价由坏到好. 这里用了一些简单的字符串处理来获取分数并使用 round 函数来对分数取整.
将不同的评分 txt 按 folder 分类放好
分词(words_segment.py)
分词是通过第三方的 https://github.com/fxsjy/jieba 实现的.
分词之前需要做一些简单的处理, 比如过滤一些不感兴趣的字符.
- filter_chars = "\r\n,.;!,.:;:,"
- trans_dict = dict.fromkeys((ord(_) for _ in filter_chars), '')
- line = line.translate(trans_dict)
将分完词的语料按照分数归并到同一个文本做为训练做准备
文本向量化模型(main.py:step 1-3)
这里只要使用到了
gensim.models.doc2vec
, 该模块提供了将不定长的文本映射到维度大小固定的向量的功能. 这对于计算相似度还是用作后续的 CNN 分类器训练 (后续有时间的话会实现基于 TensorFlow 的分类器) 都是十分有帮助的.
具体的原理可以参考 https://blog.acolyer.org/2016/06/01/distributed-representations-of-sentences-and-documents/
gensim https://radimrehurek.com/gensim/models/doc2vec.html
本文旨在通过简单的示例介绍如何通过训练模型来自动判断某个新的输入评价是好评 (5 分) 还是差评(1 分), 所以在后续的代码中, 使用的样本就来自于这两类样本的集合(后续有时间的话会继续实现多分类问题)
训练分类器(main.py:step 4-5)
这里使用了 sklearn 中的分类器(LR,SVM, 决策树等等, 最新版本的 sklearn 还提供了 NN 的实现). 具体参考 http://scikit-learn.org/stable/ .
数据的标记十分简单, 将 5 分的训练集标记为 1,1 分的训练集标记为 0 即可(如果实现多分类, 按照分数标记即可.)
其中我把 20% 的训练集抽出作为测试数据:
- train, test, train_label, test_label = ms.train_test_split(
- train_arrays, train_labels, test_size=0.2)
最后进行验证, 一般 > 0.6 就认为是一个有不错预测能力的模型了
新样本预测(prediction.py)
通过加载之前训练的 model 和分类器对测试样本进行预测
同时记录了每一个测试样本最近似的训练样本
后续工作
实现多分类
基于 TF 的 CNN 分类器
来源: https://segmentfault.com/a/1190000012203525