接上一篇《【Python数据分析】文本情感分析——电影评论分析(一)》。

目录

  • 文本向量化
    • 词袋模型
    • TF-IDF
  • 建立模型
    • 构建训练集与测试集
    • 特征选择
      • 方差分析
    • 逻辑回归
    • 朴素贝叶斯
  • 总结与改进方向
    • 总结
    • 改进

文本向量化

  文本要进行模型训练,进而判断文本是积极的还是消极,而此时的文本依然是字符串形式,机器学习只能进行数值类型数据的计算,不能完成非数值类型的计算。所以需要把文本转化成数值类型,才能让模型训练学习,而把文本转化为数值的形式就是文本向量化
  文本向量化的步骤:
1、文本分词,拆分成更容易处理的单词。
2、将单词转换为数值类型,即用合适的数值来表示每个单词。

词袋模型

  词袋模型是一种能将文本向量化的方式。在词袋模型中,每个文档为一个样本,在这个例子中每条评论就是一个样本,每个不重复的单词为一个特征,而单词在文档中出现的次数就作为该特征的特征值。

from sklearn.feature_extraction.text import CountVectorizercount = CountVectorizer()
docs = {"Today is Sunday,it is a fine day.","Good Good Study,Day Day Up."
}
bag = count.fit_transform(docs)
#输出的bag是一个稀疏矩阵
print(bag)
#将稀疏矩阵转换为稠密矩阵
print(bag.toarray())
#获取每个特征对应的单词
print(count.get_feature_names())
# 输出单词与编号的对应关系
print(count.vocabulary_)

结果:

  Countvectorizer只会对字符长度不小于2的单词进行处理,如果单词就一个字符,这个单词就会被忽略。
  注意,经过训练后,CountVectorizer就可以对测试集文件进行向量化了,但是向量化出来的特征只是训练集出现的单词特征,如果测试集出现了训练集中没有的单词,就无法在词袋模型中体现了。

TF-IDF

  用CountVectorizer类可以进行文档向量化出来,在向量化过程中将单词的频数作为特征取值,频数越大就认为这个单词越重要?其实这是相对的。就好比你去找工作,期望薪资是2000元,老板给了你4000元,你很高兴的接受了这份工作,但你第二天去上班发现,别的同事都是5000元,这时你就会觉得自己没受到重视,这是什么原因呢?因为,2000元对你自己来说你觉得很多,但是放在其他地方,2000元就不多了。同样的道理,单词的重要程度也不能仅仅从它在一个文档里出现的次数来衡量,还要考虑它在其他文档中出现的次数,如果它在其他文档中出现次数也很多,那这个单词可能就是个大众词汇,它的重要性就会大大降低了。就像每天新闻联播里出现的“中国”、“发展”这些词,频率很高啊,也不能说明它对当前文档很重要,因为这些词又没有特别有意义的信息。
  TF-IDF就是用来调整单词在文档中的权重的:
TF(Term-Frequency):词频,单词在文档中出现的次数。
IDF(Inverse Document——frequency):逆文档频率。
计算公式:

t:某个单词:
n:语料库中文档的总数;
df(t):语料库中含有单词t的文档个数。
  scikit-learn库中的tf-idf转换与标准公式稍微不同,而且tf-idf结果会用L1或L2范数进行标准化。

from sklearn.feature_extraction.text import TfidfTransformercount = CountVectorizer()
docs = {"Where there is a river,there is a city.","There is no royal road to learning"
}
bag = count.fit_transform(docs)
tfidf = TfidfTransformer()
t = tfidf.fit_transform(bag)
print(t.toarray())

结果:

   scikit-learn中的TfidfVectorizer类可以直接将文档转换为TF-IDF值,这个类相当于继承了CountVectorizer与TfidTransformer两个类的功能。

from sklearn.feature_extraction.text import TfidfVectorizerdocs = {"Where there is a river,there is a city.","There is no royal road to learning"
}
tfidf = TfidfVectorizer()
t = tfidf.fit_transform(docs)
print(t.toarray())

结果:
   两种方法的值是一样的。

建立模型

构建训练集与测试集

   #目前词汇是以列表类型呈现的,因为文本向量化需要传递空格分开的字符串数组类型,现在需要将每条评论的词汇组合在一起,成为字符串类型,用空格隔开。

def join(text_list):return " ".join(text_list)data['comment'] = data['comment'].apply(join)

结果:
   构造目标列,好评为2,中评为1,差评为0

data['target'] = np.where(data['score'] >=4.5, 2,np.where(data['score'] >=3,1,0))
data['target'].value_counts()

结果:

   可以看出,样本分布悬殊大,好评数与其他两个评论的数量不在一个数量级。
   对于样本分布不均衡,可采用上采样、下采样、混合采样等方法,这里用下采样的方式。

