自然语言处理-情感分析

1 实验介绍

1.1 关于本实验

本实验介绍了情感分析的基本概念,了解基于情感词典的文本西配算法,然后介绍了Gensim库实现LDA算法,重点介绍了textblob和snownlp两个库。textblob用于英文文本的情感分析,textblob用于中文文本的情感分析。最后,对小说人物和电影影评进行了情感分析。

1.2 实验目的

了解情感分析的基本概念及其常用研究方法;了解基于情感词典的文本匹配算法;掌握textblob库和SnowNLP库的使用。理解LDA模型的原理;掌握Gensim的应用。

2 概述

2.1 认识情感分析

情感分析(Sentiment Analysis)又称为意见挖据、倾向性分析等,对情感倾向性(喜、怒、哀、乐和批评、赞扬等)的文本进行分析、处理、归钠和推理,生成评论摘要,抽取情感标签等。自2000年年初以来,情感分析成为自然语言处理中最活跃的研究领城之一。

情感评论的文本往往具有以下特点。

(1)文本短,很多评论就是一句话。

(2)情感倾向明显,如“好”“可以”“漂亮”。

(3)语言不规范,会出现网路用同、符号、数字等,如“666“神器”。

(4)重复性大,一句话中出现多次词语重复,如“很好,很好,很好”。

情感分析具有有监督和无监督两种研究方法,早期的有监督学习是指通过支持向量机、最大熵、朴素贝叶斯等实现,无监督学习是指基于词典、语义分析等方法实现。近年来,深度学习使得情感分析在分类回旧任务中效果较好,特别是神经网络在情感分析中的应用成为研究的热点。

2.2 基于词典方法

基于情感词典的情感分析方法的主要思路如下:对文档分词,找出文档中的情感词、否定词以及程度副词,判断每个情感词之前是否有否定词及程度副词,与其划分为一组,将情感词的情感权值乘以-1或者乘以程度副词的程度值,将所有组得分累加,若总分大干0,则为积极情感;反之为消极情感。

基于同典方法的大致流程如下。

(1)数据获取,包括数据爬虫、数据集等。

(2)数据预处理,包括数据清洗、数据标准化等。

(3)词表建构,包括中文分词、停止词处理、词性标注等。

(4)情感分类,利用情感词典对文本进行字符串匹配,挖掘正面和负面情感信息,进行分类。

3 情感倾向分析

文本为“这手机的画面极好,操作也比较流畅。不过拍照真的太烂了!系统也不好。“下面对此文本进行情感倾向分析。

3.1 情感词

情感倾向分析中最简单最基础的方法就是识别文本中的情感词,积极情感词分值加1;消极情感词分值减1。文本中有“好”“流畅”两个积极情感词,“烂”一个消极情感词,其中“好”出现了两次,句子的情感分值就是1+1-1+1=2。

3.2 程度词

不同的程度词权值不同,如“极”“无比”“太”等程度词的权值乘4;“较”“还算”等程度词权值乘2,“只算”“仅仅”等程度词权值乘0.5。文本中的情感词“好”“流畅”和“烂”前面都有一个程度词,根据程度词的不同权值,文本的情感分值就是1×4+1×2-1×4+1=3。

3.3 感叹号

感叹号用于句尾,表示惊叹等强烈情感,确定叹号可以为情感值加2(正面)或减2(负面)。文中“太烂了”后面有感叹号,情感分值为4×1+1×2-1×4-2-1=-1。

3.4 否定词

否定词“不”“不能”“非”“否”等词语使得积极情感变成消极情感,或者使得消极情感变成积极情感。如果情感词的前面存在否定词,需要确定否定词出现的次数,单数则情感分值乘以-1,偶数则情感保留原来分值。文中的“好”前面只有一个“不”,所以“好"的情感值乘以-1。文本的情感分值为4×1+1×2-1×4-2+1×(-1)=-1。

4 Textblob

Textblob是用Python编写的开源文本处理库,执行自然语言处理任务。例如,词性标往、名词性成分挑取、情感分析、文本翻译等。textblob官网如下:https://textblob.readthedocs.io/en/dev/。

使用命令pip install -U textblob安装textblob。

textblob语料库的配置命令为:python -m textbiob.download_corpora。

引入textblob,命令如下:

from textblob import Textblob

4.1分句分词

textblob提供sentences和words方法进行分句和分词

【任务1】分句和分词举例

