本次实验将加载两个数据,一个是已经标注好的用户评论数据,另外一个是用户评价主题句,通过标注过的用户评论数据进行基于集成模型的情感极性模型训练,然后利用模型对主题句进行情感极性推理,最后通过数据聚合可视化得出主题情感极性。
使用 Pandas 加载在线数据表格,并查看数据维度和前 5 行数据。
数据属性如下表所示
加载我们之前通过主题词典提取出来的主题句。
数据属性如下表所示
用户评论分词
jieba 分词器预热,第一次使用需要加载字典和缓存,通过结果看出返回的是分词的列表。
批量对用户评价进行分词,需要一些时间,并打印第一行情感极性训练集的分词结果。
批量对用户评价主题句进行分词,并打印第一句用户主题句分词结果。
依据统计学模型假设,假设用户评论中的词语之间相互独立,用户评价中的每一个词语都是一个特征,我们直接使用 TF-IDF 对用户评价提取特征,并对提取特征后的用户评价输入分类模型进行分类,将类别输出为积极的概率作为用户极性映射即可。
用户评论向量化
TF-IDF 是一种用于信息检索与数据挖掘的常用加权技术,当某个词在文章中的TF-IDF越大,那么一般而言这个词在这篇文章的重要性会越高,比较适合对用户评论中的关键词进行量化。
数据集合划分
按照训练集 8 成和测试集 2 成的比例对数据集进行划分,并检查划分之后的数据集数量。
我们在系列实验的开始使用朴素贝叶斯模型来训练情感分析模型,下面我们新增逻辑回归模型作为对比模型。逻辑回归(Logistic Regression)是一种用于解决二分类问题的机器学习方法,在线性回归的基础上,套用了一个 sigmod 函数,这个函数将线性结果映射到一个概率区间,并且通常以 05 分界线,这就使得数据的分类结果都趋向于在 0 和 1 两端,将用户评论进行向量化之后也可以用此方式预测用户情感。本实验直接对标注过的用户情感数据进行训练,并验证单一模型和集成模型在情感分析性能上的差异。
模型加载
通过传入原始的标签和预测的标签可以直接将分类器性能进行度量,利用常用的分类模型评价指标对训练好的模型进行模型评价,accuracy_score 评价被正确预测的样本占总样本的比例,Precision 是衡量模型精确率的指标,它是指模型识别出的文档数与识别的文档总数的比率,衡量的是模型的查准率。Recall 召回率也称为敏感度,它是指模型识别出的相关文档数和文档库中所有的相关文档数的比率,衡量的是检索系统的查全率,表示正样本在被正确划分样本中所占的比例,f1_score 值是精确率与召回率的调和平均数,是一个综合性的指数。
我们分别对不同模型使用相同的数据集进行训练和测试,以此来比较单模型之间的差异,并打印模型运行时间供大家参考,批量处理不同的模型需要一些时间进行计算,清耐心等待。
通过求得的指标进行模型评价,我们发现使用相同的数据进行模型训练,朴素贝叶斯模型和逻辑回归模型性能基本持平,相差很微弱,逻辑回归稍稍占一些优势。
Stacking 堆栈模型训练
集成学习是地结合来自两个或多个基本机器学习算法的优势,学习如何最好地结合来自多个性能良好的机器学习模型的预测结果,并作出比集成中的任何一个模型更好的预测。主要分为 Bagging, Boosting 和 Stacking,Stacking 堆栈模型是集成机器学习模型的一种,具体是将训练好的所有基模型对整个训练集进行预测,然后将每个模型输出的预测结果合并为新的特征,并加以训练。主要能降低模型的过拟合风险,提高模型的准确度。
开始对两个模型进行集成训练,训练的时间要比单一模型时间久一些,清耐心等待。
评测结果收集。
结果分析
将结果存入 Dataframe 进行结果分析,lr 表示逻辑回归,nb 表示朴素贝叶斯,model_stacking 将两个单模型集成后的模型。从结果来看集成模型准确度和 f1 值都是最高的,结合两个模型的优势,整体预测性能更好,鲁棒性更好。
样例测试
通过测试样例发现,分类器对正常的积极和消极判断比较好。但是当我们改变语义信息,情感模型则不能进行识别,模型鲁棒性较差。作为早期的文本分类模型,我们使用 TFIDF 的特征提取方式并不能很好的解决语义问题,自然语言是带有语序和语义的关联,其词语之间的关联关系影响整句话的情感极性,后续我们继续试验深度情感分析模型研究解决此类问题。
加载民宿主题数据。
模型预测
将情感分析模型推理的结果写入 DataFrame 中进行聚合。
单主题聚合分析
挑选一个主题进行主题情感分析。
对民宿“设施”进行描述统计,此次我们使用主题词典的出来的用户关于民宿“设施”主体的讨论条数为 4628 条,平均用户情感极性为 040 表示为整体呈现不满意的情况,有超过一半的关于“设施”的民宿评论中表现用户不满意的情况,重庆民宿需要在“设施”进行改善,以此提高用户满意度。
单主题情感极性可视化
我们开始进行“设置”主题下的用户主题情感进行可视化,首先加载画图模块。
对“设施”主题下的用户情感极性进行可视化,我们利用集成模型对主题句进行情感极性预测,如下所示。
本次实验将继续加载两个数据,一个是已经标注好的用户评论数据,另外一个是用户评价主题句,通过标注过的用户评论数据研究不同粒度的用户评价处理对深度情感分析模型的性能的影响,并比较字符级模型在用户评价情感极性推理上的差异。
使用 Pandas 加载已经标注好的在线用户评论情感数据表格,并查看数据维度和前 5 行数据。
加载民宿评论数据,并打印第一行。
数据属性如下表所示
用户评论分词
jieba 分词器预热,第一次使用需要加载字典和缓存,通过结果看出返回的是分词的列表。
批量对用户评价进行分词,并打印第一行数据,处理过程需要一些时间。
将用户评论处理成字符级别,为字符级模型提供训练集,并打印第一行数据,此预处理速度远远快于分词速度。
TextCNN 使用的卷积神经网络是一个典型的空间上的深度神经网络,基于卷积神经网络的情感分析具有优秀的特征抽取能力,能显著降低情感分类中人工抽取特征的难度。这类方法又根据文本嵌入粒度的不同可以分为字符级嵌入和词嵌入两种,一种是以分词后的词为情感分析粒度,另一种为字符级粒度的情感分析粒度,最后一层将包含全文潜在信息的最终编码送入 Sigmoid 做情感强度计算,即可对用户评论进行情感极性推理,是目前在文本分类经常使用的模型。
词级别模型训练
按照训练集 8 成和测试集 2 成的比例对数据集进行划分。
词级 TextCNN 模型训练,设置 128 条数据为一个批次,2 轮模型训练,训练集中的 20% 作为验证集,并加入早停设置。
通过传入原始的标签和预测的标签可以直接将分类器性能进行度量,并对指标收集,包含:模型的训练时间、accuracy_score 表示被正确预测的样本占总样本的比例、f1_score 值表示精确率与召回率的调和平均数和模型标签。
对训练的模型进行加载,并打印网络结构。
设置固定划分数据集,划分比例为 02 即训练集是测试集的 4 倍量。
字符级别模型训练
字符级 TextCNN 模型训练,设置 128 条数据为一个批次,2 轮模型训练,训练集中的 20% 作为验证集,并加入早停设置。
对字符级 TextCNN 的预测结果进行收集。
GRU 属于 RNN(recurrent neural networks,循环神经网络),是 LSTM 最流行的一个变体,比 LSTM 模型要简单,GRU 的门控单元减少了一个,GRU 与 LSTM 一样都是旨在解决标准 RNN 中出现的梯度消失问题,GRU 比 LSTM 在减少了计算量的条件下,做到了精度与 LSTM 持平,是目前在文本分类经常使用的模型。
我们使用函数定义的方式进行 GRU 模型的初始化。
对训练的模型进行加载,并打印网络结构。
词级别模型训练
词级 GRU 模型训练,设置 128 条数据为一个批次,2 轮模型训练,训练集中的 20% 作为验证集,并加入早停设置。
对训练的模型进行加载,并打印网络结构。
字符级别模型训练
将处理好的用户评论数据进行字符级处理即可输入字符级 GRU 模型训练,设置 128 条数据为一个批次,2 轮模型训练,训练集中的 20% 作为验证集,并加入早停设置。
对字符级 GRU 的测试集预测性能进行记录。
模型性能分析
通过控制参数变量的方式进行,并使用同样的数据集合观察性能指数测试结果。字符级能使用较小的字符级词典对语料的覆盖度更高,字符级预处理在测试集上的表现基本接近词级模型,并从耗时来看字符级都是最少的。TextCNN 架构总体高于 GRU 的准确度和综合值,并且训练时间相对较短。字符级语言建模的思想来自于信号处理,使用语言最小的文字单元去模拟复杂的语义关系,因为我们相信模型可以捕捉到这些语法和单词语义信息,在后续我们继续使用这种方式。
对用户评论数据预处理
对用户评论进行字符向量化。
情感极性推理
使用训练好的字符级 TextCNN 对用户评论进行情感预测,需要一些时间,请耐心等待。
使用训练好的字符级 GRU 对用户评论进行情感预测,需要一些时间,请耐心等待。
情感极性推理结果可视化
将两种字符级神经网络情感极性推理模型的结果取出来。
对全量的用户评论分别使用两个模型进行情感极性预测,并进行可视化,我们发现两种模型在全量的用户评论上的表现基本一致,字符级 TextCNN 在用户两极情感极性上表现更好。
语料库指的是一个大型的文本数据集,通常用于语言学研究、自然语言处理和机器学习等领域。根据查询中国科普网显示,这些数据集通常由特定主题、领域或语言的文本组成,例如新闻报道、小说、博客文章、社交媒体帖子等等,研究人员和技术人员可以使用语料库来训练和测试语言模型、机器翻译系统、情感分析工具等等。
http://minieastdaycom/bdmip/180414224336264html
在这篇文章中,主要介绍的内容有:
1、将单词转换为特征向量
2、TF-IDF计算单词关联度
文本的预处理和分词。
如何将单词等分类数据转成为数值格式,以方便我们后面使用机器学习来训练模型。
一、将单词转换为特征向量
词袋模型(bag-of-words model):将文本以数值特征向量的形式来表示。主要通过两个步骤来实现词袋模型:
1、为整个文档集(包含了许多的文档)上的每个单词创建一个唯一的标记。
2、为每个文档构建一个特征向量,主要包含每个单词在文档上的出现次数。
注意:由于每个文档中出现的单词数量只是整个文档集中很少的一部分,因此会有很多的单词没有出现过,就会被标记为0。所以,特征向量中大多数的元素就会为0,就会产生稀疏矩阵。
下面通过sklearn的CountVectorizer来实现一个词袋模型,将文档转换成为特征向量
通过countvocabulary_我们可以看出每个单词所对应的索引位置,每一个句子都是由一个6维的特征向量所组成。其中,第一列的索引为0,对应单词"and","and"在第一和二条句子中没有出现过,所以为0,在第三条句子中出现过一些,所以为1。特征向量中的值也被称为原始词频(raw term frequency)简写为tf(t,d),表示在文档d中词汇t的出现次数。
注意:在上面词袋模型中,我们是使用单个的单词来构建词向量,这样的序列被称为1元组(1-gram)或单元组(unigram)模型。除了一元组以外,我们还可以构建n元组(n-gram)。n元组模型中的n取值与特定的应用场景有关,如在反垃圾邮件中,n的值为3或4的n元组可以获得比较好的效果。下面举例说明一下n元组,如在"the weather is sweet"这句话中,
1元组:"the"、"weather"、"is"、"sweet"。
2元组:"the weather"、"weather is"、"is sweet"。
在sklearn中,可以设置CountVecorizer中的ngram_range参数来构建不同的n元组模型,默认ngram_range=(1,1)。
sklearn通过CountVecorizer构建2元组
二、TF-IDF计算单词关联度
在使用上面的方法来构建词向量的时候可能会遇到一个问题:一个单词在不同类型的文档中都出现,这种类型的单词其实是不具备文档类型的区分能力。我们通过TF-IDF算法来构建词向量,从而来克服这个问题。
词频-逆文档频率(TF-IDF,term frequency-inverse document frequency):tf-idf可以定义为词频×逆文档频率
其中tf(t,d)表示单词t在文档d中的出现次数,idf(t,d)为逆文档频率,计算公式如下
其中,nd表示文档的总数,df(t,d)表示包含单词t的文档d的数量。分母中加入常数1,是为了防止df(t,d)=0的情况,导致分母为0。取log的目的是保证当df(t,d)很小的时候,不会导致idf(t,d)过大。
通过sklearn的TfidfTransformer和CountVectorizer来计算tf-idf
可以发现"is"(第二列)和"the"(第六列),它们在三个句子中都出现过,它们对于文档的分类所提供的信息并不会很多,所以它们的tf-idf的值相对来说都是比较小的。
注意:sklearn中的TfidfTransformer的TF-IDF的计算与我们上面所定义TF-IDF的公式有所不同,sklearn的TF-IDF计算公式
通常在计算TF-IDF之前,会对原始词频tf(t,d)做归一化处理,TfidfTransformer是直接对tf-idf做归一化。TfidfTransformer默认使用L2归一化,它通过与一个未归一化特征向量L2范数的比值,使得返回向量的长度为1,计算公式如下:
下面通过一个例子来说明sklearn中的TfidfTransformer的tf-idf的计算过程,以上面的第一句话"The sun is shining"为例子
1、计算原始词频
a、单词所对应的下标
b、计算第三句话的原始词频tf(t,d)
c、计算逆文档频率idf(t,d)
注意:其他的词在计算tf-idf都是0,因为原始词频为0,所以就不需要计算idf了,log是以自然数e为底。
d、计算tf-idf
所以,第一个句子的tf-idf特征向量为[0,1,129,129,0,1,0]
e、tf-idf的L2归一化
本文可以学习到以下内容:
数据及源码地址: https://giteecom/myrensheng/data_analysis
小凡,用户对耳机商品的评论信息,你有没有什么好的办法分析一下?经理来向小凡请教问题。
嗯,小凡想了一会儿
我想到了两种分析方法:
经理听完,甚是欣慰,便让小凡着手分析用户的评论数据。
数据解释:
小凡使用百度飞浆(paddlepaddle)模型库中的情感分析模型,将评论数据(content)转化为情感类别积极1,消极0
一、window10+anaconda3的安装命令:
二、安装预训练模型应用工具 PaddleHub
可以看到,大约 60% 的用户给出好评
用户的评论内容多集中在配置、音质等主题上
这里使用百度飞浆的LAC分词模型
分析结束后,小凡总结出以下结论:
小凡将结论汇报给经理,和经理一起想出一个可行的方案解决目前存在的问题。
来源 | 雪晴数据网
利用机器学习可以很方便的做情感分析。本篇文章将介绍在R语言中如何利用机器学习方法来做情感分析。在R语言中,由Timothy PJurka开发的情感分析以及更一般的文本挖掘包已经得到了很好的发展。你可以查看下sentiment包以及梦幻般的RTextTools包。实际上,Timothy还写了一个针对低内存下多元Logistic回归(也称最大熵)的R包maxtent。
然而,RTextTools包中不包含朴素贝叶斯方法。e1071包可以很好的执行朴素贝叶斯方法。e1071是TU Wien(维也纳科技大学)统计系的一门课程。这个包的主要开发者是David Meyer。
我们仍然有必要了解文本分析方面的知识。用R语言来处理文本分析已经是公认的事实(详见R语言中的自然语言处理)。tm包算是其中成功的一部分:它是R语言在文本挖掘应用中的一个框架。它在文本清洗(词干提取,删除停用词等)以及将文本转换为词条-文档矩阵(dtm)方面做得很好。这里是对它的一个介绍。文本分析最重要的部分就是得到每个文档的特征向量,其中词语特征最重要的。当然,你也可以将单个词语特征扩展为双词组,三连词,n-连词等。在本篇文章,我们以单个词语特征为例做演示。
注意,在R中用ngram包来处理n-连词。在过去,Rweka包提供了函数来处理它,感兴趣的可以查看这个案例。现在,你可以设置RTextTools包中create_matrix函数的参数ngramLength来实现它。
第一步是读取数据:
创建词条-文档矩阵:
现在,我们可以用这个数据集来训练朴素贝叶斯模型。注意,e1071要求响应变量是数值型或因子型的。我们用下面的方法将字符串型数据转换成因子型:
测试结果准确度:
显然,这个结果跟python得到的结果是相同的(这篇文章是用python得到的结果)。
其它机器学习方法怎样呢?
下面我们使用RTextTools包来处理它。
首先,指定相应的数据:
其次,用多种机器学习算法训练模型:
现在,我们可以使用训练过的模型做测试集分类:
准确性如何呢?
得到模型的结果摘要(特别是结果的有效性):
结果的交叉验证:
结果可在我的Rpub页面找到。可以看到,maxent的准确性跟朴素贝叶斯是一样的,其它方法的结果准确性更差。这是可以理解的,因为我们给的是一个非常小的数据集。扩大训练集后,利用更复杂的方法我们对推文做的情感分析可以得到一个更好的结果。示例演示如下:
推文情感分析
数据来自victornep。victorneo展示的是用python对推文做情感分析。这里,我们用R来处理它:
读取数据:
首先,尝试下朴素贝叶斯
然后,尝试其他方法:
这里,我们也希望得到正式的测试结果。包括:
1analytics@algorithm_summary:包括精确度,召回率,准确率,F-scores的摘要
2analytics@label_summary:类标签摘要
3analytics@document_summary:所有数据和得分的原摘要
4analytics@ensemble_summary:所有 精确度/覆盖度 比值的摘要
现在让我们看看结果:
与朴素贝叶斯方法相比,其它算法的结果更好,召回精度高于095。结果可在Rpub查看
原文链接:http://wwwxueqingcc/cms/article/107
欢迎分享,转载请注明来源:浪漫分享网
评论列表(0条)