p = data[data['target'] == 2]
m = data[data['target'] == 1]
n = data[data['target'] == 0]
p = p.sample(len(m))
m = m.sample(len(m))
data2 = pd.concat([p,m,n],axis=0)
data2['target'].value_counts()

结果:

   构建训练集和测试集。

from sklearn.model_selection import train_test_splitX = data2['comment']
y = data2['target']
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.25)
print('训练集样本数:',X_train.shape[0],'测试集样本数',X_test.shape[0])

结果:

特征选择

vec = TfidfVectorizer(ngram_range=(1,2),max_df=0.5,min_df=1)
X_train_trans = vec.fit_transform(X_train)
X_test_trans = vec.fit_transform(X_test)
display(X_train_trans,X_test_trans)

结果:总共有21.36万个特征。
   ngram_range:考虑一个词和两个词的顺序,即两个连着的词也会统计考虑,比如“武松打虎”和“虎打武松”,两句话语义完全相反但向量化都是一样的结果即“武松”、“打”、“虎”,此时需要考虑词的顺序,即“武松”、“打”、“武松打”、“虎”、“打虎”都会被考虑。据经验,考虑3个连词和2个连词的效果差不多,但是取3个连词的特征量会比取2个连词的多得多;
   max_df:含有某个单词的最大文档数百分比,如果大于这个频率,这个词就不要了,就是删除太大众化的词;
   min_df:含有某个单词的最小文档数,如果小于这个数,这个词就不要了,就是删除太小众化的词。

方差分析

   并不是所有的特征都对建模有帮助,所以在建模前要进行特征选择。这里用方差分析-ANOVA来进行特征选择,选择与目标分类变量最相关的2万个特征。
   方差分析是用来分析两个或多个样本(来自不同总体)的均值是否相等,进而可以检验分类变量与联系变量之间是否相关。根据分类变量的不同取值将样本分组,计算组内差异(SSE)和组间差异(SSM)。
   F统计量:

m:组的数量;n:观测值的数量。
   组内差异来自采样的影响,组间差异来自采样影响和分组影响。所以,组间差异大于等于组内差异。如果不同的类别,没有影响到同一个单词的特征值不同,那就意味着组间差异几乎是没有的,此时的F值近似于1;如果组间差异很大,F值就大于1,组间差异越大,F值越大于1。所以F的值就能表示一个单词在不同组中的影响
   该统计量服从自由度为(m-1,n-m)的F分布,F检验的原假设为各种均值相等,备择假设为至少存在两组数据均值不相等。均值相等,即这个单词在每个分组表现得都差不多,也就是这个单词对分类没影响。

from sklearn.feature_selection import f_classif#根据y进行分组,计算X中每个特征的F值和P值,F值越大,P越小
f_classif(X_train_trans,y_train)

结果:F值越大,P值越小

   需要选取影响最大的20000万特征

from sklearn.feature_selection import SelectKBest#tf-idf值精度不用太高,使用32位的浮点数表示,节省存储空间
X_train_trans = X_train_trans.astype(np.float32)
X_test_trans = X_test_trans.astype(np.float32)
#定义特征选择器,用来选择最好的k个特征
selector = SelectKBest(f_classif,k=min(20000,X_train_trans.shape[1]))
selector.fit(X_train_trans,y_train)
#对训练集和测试集进行特征选择
X_train_trans = selector.transform(X_train_trans)
selector.fit(X_test_trans,y_test)
X_test_trans = selector.transform(X_test_trans)
print(X_train_trans.shape,X_test_trans.shape)

结果:(59294, 20000) (19765, 20000)

逻辑回归

from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_reportlr = LogisticRegression(class_weight='balanced',multi_class='ovr',solver='sag')
lr.fit(X_train_trans,y_train)
y_hat = lr.predict(X_test_trans)
print(classification_report(y_test,y_hat))

  由于样本并不那么均衡,用balanced调节权重,根据样本数量调节权重,数量越多权重越小。
  优化方式选择平均梯度下降的方式。

结果:

朴素贝叶斯

from sklearn.naive_bayes import ComplementNBgnb = ComplementNB()
gnb.fit(X_train_trans,y_train)
y_hat = gnb.predict(X_test_trans)
print(classification_report(y_test,y_hat))

结果:

总结与改进方向

总结

   这两篇博文主要总结了文本数据预处理方法,个性化词云图的生成,文本向量化,利用方差分析实现特征值的选择。选择的两种模型效果都不好。

改进

   选择的两种方法结果都差不多,效果都不好,不知道是预处理没做好还是特征选择没做好,如果前面都没错,是模型问题的话,可以从以下几个方向改进:
   1.调整算法中的超参数。
   2.尝试其他分类算法。
   3.用其他方式来应对样本不均衡问题。