import nltk
nltk.data.path.append("./nltk_data")
from textblob import TextBlob
testimonial=TextBlob ("Now I will introduce myself briefly.My name is YuanzheZhou.I was born in xi'an city,Shaannxi province.I am now a computer teacher in xi'an University of Posts and Telecommunications.")
print(testimonial.sentences)
print (testimonial.words)

程序运行结果如下:

[Sentence(“Now I will introduce myself briefly.My name is YuanzheZhou.I was born in xi’an city,Shaannxi province.I am now a computer teacher in xi’an University of Posts and Telecommunications.”)]
[‘Now’, ‘I’, ‘will’, ‘introduce’, ‘myself’, ‘briefly.My’, ‘name’, ‘is’, ‘YuanzheZhou.I’, ‘was’, ‘born’, ‘in’, “xi’an”, ‘city’, ‘Shaannxi’, ‘province.I’, ‘am’, ‘now’, ‘a’, ‘computer’, ‘teacher’, ‘in’, “xi’an”, ‘University’, ‘of’, ‘Posts’, ‘and’, ‘Telecommunications’]

4.2 词性标注

词性标注给每个词语标注词类标签(如形容词、动词、名词等)。textblob提供tags方法进行词性标注。

【任务2】词性标注

import jieba.posseg as psg 
sent = "Python is a high-level,general-purpose programming language."
for w, t in psg.cut(sent):
    print(w,'/',t)

程序运行结果如下:

Python / eng
  / x
is / eng
  / x
a / x
  / x
high / eng
- / x
level / eng
, / x
general / eng
- / x
purpose / eng
  / x
programming / eng
  / x
language / eng
. / m

4.3 情感分析

textblob提供sentiment方法进行情感分析,返回元组Sentiment(polarity,subjectivity)。其中,polarity得分为[-1.0,1.0],靠近-1.0表示消极,靠近1.0表示积极。subjectivity得分为[0.0,1.0],靠近0.0表示客观,靠近1.0表示主观。

【任务3】情感分析

text ="I feel sad today"
from textblob import TextBlob
blob =TextBlob(text)
blob.sentences[0].sentiment

程序运行结果如下:

Sentiment(polarity=-0.5, subjectivity=1.0)

4.4 单复数

textblob提供singularize()方法将名词的复数变为单数,pluralize()方法将单数变为复数。

【任务4】单复数转换

sentence =TextBlob('Use 4 spaces per indentation level.')
sentence.words[2].singularize()
sentence.words[-1].pluralize()

程序运行结果如下:

‘levels’

4.5 拼写校正

textblob提供correct()方法进行拼写校正。

【任务5】拼写校正

from textblob import TextBlob
b=TextBlob("I havv goood speling!")
print (b.correct ())

程序运行结果如下:

I have good spelling!

4.6 词频统计

textblob提供word_counts()方法进行单词词频的统计。

【任务6】词频统计

from textblob import TextBlob
text =TextBlob("I am a boy,I am a student")
count=text.word_counts['am']
countl=text.word_counts['boy']
print(count)
print(countl)

程序运行结果如下:

2

1

5 SnowNLP

SnowNLP是处理中文情感分析的类库,其安装命令为pip install snownlp。

引入SnowNLP,命令如下。

from snownlp import SnowNLP

5.1 分词

SnowNLP提供words方法给出每句文本的分词序列。

【任务7】分词

from snownlp import SnowNLP
text='我来到北京清华大学'
s=SnowNLP(text)
print(s.words)

程序运行结果如下:

[‘我’, ‘来到’, ‘北京’, ‘清华大学’]

5.2 词性标注

SnowNLP提供tags方法给出每个词的词性。

【任务8】词性标注

from snownlp import SnowNLP
s=SnowNLP(u'这个东西真心很赞')              #引号前面的字母u,表示文本是Unicode编码格式
tags =[x for x in s.tags]
print(tags)

程序运行结果如下。

[(‘这个’, ‘r’), (‘东西’, ‘n’), (‘真心’, ‘d’), (‘很’, ‘d’), (‘赞’, ‘Vg’)]

5.3 断句

SnowNLP提供sentences方法给出篇章的断句。

【任务9】断句

from snownlp import SnowNLP
text =u'''
自然语言处理是计算机科学领域与人工智能领域中的一个重要方向.
它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法,
自然语言处理是一门融语言学、计算机科学、数学于一体的科学。
因此,这一领域的研究将涉及自然语言,即人们日常使用的语言,
所以它与语言学的研究有着密切的联系,但又有重要的区别。
自然语言处理并不是一限地研究自然语言,
而在于研制能有效地实现自然语言通信的计算机系统,
特别是其中的软件系统。因而它是计算机科学的一部分
'''
s =SnowNLP(text)
print(s.sentences)

