【python 自然语言处理】对胡歌【猎场】电视剧评论进行情感值分析

来源:互联网 发布:js obj动态添加key 编辑:程序博客网 时间:2024/05/14 09:48

主要内容

1、什么是SnowNLP?2、SnowNLP可以干哪些事儿?3、如何进行情绪判断?4、猎场豆瓣热门短评抓取。5、猎场热门短评情感分析。6、附录(python 画词云图)

什么是SnowNLP?
snowNLP,可以分词,标注,还可以进行情绪分析。
SnowNLP是一个python写的类库,可以方便的处理中文文本内容,是受到了TextBlob的启发而写的,由于现在大部分的自然语言处理库基本都是针对英文的,于是写了一个方便处理中文的类库,并且和TextBlob不同的是,这里没有用NLTK,所有的算法都是自己实现的,并且自带了一些训练好的字典。注意本程序都是处理的unicode编码,所以使用时请自行decode成unicode。

SnowNLP可以干哪些事儿?

  • 1、分词
  • 2、词性标注
  • 3、断句
  • 4、情绪判断
  • 5、拼音
  • 6、繁体转简体
  • 7、关键词抽取
  • 8、概括总结文意
  • 9、信息量衡量
  • 10、文本相似性

如何进行情绪判断?
返回值为正面情绪的概率,
越接近1表示正面情绪
越接近0表示负面情绪

当值大于 0.5 时代表句子的情感极性偏向积极,当分值小于 0.5 时,情感极性偏向消极,当然越偏向两边,情绪越偏激。

一个例子:

# encoding: utf-8import sysreload(sys)sys.setdefaultencoding('utf-8')from snownlp import SnowNLPtext1="这个人脾气真坏,动不动就骂人"text2='这个人脾气真好,经常笑's1 = SnowNLP(text1.decode('utf-8'))s2=SnowNLP(text2.decode('utf-8'))print text1,s1.sentimentsprint text2,s2.sentiments
"D:\Program Files\Python27\python.exe" D:/PycharmProjects/情感分析/情感分析测试例子.py这个人脾气真坏,动不动就骂人 0.0363076212908这个人脾气真好,经常笑 0.730173371865Process finished with exit code 0

豆瓣猎场短评爬虫。

# encoding: utf-8import sysreload(sys)sys.setdefaultencoding('utf-8')import reimport requestsimport codecsimport timeimport randomfrom bs4 import BeautifulSoupabsolute = 'https://movie.douban.com/subject/26322642/comments'absolute_url = 'https://movie.douban.com/subject/26322642/comments?start=20&limit=20&sort=new_score&status=P&percent_type='url = 'https://movie.douban.com/subject/26322642/comments?start={}&limit=20&sort=new_score&status=P'header={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:54.0) Gecko/20100101 Firefox/54.0','Connection':'keep-alive'}def get_data(html):    soup=BeautifulSoup(html,'lxml')    comment_list = soup.select('.comment > p')    next_page= soup.select('#paginator > a')[2].get('href')    date_nodes = soup.select('.comment-time')    return comment_list,next_page,date_nodesif __name__ == '__main__':    ########先登录豆瓣,把cookie复制放在cookie.txt    f_cookies = open('cookie.txt', 'r')    cookies = {}    for line in f_cookies.read().split(';'):        name, value = line.strip().split('=', 1)        cookies[name] = value    html = requests.get(absolute_url, cookies=cookies, headers=header).content    # print html    comment_list = []    # 获取评论    comment_list, next_page,date_nodes= get_data(html)    soup = BeautifulSoup(html, 'lxml')    comment_list = []    while (next_page != []):  #查看“下一页”的A标签链接        print(absolute + next_page)        html = requests.get(absolute + next_page, cookies=cookies, headers=header).content        soup = BeautifulSoup(html, 'lxml')        comment_list, next_page,date_nodes = get_data(html)        with open(u"comments.txt", 'a+')  as f:            for node in comment_list:                comment = node.get_text().strip().replace("\n", "")                print comment                f.writelines(comment + u'\n')        time.sleep(1 + float(random.randint(1, 100)) / 20)

猎场热门短评情感分析

下面我们对猎场热门短评基于原有 SnowNLP 进行积极和消极情感分类,读取每段评论并依次进行情感值分析,最后会计算出来一个 0-1 之间的值。

# encoding: utf-8import sysreload(sys)sys.setdefaultencoding('utf-8')import numpy as npfrom snownlp import SnowNLPimport matplotlib.pyplot as pltcomment = []with open('comments.txt', mode='r') as f:    rows = f.readlines()    for row in rows:        if row not in comment:            comment.append(row.strip('\n'))def snowanalysis(self):    sentimentslist = []    for li in self:        s = SnowNLP(li.decode('utf-8'))        print li        print  s.sentiments        sentimentslist.append(s.sentiments)    plt.hist(sentimentslist, bins=np.arange(0, 1, 0.01))    plt.show()if __name__ == '__main__':    snowanalysis(comment)

这里写图片描述

结论:通过热门短评的情感分析,好评稍大于差评,猎场还是值得一看的。

附录(python 画词云图)

# encoding: utf-8import sysreload(sys)sys.setdefaultencoding('utf-8')import jieba.analyse           # 导入结巴分词import numpy as np             # numpyfrom wordcloud import WordCloud, STOPWORDS    # 词云工具和自带的的停用词from PIL import Image              # 图片处理import matplotlib.pyplot as pltdef handle(filename, stopword):    with open(filename, 'r') as f:        data = f.read()    wordlist = jieba.analyse.extract_tags(data, topK=100)   # 分词,取前100    wordStr = " ".join(wordlist)    print wordStr    hand = np.array(Image.open('hang1.jpg'))    # 打开一张图片,词语以图片形状为背景分布    my_cloudword = WordCloud(        # wordcloud参数配置        width=1024,        height=768,        background_color = 'white',   # 背景颜色        mask = hand,                  # 背景图片        max_words = 300,              # 最大显示的字数        stopwords = stopword,         # 停用词        max_font_size = 100,           # 字体最大值        font_path='simsun.ttc',  # 设置中文字体,若是有中文的话,这句代码必须添加,不然会出现方框,不出现汉字        random_state=3,  # 设置有多少种随机生成状态,即有多少种配色方案    )    my_cloudword.generate(wordStr)          # 生成图片    my_cloudword.to_file('wordcloud.png')    # 保存    plt.imshow(my_cloudword)  # 显示词云图    plt.axis('off')  # 是否显示x轴、y轴下标    plt.show()  # 显示if __name__ == '__main__':    handle('comments.txt', STOPWORDS)
阅读全文
1 0