【Python数据分析】文本情感分析——电影评论分析(二)相关推荐

  1. 【Python数据分析】文本情感分析——电影评论分析(一)

      情感分析是文本分析的一种,它能够从一段文本描述中理解文本的感情色彩,是褒义.贬义还是中性.常见的情感分析的使用场景就是客户对商品或服务的评价.反馈,传统模式下的人工审核,不仅消耗大量人力,而且效率 ...

  2. python中文文本情感分析

    目录 python中文文本情感分析 导语 训练模型保存并测试正确率 使用保存的模型 python中文文本情感分析 导语 要做一个项目要用到中文文本情感分析,查找了多种资料,在网上看了很多博客后,终于完 ...

  3. Python数据分析实战:降雨量统计分析报告分析

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 以下文章来源于菜J学Python ,作者小小明 最近遇到一个有点烧脑的需求,其实也不算烧pytho ...

  4. Python数据分析大作业 4000+字 图文分析文档 销售分析

    资源地址:Python数据分析大作业 4000+字 图文分析文档 销售分析 +完整python代码 数据来自某商场,具体商业数据保密 资源地址:Python数据分析大作业 4000+字 图文分析文档 ...

  5. Python爬虫爬取豆瓣电影评论内容,评论时间和评论人

    Python爬虫爬取豆瓣电影评论内容,评论时间和评论人 我们可以看到影评比较长,需要展开才能完整显示.但是在网页源码中是没有显示完整影评的.所以我们考虑到这部分应该是异步加载的方式显示.所以打开网页的 ...

  6. 机器学习-文本处理之电影评论多分类情感分析

    一.背景 文本处理是许多ML应用程序中最常见的任务之一.以下是此类应用的一些示例 语言翻译:将句子从一种语言翻译成另一种语言 情绪分析:从文本语料库中确定对任何主题或产品等的情绪是积极的.消极的还是中 ...

  7. 情感分析之电影评论分析-基于Tensorflow的LSTM

    1. 深度学习在自然语言处理中的应用 自然语言处理是教会机器如何去处理或者读懂人类语言的系统,目前比较热门的方向,包括如下几类: 对话系统 - 比较著名的案例有:Siri,Alexa 和 Cortan ...

  8. python 文本分析库_快速使用Python进行文本情感分析

    文本情感分析是自然语言处理的一个重要部分,与语音情感分析类似,通过处理提取给定文本中的信息来衡量说话者/作者的态度和情绪,主要用于电影.商品以及社交媒体的用户评论分析等. VADER是一个基于词典和规 ...

  9. python英文文本情感分析_舆情信息浩如烟海?看看如何用Python进行英文文本的情感分析...

    市场每天都在生成海量的舆情信息,这些信息可以帮助我们识别市场情绪的转变.如果只是人工地去跟踪大量的舆论和研报显然缺乏效率.我们可以试试让机器来完成这个工作. 数据科学在数值领域中很常见,但这个不断壮大 ...

最新文章

  1. 拜托!不要用“ ! = null 做判空了
  2. Wt::WPaintDevice
  3. linux io函数,Linux下普通IO文件操作函数---C语言
  4. [Effective JavaScript 笔记]第29条:避免使用非标准的栈检查属性
  5. 一个Objective-C对象如何进行内存布局?(考虑有父类的情况)
  6. java 永久代_Java新生代、老生代和永久代详解
  7. 无限踩坑系列(6)-mySQL数据库链接错误
  8. as3:sprite作为容器使用时,最好不要指定width,height
  9. 【AI视野·今日CV 计算机视觉论文速览 第180期】Wed, 26 Feb 2020
  10. Hibernate 原汁原味的四种抓取策略(转)
  11. es6 Class的严格模式
  12. Mybatis集成日志与ehcache
  13. 华为云发布国内首个 AI 模型市场,加速企业 AI 应用落地
  14. netdevice - 底层访问 Linux 网络设备
  15. int、String、char、Array之间的转换,这一篇够了!!!
  16. 西门子1200fb284
  17. 计算机无法进入pe系统,u盘启动盘无法进入pe解决方法
  18. Android锁屏下弹窗的尝试,android开发实战我的云音乐
  19. php belongsto,php-Laravel:belongsTo()关系假定一对多关系,而不是一对一关系
  20. 华硕天选2和华硕天选3哪个好 华硕天选2和华硕天选3区别

热门文章

  1. 无锡室内设计——紫色匹配策略
  2. pppoe linux 配置文件,arm-linux配置pppoe
  3. 浏览器 模仿QQ聊天 对话框
  4. 微软新闻组服务器是什么,NNTP(网络新闻组传输协议)——新闻组服务器
  5. Sushi 的一周:五月 Miso,银座寿司店接受 SUSHI 支付,上线 Gemini | 2021.4.26-5.2
  6. 树莓派官方摄像头调焦
  7. 大数据分析实验二:金融中的时间序列数据处理
  8. dubbo SPI使用:@SPI 与 @Adaptive
  9. 后疫情时代,医疗产业的第三次革命
  10. Linux-更改终端字体大小