程序运行结果如下:

[‘自然语言处理是计算机科学领域与人工智能领域中的一个重要方向.’, ‘它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法,’, ‘自然语言处理是一门融语言学、计算机科学、数学于一体的科学’, ‘因此,这一领域的研究将涉及自然语言,即人们日常使用的语言,’, ‘所以它与语言学的研究有着密切的联系,但又有重要的区别’, ‘自然语言处理并不是一限地研究自然语言,’, ‘而在于研制能有效地实现自然语言通信的计算机系统,’, ‘特别是其中的软件系统’, ‘因而它是计算机科学的一部分’]

5.4 情绪判断

SnowNLP提供sentiments方法给出每句话的情绪判断,其返回值为正面情绪的概率,越接近1表示正面情绪越强烈,越接近0表示负面情绪越强烈。

【任务10】情绪判断

from snownlp import SnowNLP
text1='这部电影真心棒,全程无尿点'
text2='这部电影简直烂到爆'
s1 =SnowNLP(text1)
s2 =SnowNLP(text2)
print(text1,s1.sentiments)
print(text2,s2.sentiments)

程序运行结果如下:

这部电影真心棒,全程无尿点 0.9842572323704297
这部电影简直烂到爆 0.0566960891729531

5.5 拼音

SnowNLP提供pinyin方法给出每个汉字的拼音。

【任务11】拼音

from snownlp import SnowNLP
s=SnowNLP(u'这个东西真心很费')
print(s.pinyin)

程序运行结果如下:

[‘zhe’, ‘ge’, ‘dong’, ‘xi’, ‘zhen’, ‘xin’, ‘hen’, ‘fei’]

5.6 繁转简

SnowNLP提供han方法用于繁体字转为简体字。

【任务12】繁体字转为简体字

from snownlp import SnowNLP
s=SnowNLP(u'「繁體字」「繁體中文」的叫法在臺灣亦很常見。')
print (s.han)

程序运行结果如下:

「繁体字」「繁体中文」的叫法在台湾亦很常见。

5.7 关键字抽取

SnowNLP提供keywords方法抽取中文篇章的关键字。

【任务13】关键字抽取

from snownlp import SnowNLP
text=u'''自然语言处理是计算机科学领域与人工智能领域中的一个重要方向。它研究能实现人
与计算机之间用自然语言进行有效通信的各种理论和方法。自然语言处理是一门融语言学、计算机
科学、数学于一体的科学。因此,这一领城的研究将涉及自然语言,即人们日常使用的语言,所以它
与语言学的研究有着密切的联系,但又有重要的区别。自然语言处理并不是一般地研究自然语言,
而在于研制能有效地实现自然语言通信的计算机系统,特别是其中的软件系统。因而它是计算机科
学的一部分。'''
s=SnowNLP(text)
print(s.keywords(limit=10))

程序运行结果如下:

[‘语言’, ‘自然’, ‘计算机’, ‘研究’, ‘通信’, ‘领域’, ‘科学’, ‘智能’, ‘人工’, ‘系统’]

5.8 摘要抽取

SnowNLP提供summary方法抽取篇章的摘要。

【任务14】摘要抽取

from snownlp import SnowNLP
text =u'''自然语言处理是计算机科学领域与人工智能领域中的一个重要方向。它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法。自然语言处理是一门融语言学、计算机科学、数学于一体的科学。因此,这一领城的研究将涉及自然语言,即人们日常使用的语言,所以它与语言学的研究有着密切的联系,但又有重要的区别。自然语言处理并不是一般地研究自然语言,而在于研制能有效地实现自然语言通信的计算机系统,特别是其中的软件系统。因而它是计算机科学的一部分。'''
s=SnowNLP(text)
print(s.summary(limit=4))

程序运行结果如下:

[‘自然语言处理并不是一般地研究自然语言,而在于研制能有效地实现自然语言通信的计算机系统,特别是其中的软件系统’, ‘自然语言处理是一门融语言学、计算机科学、数学于一体的科学’, ‘它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法’, ‘自然语言处理是计算机科学领域与人工智能领域中的一个重要方向’]

5.9 词频和逆文档词频

SnowNLP提供tf和idf方法统计词频和逆文档词频。

【任务15】词频和逆文档词频统计

