8.2.1 基于text2vec包的文本情感分析
下面以text2vec包提供的影评数据为例,对5 000条电影评论进行情感分析(评论正面或者负面)。
1.准备工作
首先加载text2vec包:
2.数据准备
使用data.table包读取text2vec包自带的电影评论数据集:
将id设置为数据“主键”:
使用set.seed()函数设定随机数,将数据划分为测试集和训练集。随机数的设定在于重现随机划分的测试集和训练集:
3.文档向量化
文档向量化的目的是构建文档-词频矩阵,该矩阵包含不同文档、不同词出现的次数。文档-词频矩阵是稀疏矩阵,矩阵的表达有两种方式:一种是n-grams;另外一种就是Hashing化。
首先使用itoken()函数设置分词迭代器:
其中,tok_fun代表分词器,指定了词语划分的程度,是否需要标点等;tolower代表英文字符统一变成小写。
接下来进行分词,创建词典。因为案例是英文的,所以分词的设置相较于jiebaR包更加简单,对应代码如下:
在分词时也可以设置停用词典,消除停用词,代码如下:
然后使用vocab_vectorizer()函数加载vocab对象,生成语料文件对象:
使用语料文件构建DTM矩阵:
需要注意的是,最后生成的文档顺序必须和ID一一对应,因为在操作过程中生成的DTM文档顺序会发生改变。identical()是检验两个值是否完全相等的函数,若相等,则返回TRUE,具体代码如下:
4.基于logistics的情感标注
logistics是一种经典的、解释性比较强的机器学习算法。一般情况下,我们运用glmnet包中的binomial()函数族进行logistic的情感标注。此处应用glmnet包中的binomial()函数调用logistics算法完成文本的情感分类,同时,通过设置alpha=1给出L1惩罚项参数。
首先加载glmnet包:
设置交叉验证的次数为4,进行logistic的情感标注:
glmnet_classifier是图形对象,可以使用plot()函数将其绘制出来,代码如下(结果如图8-3所示):
图8-3 基于logistics的情感标注结果图
然后使用测试集验证模型的准确性: