推荐星级:
- 1
- 2
- 3
- 4
- 5
基于Python爬虫的电影评论情感倾向性分析
资料介绍
通过对豆瓣网站评分高(9.1分)的与评分(5.2分)两部电影进行电影评论的搜集,利用Python网络爬虫获取这些评论数据并清理.利用PMI算法,对TF-IDF算法进行改进,并对评论进行分类,得出PMI最高的15个分词,最后对分词进行分析统计,得出分析结果.
部分文件列表
文件名 | 大小 |
基于Python爬虫的电影评论情感倾向性分析.pdf | 2M |
部分页面预览
(完整内容请下载后查看)研究与开发
文章编号:1007-1423(2017)35-0055-04
DOI:10.3969/j.issn.1007-1423.2017.35.011
基于 Python 爬虫的电影评论情感倾向性分析
涂小琴
(云南师范大学文理学院,昆明 650222)
摘要:
通过对豆瓣网站评分高(9.1 分)的与评分(5.2 分)两部电影进行电影评论的搜集,利用 Python 网络爬虫获取这些评
论数据并清理。利用 PMI 算法,对 TF-IDF 算法进行改进,并对评论进行分类,得出 PMI 最高的 15 个分词,最后对分
词进行分析统计,得出分析结果。
关键词:
Python;爬虫;情感分析;影评
通过豆瓣网站中最近热点的两部电影《摔跤吧!
0
引言
爸爸》,以及电影《悟空传》的影评进行数据处理,通过
随着现代生活水平的提高,更多的愿意将时间和
PLN 机器学习进行情感分析,分析观众情感倾向。
精力投入至精神生活,越来越多的人去到电影院,作为
国内电影最有影响的莫过于豆瓣(),
豆瓣给电影爱好者提供了一个很好的分享及评论平
台。每一部电影,在豆瓣上都可以看到很多的评论,可
见人们对电影的喜爱。那什么样的电影是大众所喜欢
的呢?什么样的电影又是不被大众所喜爱呢,通过 Py⁃
thon 爬虫,我们可以获取大量的影评来进行分析,从而
得出观众的喜好。
1
数据获取
豆瓣上有很多关于每一部电影的评论,对于一些
评分比较高的电影而言,有的评论在几十万条,所以采
用 Python 网络爬虫来进行处理,由于豆瓣是一个反爬
虫的网站,所以在做网络爬虫时,还需要进行浏览器访
问模拟,通过对网页源代码的分析,用正则表达式来获
取所需数据。为了能够更好地分析观众的情感,在获
取数据时,分别获取了豆瓣网站上得分高于 9.0 的两部
电影,以及得分低于 4.0 的两部电影的影评数据进行分
析。通过高分的两部电影与低分的两部电影进行对比
分析,更能反映观众的喜好。
情感分析是一种常见的自然语言处理(NLP)方法
的应用,NLP 情感分析中一般有两种方法,第一种是根
据语义和依存关系来量化文本的情感色彩。但这种方
法首先需要很完善的情感词库,另外需要很好的语言
学基础,也就是说需要知道一个句子通常在什么情况
为表现为 Positive 和 Negative。个人认为,我们永远无
法穷尽所有的语法规则和感情词汇,这也就无形之中
增加了构造分类规则的难度。第二种方法,就是基于
机器学习的方法。基于机器学习,本质上就是要转化
为机器学习能解决的问题。情感分析实际上就是认为
是机器学习中的二分类问题。但是机器是无法理解文
本的,所以我们必须能够实现让文本转化为向量,从而
让机器能够理解。
要获取相应的数据,不同的网站对应着不同的正
则表达式,最近在豆瓣网站中得分比较高的其中一部
电影为《摔跤吧,爸爸!》,评分在 9.1 分,首先通过进入
豆瓣网站进入该电影影评,获取影评首页的 URL,再与
影评的下一页进行 URL 比较,找到这部电影所有影评
的 URL 规则,利用循环来进行读取每页影评的数据。
借助库文件 Beautifulsoup、Requests 以及 Re 来进行数
据的爬取,爬取的数据有:评论人、评论的时间、评论等
级、评论具体内容等,因为评论量比较大,所以将获取
ꢀ
现代计算机 2017.12 中
研究与开发
到的数据存放到 Excel 中。获取影评的关键代码如下:
数据。通过 Python 中的正则表达式模块 RE 来进行清
理工作,关键代码如下:
get_url = url #url 即需要获取数据的网页地址
data=requests.get(get_url, timeout =20, headers = header,cook⁃
ies=cookies).text
pattern = re.compile(r′[\u4e00-\u9fa5]+′)
filterdata = re.findall(pattern, lnfolist)
cleaned_comments = ′′.join(filterdata)
soup = BeautifulSoup(data,′lxml′)
comments=soup.find_all("div", class_=′comment-item′)
for i in comments:
并对数据进行停用词去除:
stopwords=filterdata.read_csv("stopwords.txt",index_col=False,
quoting=3,sep="\t",names=[′stopword′], encoding=′utf-8′)
words_df=words_df[~words_df.segment.isin(stopwords.stopword)]
words_stat=words_stat.reset_index().sort_values(by=["计数"],as⁃
cending=False)
listinfo=[]
com=i.find(′span′,class_=′comment-info′)
listinfo.append(com.contents[1].text.strip()) #用户名
#rating
以及对词频进行统计。
rating=i.find(′span′,class_="rating")
if rating!=None:
3
情感分析
rating=rating.get(′title′)
3.1 分类算法改进
else:
词频(Term Frequency,TF)指的是某一个给定的词
语在该文件中出现的频率。这个数字是对词数(term
count)的归一化,以防止它偏向长的文件。(同一个词语
在长文件里可能会比短文件有更高的词数,而不管该
词语重要与否。)对于在某一特定文件里的词语来说,
它的重要性可表示为:
rating=′无评分′
#print(rating)
listinfo.append(rating)
listinfo.append(i.find(′span′,class_ ="comment- time").text.
strip()) #评论时间
#listinfo.append(i.find(′span′,class_ ="votes pr5").text.strip
()) #点赞人数
ni,j
tfi,j =
(1)
n
listinfo.append(i.find(′p′).text.strip()) # 相应的评论
#print(i.find(′p′).text)
∑
k,j
k
n
d
在以上式子中, 是该词在文件 中的出现次
i,j
j
Infolist.append(listinfo)
d
数,而分母则是在文件 中所有字词的出现次数之和。
j
数据获取结果如图 1 所示。
D
|
|
idfi = log
(2)
j:t ∈ d
{
}
|
|
i
j
D
j:t ∈ d
|
|
其中, :语料库中的文件总数,
{
}
|
:包含
|
i
j
n ≠ 0
t
词语 的文件数目(即
的文件数目),如果该词
语不在语料库中,就会导致被除数为 0,因此一般情况
tf idf = tf × idf
i,j
i
1 + j:t ∈ d
下使用
{
}
,然后,
。
|
|
i,j
ij
i
i
j
某一特定文件内的高词语频率,以及该词语在整
个文件集合中的低文件频率,可以产生出高权重的
TF-IDF。因此,TF-IDF 倾向于过滤掉常见的词语,保
留重要的词语。为了能够分类出最有效的情感词,引
用 PMI(Pointwise Mutual Information),PMI 用来衡量两
个事物之间的相关性(例如两个词)。所以对公式(2)
进行修改。
图1 获取数据结果
2
数据处理
通过图 1 可以看出,获取到的数据中有很多的语
气词,如“啊”,“哦”“的”等等,还有不少的标点符号,这
些都不利于我们对关键词出现次数的统计,所以需对
相应的数据进行清理工作,借助“WordStop.txt”停用词
来进行处理,将停用词进行对比过滤。得到清理后的
P word,pos
(
)
PMI word,pos = log
(
)
(3)
P pos *P word
)
(
)
(
其中,pos 表示文档的情感,word 表示某一个词。
ꢁ
现代计算机 2017.12 中
全部评论(0)