from snownlp import SnowNLP
s =SnowNLP([
    ['性格','善良'],
    ['温柔','善良','善良'],
    ['温柔','善良'],
    ['好人'],
    ['性格','善良'],
])
print(s.tf)
print(s.idf)

程序运行结果如下:

[{‘性格’: 1, ‘善良’: 1}, {‘温柔’: 1, ‘善良’: 2}, {‘温柔’: 1, ‘善良’: 1}, {‘好人’: 1}, {‘性格’: 1, ‘善良’: 1}]
{‘性格’: 0.33647223662121295, ‘善良’: -1.0986122886681098, ‘温柔’: 0.33647223662121295, ‘好人’: 1.0986122886681098}

6 Gensim

6.1 认识Gensim

Gensim是一款开源的第三方Python工具包,用于抽取文档的语义主题。Gensim支持包括TF-IDF、word2vec、潜在语义分析(Latent Semantic Analysis,LSA)、潜在狄利克雷分布(Latent Dirichlet Allocation,LDA)等主题模型算法,支持流式训练,并提供了诸如相似度计算、信息检索等一些常用任务的API接口。

安装Gensim使用命令pip install gensim,如图l5-5所示。

Gensim是一个通过衡量词组(如整句或文档)模式来挖掘文档语义结构的工具,具有如下三大核心概念:文集(语料)、向量和模型。

(1)语料(Corpus):一组原始文本的集合。Gensim会从文本中推断出结构、主题等,通常是一个可迭代的对象(如列表)。

(2)向量(Vector):由一组文本特征构成的列表,是一段文本在Gensim中的内部表达。向量中的每一个元素是一个(key,value)的元组。

(3)模型(Model):定义了两个向量空间的变换。

1.语料

from gensim import corpora
import jieba
documents=['工业互联网平台的核心技术是什么',
           '工业现场生产过程优化场景有哪些']
def word_cut(doc):
    seg=[jieba.lcut (w)for w in doc]
    return seg
texts=word_cut(documents)
#为语料库中出现的所有单词分配了一个唯一的整数1d
dictionary =corpora.Dictionary(texts)
print(dictionary.token2id)

程序运行结果如下:

{‘互联网’: 0, ‘什么’: 1, ‘工业’: 2, ‘平台’: 3, ‘是’: 4, ‘核心技术’: 5, ‘的’: 6, ‘优化’: 7, ‘哪些’: 8, ‘场景’: 9, ‘有’: 10, ‘现场’: 11, ‘生产’: 12, ‘过程’: 13}

2.向量

bow_corpus =[dictionary.doc2bow(text)for text in texts]
print(bow_corpus)

程序运行结果如下:

[[(0, 1), (1, 1), (2, 1), (3, 1), (4, 1), (5, 1), (6, 1)], [(2, 1), (7, 1), (8, 1), (9, 1), (10, 1), (11, 1), (12, 1), (13, 1)]]

##函数doc2bow()只计算单同的出现次数,将单词转换为整数单词id,并将结果作为稀疏向量返回。

##每个元组的第一项对应词典中符号的ID,第二项对应该符号出现的次数。

3.模型

from gensim import models
#模型训练
tfidf =models.TfidfModel (bow_corpus)
print(tfidf)

程序运行结果如下:

TfidfModel<num_docs=2, num_nnz=15>

6.2 认识LDA

LDA(Latent Dirichlet Allocation,潜在狄利克雷分布)是概率生成模型的一个典型代表,也将其称为LDA主题模型,在文本主题识别、文本分类以及文本相似度计算方面广泛应用。生成模型是指一篇文章的每个词可通过“以一定概率选择某个主题,并从这个主题中以一定概率选择某个词语”的过程。“主题”就是一个文本所蕴含的中心思想,一个文本可以有一个或多个主题。主题是关键词集合,同一个词在不同的主题背景下,出现的概率不同,如出现“林丹”名字的文章,很大概率属于体育主题,但也有小概率属于娱乐主题。

LDA把文章看作词汇的组合,不同词汇的概率分布反映不同的主题。假设《体育快讯》和《经济周报》两篇文章共有三个主题“体育”“娱乐”“经济”。《体育快讯》的词汇分布概率会是{体育:0.7,经济:0.2,娱乐:0.1},而《经济周报》的词汇分布概率会是{体育:0.2,经济:0.7,娱乐:0.1}。

6.3 Gensim实现LDA

【任务16】Gensim实现LDA

