如何做中文文本的情感分析? 這是本學(xué)期在大數(shù)據(jù)哲學(xué)與社會(huì)科學(xué)實(shí)驗(yàn)室做的第三次分享了。
第一次分享的是:如何利用“wordcloud+jieba”制作中文詞云?
第二次分享的是:如何爬取知乎中問題的回答以及評(píng)論的數(shù)據(jù)?
本次給大家分享兩種實(shí)現(xiàn)中文文本情感分析的方式,第一種是借助百度AI平臺(tái)的文本情感分析,第二種是使用snownlp的文本情感分析。
1. 百度AI平臺(tái)的文本情感分析 使用百度AI平臺(tái)的文本情感分析主要分為兩個(gè)步驟,第一步是創(chuàng)建一個(gè)賬號(hào),第二步是根據(jù)SDK調(diào)用平臺(tái)提供的API函數(shù)進(jìn)行情感分析。
第一步:創(chuàng)建賬號(hào)
首先,我們打開百度AI網(wǎng)站,然后點(diǎn)擊控制臺(tái)。
http://ai.baidu.com/
跳轉(zhuǎn)到登陸界面,輸入賬號(hào)密碼后,跳轉(zhuǎn)到管理界面,此時(shí)我們點(diǎn)擊自然語(yǔ)言處理。進(jìn)入到自然語(yǔ)言處理應(yīng)用界面。
然后創(chuàng)建一個(gè)應(yīng)用(如已創(chuàng)建好,就點(diǎn)擊管理應(yīng)用)。
創(chuàng)建好后,進(jìn)入到應(yīng)用列表中,記下來(lái)AppID
、API Key
、Secret Key
這三個(gè)參數(shù)的值。在后面對(duì)API進(jìn)行調(diào)用的時(shí)候需要用到這三個(gè)參數(shù)。
第二步:進(jìn)行文本情感分析
有關(guān)百度AI平臺(tái)的自然語(yǔ)言處理的SDK(Software Development Kit)文檔見如下網(wǎng)址:
http://ai.baidu.com/ai-doc/NLP/tk6z52b9z
這份SDK文檔,包括了詞法分析、詞向量表示、詞義相似度、短文本相似度、評(píng)論觀點(diǎn)抽取、情感傾向分析、文章標(biāo)簽、文章分類、文本糾錯(cuò)、中文分詞、詞性標(biāo)注、新聞?wù)?、地址識(shí)別等常用NLP功能。有關(guān)這些功能的使用,我們后面再來(lái)寫圖文進(jìn)行詳細(xì)介紹,下面只介紹情感分析功能。
首先,我們先安裝要使用到的庫(kù)。
pip install baidu-aip
安裝好后,我們就可以調(diào)用API函數(shù)來(lái)對(duì)包含主觀觀點(diǎn)信息的文本進(jìn)行情感極性類別(積極、消極、中性)的判斷了,代碼如下:
from aip import AipNlp""" 你的 APPID AK SK """ APP_ID = '你的APP_ID' API_KEY = '你的API_KEY' SECRET_KEY = '你的SECRET_KEY' client = AipNlp(APP_ID, API_KEY, SECRET_KEY) text = "王建紅真帥" """ 調(diào)用情感傾向分析 """ dict = client.sentimentClassify(text) print(dict)
sentimentClassify(text)
函數(shù):用于對(duì)文本的情感分析,參數(shù)text
是進(jìn)行分析的文本內(nèi)容(GBK編碼),最大2048字節(jié)。
它的返回示例:
{ 'log_id' : 5284845474026755873 , 'text' : '王建紅真帥' , 'items' : [ { 'positive_prob' : 0.999855 , #表示屬于積極類別的概率 'negative_prob' : 0.000144523 , #表示屬于消極類別的概率 'confidence' : 0.999679 , #表示分類的置信度 'sentiment' : 2 #表示情感極性分類結(jié)果 } ] }
返回?cái)?shù)據(jù)參數(shù)詳情如下:
參數(shù) 類型 說(shuō)明 text string 輸入的文本內(nèi)容 items array 輸入的詞列表 +sentiment number 表示情感極性分類結(jié)果, 0:負(fù)向,1:中性,2:正向 +confidence number 表示分類的置信度 +positive_prob number 表示屬于積極類別的概率 +negative_prob number 表示屬于消極類別的概率
【例子】測(cè)試一個(gè)有關(guān)中醫(yī)的文本
text = u"因?yàn)橹嗅t(yī)自己都不認(rèn)可自己,你就別為難外人了。中醫(yī)們嘴上吹噓自己有多厲害," \ u"實(shí)際上,他們能當(dāng)上中醫(yī),還得西醫(yī)給他們體檢合格了才能入職。中醫(yī)理論不能指導(dǎo)中醫(yī)入職體檢," \ u"中醫(yī)術(shù)語(yǔ)不能用于中醫(yī)入職體檢報(bào)告,甚至中醫(yī)死了,他的死亡證明也和中醫(yī)理論與術(shù)語(yǔ)沒什么關(guān)系。" \ u"你看中醫(yī)自己都不用,只能說(shuō)明中醫(yī)藥是專供中醫(yī)粉的。" dict = client.sentimentClassify(text) print(dict['items' ])# [{'positive_prob': 1.76205e-05, 'confidence': 0.999961, 'negative_prob': 0.999982, 'sentiment': 0}]
我們可以發(fā)現(xiàn)這段關(guān)于中醫(yī)的描述偏消極('sentiment': 0
)。
2. 使用snownlp的文本情感分析 Python有一個(gè)第三方庫(kù)snownlp,它是專門用來(lái)處理中文文本內(nèi)容的庫(kù),有中文分詞(s.words)、詞性標(biāo)注(s.tags)、情感分析(s.sentiments)、提取關(guān)鍵詞(s.keywords())等功能。
首先,我們先安裝要使用到的庫(kù)(安裝后可以直接用)。
pip install snownlp
安裝好后,我們就可以調(diào)用函數(shù)來(lái)對(duì)包含主觀觀點(diǎn)信息的文本進(jìn)行情感分析了,它會(huì)計(jì)算出文本語(yǔ)義接近積極的概率,越接近0情感表現(xiàn)越消極,越接近1情感表現(xiàn)越積極。代碼如下:
from snownlp import SnowNLP text = "王建紅真帥" s = SnowNLP(text) print(text, s.sentiments)# 王建紅真帥 0.868676346818001
【例子】測(cè)試一個(gè)有關(guān)中醫(yī)的文本
from snownlp import SnowNLP text = u"因?yàn)橹嗅t(yī)自己都不認(rèn)可自己,你就別為難外人了。中醫(yī)們嘴上吹噓自己有多厲害," \ u"實(shí)際上,他們能當(dāng)上中醫(yī),還得西醫(yī)給他們體檢合格了才能入職。中醫(yī)理論不能指導(dǎo)中醫(yī)入職體檢," \ u"中醫(yī)術(shù)語(yǔ)不能用于中醫(yī)入職體檢報(bào)告,甚至中醫(yī)死了,他的死亡證明也和中醫(yī)理論與術(shù)語(yǔ)沒什么關(guān)系。" \ u"你看中醫(yī)自己都不用,只能說(shuō)明中醫(yī)藥是專供中醫(yī)粉的。" s = SnowNLP(text)for sentence in s.sentences: print(sentence, SnowNLP(sentence).sentiments)# 因?yàn)橹嗅t(yī)自己都不認(rèn)可自己 0.816024132542549 # 你就別為難外人了 0.6792294609027675 # 中醫(yī)們嘴上吹噓自己有多厲害 0.32479885192764957 # 實(shí)際上 0.478723404255319 # 他們能當(dāng)上中醫(yī) 0.7191238537063072 # 還得西醫(yī)給他們體檢合格了才能入職 0.2899327459226514 # 中醫(yī)理論不能指導(dǎo)中醫(yī)入職體檢 0.9719464371262481 # 中醫(yī)術(shù)語(yǔ)不能用于中醫(yī)入職體檢報(bào)告 0.9964791023333988 # 甚至中醫(yī)死了 0.5308849018309401 # 他的死亡證明也和中醫(yī)理論與術(shù)語(yǔ)沒什么關(guān)系 0.994350435104035 # 你看中醫(yī)自己都不用 0.6714833680109371 # 只能說(shuō)明中醫(yī)藥是專供中醫(yī)粉的 0.9076878772503925 print(s.sentiments)# 0.9999999813523964 from snownlp import sentiment sen = sentiment.classify(text) print(sen)# 0.9999999813523964
我們看到snownlp的情感分析結(jié)果與百度AI的情感分析結(jié)果相反。所以,在實(shí)際的項(xiàng)目中,需要根據(jù)實(shí)際的數(shù)據(jù)重新訓(xùn)練情感分析的模型。
首先,我們看一下snownlp的語(yǔ)料庫(kù):
C:\ProgramData\Anaconda3\Lib\site-packages\snownlp
sentiments目錄下有5個(gè)文件,其中__init__.py
是程序,neg.txt
和pos.txt
分別是消極和積極語(yǔ)料庫(kù)(也就是用來(lái)訓(xùn)練的數(shù)據(jù)集)sentiment.marshal.3
和sentiment.marshal
是訓(xùn)練保存的模型。(python2保存的是sentiment.marshal
;python3保存的是sentiment.marshal.3
)。
其次,我們看一下__init__.py
文件中的代碼。
data_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'sentiment.marshal' )class Sentiment (object) : def __init__ (self) : self.classifier = Bayes() # 使用的是Bayes的模型 def save (self, fname, iszip=True) : self.classifier.save(fname, iszip) # 保存最終的模型 def load (self, fname=data_path, iszip=True) : self.classifier.load(fname, iszip) # 加載貝葉斯模型 # 分詞以及去停用詞的操作 def handle (self, doc) : words = seg.seg(doc) # 分詞 words = normal.filter_stop(words) # 去停用詞 return words # 返回分詞后的結(jié)果 def train (self, neg_docs, pos_docs) : data = [] # 讀入負(fù)樣本 for sent in neg_docs: data.append([self.handle(sent), 'neg' ]) # 讀入正樣本 for sent in pos_docs: data.append([self.handle(sent), 'pos' ]) # 調(diào)用的是Bayes模型的訓(xùn)練方法 self.classifier.train(data) def classify (self, sent) : # 1、調(diào)用sentiment類中的handle方法 # 2、調(diào)用Bayes類中的classify方法 ret, prob = self.classifier.classify(self.handle(sent)) # 調(diào)用貝葉斯中的classify方法 if ret == 'pos' : return prob return 1 - probclass Sentiment(object): classifier = Sentiment() classifier.load()def train (neg_file, pos_file) : neg_docs = codecs.open(neg_file, 'r' , 'utf-8' ).readlines() pos_docs = codecs.open(pos_file, 'r' , 'utf-8' ).readlines() global classifier classifier = Sentiment() classifier.train(neg_docs, pos_docs)def save (fname, iszip=True) : classifier.save(fname, iszip)def load (fname, iszip=True) : classifier.load(fname, iszip)def classify (sent) : return classifier.classify(sent)
從上述的代碼中,classify
函數(shù)和train
函數(shù)是兩個(gè)核心的函數(shù),其中,train
函數(shù)用于訓(xùn)練一個(gè)情感分類器,classify
函數(shù)用于預(yù)測(cè)。在這兩個(gè)函數(shù)中,都同時(shí)使用到的handle
函數(shù),handle
函數(shù)的主要工作為:對(duì)輸入文本分詞和去停用詞。
了解snownlp的語(yǔ)料庫(kù)以及訓(xùn)練的代碼之后,就可以用自己的語(yǔ)料庫(kù)進(jìn)行訓(xùn)練了。訓(xùn)練的過程大致分為如下的幾個(gè)步驟:
準(zhǔn)備正負(fù)樣本,并分別保存,如正樣本保存到pos.txt,負(fù)樣本保存到neg.txt; 重新訓(xùn)練情感分析的代碼如下:
from snownlp import sentiment# 重新訓(xùn)練模型 sentiment.train('./neg.txt' , './pos.txt' )# 保存好新訓(xùn)練的模型 sentiment.save('sentiment.marshal' )
訓(xùn)練完成后,可以把sentiment.marshal
復(fù)制到sentiments目錄下替換原來(lái)的或者改變讀取模型的路徑。
# data_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), # 'sentiment.marshal') data_path = '這里填入新模型的路徑'
經(jīng)過以上操作,就可以利用新的模型來(lái)做情感分析了。
3. 總結(jié) 本文介紹了兩種對(duì)文本進(jìn)行情感分析的方式,大家可以根據(jù)自身喜好來(lái)進(jìn)行選擇。百度AI的自然語(yǔ)言處理和snownlp庫(kù),不止這一種功能,后面我會(huì)寫一系列圖文來(lái)介紹它們的使用方法。