說(shuō)明:本文依據(jù)《中文自然語(yǔ)言處理入門實(shí)戰(zhàn)》完成泳姐。目前網(wǎng)上有不少轉(zhuǎn)載的課程,我是從GitChat上購(gòu)買徒役。
第十二課 基于情感詞典的文本情感分析(Sentiment Analysis)
很多場(chǎng)景下寞蚌,都會(huì)用到情感分析。比如麸折,做金融產(chǎn)品量化交易锡凝,需要根據(jù)輿情數(shù)據(jù)來(lái)分析政策和輿論對(duì)股市或者基金期貨的態(tài)度;電商交易垢啼,根據(jù)買家的評(píng)論數(shù)據(jù)窜锯,來(lái)分析商品的預(yù)售率等。
教程基于股吧的一部分爬取數(shù)據(jù)進(jìn)行分析
- 使用SnowNLP進(jìn)行數(shù)據(jù)情感分析
- 使用pytreebank繪制情感樹(shù)
1.中文情感分析方法簡(jiǎn)介
情感傾向分析的方法主要分為兩類
- 基于情感詞典的方法芭析,需要用到標(biāo)注好的情感詞典锚扎。
- 基于機(jī)器學(xué)習(xí)的方法,如基于大規(guī)模語(yǔ)料庫(kù)的機(jī)器學(xué)習(xí)馁启,需要大量的人工標(biāo)注的語(yǔ)料作為訓(xùn)練集驾孔,通過(guò)提取文本特征,構(gòu)建分類器來(lái)實(shí)現(xiàn)情感的分類惯疙。
文本情感分析的分析粒度(注意這個(gè)詞翠勉,分析粒度)可以是詞語(yǔ)、句子霉颠、段落或篇章对碌。
- 段落篇章級(jí)情感分析主要是針對(duì)某個(gè)主題或事件進(jìn)行情感傾向判斷,一般需要構(gòu)建對(duì)應(yīng)事件的情感詞典蒿偎,如電影評(píng)論的分析朽们,需要構(gòu)建電影行業(yè)自己的情感詞典怀读,這樣效果會(huì)比通用情感詞典更好;也可以通過(guò)人工標(biāo)注大量電影評(píng)論來(lái)構(gòu)建分類器骑脱。句子級(jí)的情感分析大多通過(guò)計(jì)算句子里包含的所有情感詞的值來(lái)得到菜枷。
- 篇章級(jí)的情感分析,也可以通過(guò)聚合篇章中所有的句子的情感傾向來(lái)計(jì)算得出惜姐。因此犁跪,針對(duì)句子級(jí)的情感傾向分析,既能解決短文本的情感分析歹袁,同時(shí)也是篇章級(jí)文本情感分析的基礎(chǔ)坷衍。
- 中文情感分析的一些難點(diǎn):句子是由詞語(yǔ)根據(jù)一定的語(yǔ)言規(guī)則構(gòu)成的,應(yīng)該把句子中詞語(yǔ)的依存關(guān)系納入到句子情感的計(jì)算過(guò)程中去条舔,不同的依存關(guān)系枫耳,進(jìn)行情感傾向計(jì)算是不一樣的。文檔的情感孟抗,根據(jù)句子對(duì)文檔的重要程度賦予不同權(quán)重迁杨,調(diào)整其對(duì)文檔情感的貢獻(xiàn)程度等。
同樣凄硼,我們也可以推出铅协,在NLP的分析粒度也應(yīng)該是這三種,詞語(yǔ)級(jí)別摊沉、句子級(jí)別和段落篇章級(jí)別狐史。
2.工具介紹(SnowNLP和HanLP)
SnowNLP安裝很簡(jiǎn)單
pip install snownlp
SnowNLP 主要可以進(jìn)行中文分詞、詞性標(biāo)注说墨、情感分析骏全、文本分類、轉(zhuǎn)換拼音尼斧、繁體轉(zhuǎn)簡(jiǎn)體姜贡、提取文本關(guān)鍵詞、提取摘要棺棵、分割句子楼咳、文本相似等。
需要注意的是烛恤,用 SnowNLP 進(jìn)行情感分析母怜,官網(wǎng)指出進(jìn)行電商評(píng)論的準(zhǔn)確率較高,其實(shí)是因?yàn)樗恼Z(yǔ)料庫(kù)主要是電商評(píng)論數(shù)據(jù)棒动,但是可以自己構(gòu)建相關(guān)領(lǐng)域語(yǔ)料庫(kù),替換單一的電商評(píng)論語(yǔ)料宾添,準(zhǔn)確率也挺不錯(cuò)的船惨。
HanLP同樣也是基于電商評(píng)論數(shù)據(jù)來(lái)進(jìn)行分類和預(yù)測(cè)柜裸。其實(shí)是一個(gè)分類器,將不同的文本分到不同的類別中去粱锐。
但是疙挺,看到一些評(píng)價(jià),SnowNLP的結(jié)果不是很理想怜浅,其實(shí)HanLP也可以做铐然,我之后將SnowNLP替換為HanLP進(jìn)行測(cè)試。
如何獲取語(yǔ)料的情感值
以下是分別使用SnowNLP和HanLP做的情感分類恶座。HanLP會(huì)調(diào)用Java的底層API搀暑,相對(duì)而言SnowNLP更簡(jiǎn)便一些。
from snownlp import SnowNLP
from pyhanlp import *
from tests.test_utility import ensure_data
print("《%s》 情感極性是 【%s】" %(u'本本已收到跨琳,體驗(yàn)還是很好自点,功能方面我不了解,只看外觀還是很不錯(cuò)很薄脉让,很輕桂敛,也有質(zhì)感。',SnowNLP(u'本本已收到溅潜,體驗(yàn)還是很好术唬,功能方面我不了解,只看外觀還是很不錯(cuò)很薄滚澜,很輕粗仓,也有質(zhì)感。').sentiments))
print("《%s》 情感極性是 【%s】" %(u'屏幕分辨率一般博秫,送了個(gè)極丑的鼠標(biāo)潦牛。',SnowNLP(u'屏幕分辨率一般,送了個(gè)極丑的鼠標(biāo)挡育。').sentiments))
print("《%s》 情感極性是 【%s】" %(u'很差的一次購(gòu)物體驗(yàn)巴碗,細(xì)節(jié)做得極差了,還有發(fā)熱有點(diǎn)嚴(yán)重啊即寒,散熱不行橡淆,用起來(lái)就是燙得厲害,很垃圾D刚浴R菥簟!',SnowNLP(u'很差的一次購(gòu)物體驗(yàn)凹嘲,細(xì)節(jié)做得極差了师倔,還有發(fā)熱有點(diǎn)嚴(yán)重啊,散熱不行周蹭,用起來(lái)就是燙得厲害趋艘,很垃圾F;帧!瓷胧!').sentiments))
IClassifier = JClass('com.hankcs.hanlp.classification.classifiers.IClassifier')
NaiveBayesClassifier = JClass('com.hankcs.hanlp.classification.classifiers.NaiveBayesClassifier')
# 中文情感挖掘語(yǔ)料-ChnSentiCorp 譚松波
chn_senti_corp = ensure_data("ChnSentiCorp情感分析酒店評(píng)論", "http://hanlp.linrunsoft.com/release/corpus/ChnSentiCorp.zip")
def predict(classifier, text):
print("《%s》 情感極性是 【%s】" % (text, classifier.classify(text)))
if __name__ == '__main__':
classifier = NaiveBayesClassifier()
# 創(chuàng)建分類器显拳,更高級(jí)的功能請(qǐng)參考IClassifier的接口定義
classifier.train(chn_senti_corp)
# 訓(xùn)練后的模型支持持久化,下次就不必訓(xùn)練了
predict(classifier, u'本本已收到搓萧,體驗(yàn)還是很好杂数,功能方面我不了解,只看外觀還是很不錯(cuò)很薄瘸洛,很輕揍移,也有質(zhì)感。')
predict(classifier, u'屏幕分辨率一般货矮,送了個(gè)極丑的鼠標(biāo)羊精。')
predict(classifier, u'很差的一次購(gòu)物體驗(yàn),細(xì)節(jié)做得極差了囚玫,還有發(fā)熱有點(diǎn)嚴(yán)重啊喧锦,散熱不行,用起來(lái)就是燙得厲害抓督,很垃圾H忌佟!铃在!')