from gensim import corpora,models
import jieba.posseg as jp,jieba
#文本集
texts =[
    '美国女排没输给中国女排,是输给了郎平',
    '为什么越来越多的人买MPV,而放弃SUV?跑一趟长途就知道了',
    '美国排球无缘世锦赛决赛,听听主教练的评价',
    '中国女排晋级世锦赛决赛,全面解析主教练郎平的执教艺术',
    '跑了长途才知道,SUV和轿车之间的差距',
    '家用的轿车买什么好']
print("文本内容:")
print(texts)
flags =('n','nr','ns','nt','eng','v','d')     #词性
stopwords =('没','就','知道','是','才','听听','坦言','全面','越来越','评价','放弃','人')
words_ls =[]
for text in texts:
    words =[word.word for word in jp.cut(text) if word.flag in flags and word.word not in stopwords]
    words_ls.append(words)
#分词过程,然后每句话/每段话构成一个单词的列表
print("分词结果:")
print(words_ls)
#去重,存到字典
dictionary =corpora.Dictionary(words_ls)
#print(dictionary)
corpus =[dictionary.doc2bow(words) for words in words_ls]
#按照(词ID:词频)构成corpus
print("语料为词ID:词频")
print (corpus)
#设置了num_topics=2两个主题,第一个是汽车相关主题,第二个是体有相关主题
print("两个主题:汽车和体育")
lda =models.ldamodel.LdaModel(corpus=corpus,id2word=dictionary,num_topics=2)
#for topic in lda.print_topics(num_words=4):
#print(topic)
print(lda.inference(corpus))
text5 ='中国女排向三连冠发起冲击'
bow =dictionary.doc2bow ([word.word for word in jp.cut (text5) if word.flag in flags and word.word not in stopwords])
ndarray =lda.inference([bow])[0]
print(text5)
for e, value in enumerate(ndarray[0]):
    print('\t主题%d推断值%.2f'%(e,value))

程序运行结果如下:

文本内容:
[‘美国女排没输给中国女排,是输给了郎平’, ‘为什么越来越多的人买MPV,而放弃SUV?跑一趟长途就知道了’, ‘美国排球无缘世锦赛决赛,听听主教练的评价’, ‘中国女排晋级世锦赛决赛,全面解析主教练郎平的执教艺术’, ‘跑了长途才知道,SUV和轿车之间的差距’, ‘家用的轿车买什么好’]
分词结果:
[[‘美国’, ‘女排’, ‘输给’, ‘中国女排’, ‘输给’, ‘郎平’], [‘买’, ‘MPV’, ‘SUV’, ‘跑’, ‘长途’], [‘美国’, ‘排球’, ‘无缘’, ‘世锦赛’, ‘决赛’, ‘主教练’], [‘中国女排’, ‘晋级’, ‘世锦赛’, ‘决赛’, ‘主教练’, ‘郎平’, ‘执教’, ‘艺术’], [‘跑’, ‘长途’, ‘SUV’, ‘轿车’, ‘差距’], [‘家用’, ‘轿车’, ‘买’]]
语料为词ID:词频
[[(0, 1), (1, 1), (2, 1), (3, 2), (4, 1)], [(5, 1), (6, 1), (7, 1), (8, 1), (9, 1)], [(2, 1), (10, 1), (11, 1), (12, 1), (13, 1), (14, 1)], [(0, 1), (4, 1), (10, 1), (11, 1), (12, 1), (15, 1), (16, 1), (17, 1)], [(6, 1), (8, 1), (9, 1), (18, 1), (19, 1)], [(7, 1), (19, 1), (20, 1)]]
两个主题:汽车和体育
(array([[6.4684505 , 0.5315354 ],
[0.5231359 , 5.476854 ],
[6.44224 , 0.5577414 ],
[8.465717 , 0.5342603 ],
[0.5226643 , 5.4773254 ],
[0.53823817, 3.4617538 ]], dtype=float32), None)
中国女排向三连冠发起冲击
主题0推断值1.48
主题1推断值0.52

7 小说人物情感分析

莫泊桑的著名小说《我的叔叔于勒》有非常明显的情绪变化,主人公一家起先对叔叔于勒持有积极态度,但后来转变为厌恶。利用SnowNLP对小说进行逐段分析,观察情感值是否会像预期一样,先高后低。

程序具体步骤如下:

步骤1:使用SnowNLP对小说逐段进行情感分析评分。

步骤2:使用Matplotlib将情感分析评分以散点图的形式进行数据可视化。

【任务17】情感分析和散点图举例

from snownlp import SnowNLP
source = open("./data.txt","r", encoding='utf-8')    #《我的叔叔于勒》保存data.txt中
line = source.readlines()

# 对文中的每一段进行情感倾向分析
senti = []
for i in line:
    s = SnowNLP(i)
    #print(s.sentiments)       #输出每段文字的情绪
    senti.append(s.sentiments)

# 取横坐标为段落编号,纵坐标为分值,画成散点图
import matplotlib.pyplot as plt 
import numpy as np
x = np.array(range(len(senti)))
y = np.array(senti)
plt.scatter(x,y)
plt.show()

程序运行结果如下:

在这里插入图片描述

程序运行结果如上图所示,横坐标为段落编号,纵坐标为分值。随着小说情节的展开,最初的大部分数据靠近1,说明主人公对于叔叔于勒持有积极态度,其后数据远离1,说明态度转为厌恶。

8 电影影评情感分析

8.1 流程

采用SnowNLP对《天气之子》影评进行情感分析,具体步骤如下。

步骤1:采用requests对豆瓣的天气之子的评论进行爬取。

步骤2:采用jieba进行分词,消除停止词stopwords的影响。

步骤3:使用SnowNLP对电影评论进行逐个情感分析评分。

步骤4:使用Matplotlib将情感分析评分以直方图的形式进行数据可视化。

8.2 代码

import codecs
import jieba.posseg as pseg
import matplotlib.pyplot as plt
import numpy as np
from snownlp import SnowNLP
import requests  # 爬虫库
from lxml import etree

# 构建停用词表
stop_words = './stopwords.txt'
stopwords = codecs.open(stop_words, 'r', encoding='utf8').readlines()
stopwords = [w.strip() for w in stopwords]
# 结巴分词后的停用词性 [标点符号、连词、助词、副词、介词、时语素、‘的’、数词、方位词、代词]
stop_flag = ['x', 'c', 'u', 'd', 'p', 't', 'uj', 'm', 'f', 'r', 'ul']


class File_Review:
    # 进行中文分词、去停用词
    def cut_words(self, filename):
        result = []
        with open(filename, 'r', encoding='UTF-8') as f:
            text = f.read()
            words = pseg.cut(text)
        for word, flag in words:
            if word not in stopwords and len(word) > 1:
                result.append(word)
        return result  # 返回数组

    #       return ' '.join(result) #返回字符串

    # 统计词频
    def all_list(self, arr):
        result = {}
        for i in set(arr):
            result[i] = arr.count(i)
        return result

    # 情感分析
    def sentiments_analyze(self):
        f = open('./comments.txt', 'r', encoding='UTF-8')
        connects = f.readlines()
        sentimentslist = []

        sum = 0
        for i in connects:
            s = SnowNLP(i)
            # print s.sentiments
            sentimentslist.append(s.sentiments)
            if s.sentiments > 0.5:
                sum += 1
        print("好评数据为%d" % sum)
        print("评价总数为%d" % len(sentimentslist))

        plt.hist(sentimentslist, bins=np.arange(0, 1, 0.01), facecolor='g')
        plt.xlabel('Sentiments Probability')
        plt.ylabel('Quantity')
        plt.title('Analysis of Sentiments')
        plt.show()

if __name__ == '__main__':
    all_comments = []  # 用于存储所有评论

    for i in range(0, 10):
        # 爬取豆瓣电影《天气之子》短评的网址
        url = 'https://movie.douban.com/subject/30402296/comments?start={}&limit=20&status=P&sort=new_score'.format(i*20)
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36 chrome-extension'}
        r = requests.get(url, headers=headers)
        html = etree.HTML(r.text)
        # 对评论进行提取
        pinglun = html.xpath('//*[@id="comments"]/div/div[2]/p/span/text()')
        all_comments.extend(pinglun)

    # 保存所有评论数据到d://comments.txt文档
    with open('./comments.txt', 'w', encoding='utf-8') as fp:
        for comment in all_comments:
            fp.write(comment + '\n')

    # File_Review类实例化
    file_review = File_Review()
    # 对电影评论数据进行分词
    result = file_review.cut_words('./comments.txt')
    # 统计词频
    word_count = file_review.all_list(result)
    # 筛选出词频大于2的数据
    word_count = {k: v for k, v in word_count.items() if v >= 2}
    # 情感分析
    file_review.sentiments_analyze()


程序运行结果如下:

好评数据为204
评价总数为227

在这里插入图片描述

  • 21
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值