基于情感词典进行情感态度分析
情感分析是指挖掘文本表達的觀點,識別主體對某客體的評價是褒還是貶,褒貶根據進態度行傾向性研究。文本情感分析可以分為基于機器學習的情感分類方法和基于語義理解的情感分析。基于機器學習進行語義分析的話需要大量的訓練集,同時需要人工對其進行分類標注。我所使用的方法是基于語義理解中的使用情感詞典進行情感態度分析。
下面是我所使用的情感詞典:
鏈接:https://pan.baidu.com/s/1toX2wqlIe2H-o_T6MFen1A?
提取碼:gobt
復制這段內容后打開百度網盤手機App,操作更方便哦
情感詞典有很多種,比如哈工大整理的,知網情感詞典以及臺灣大學NTUSD簡體中文情感詞典等,但并不是每個詞典對于我們來說都是有用的,我們要根據自己的文本內容來選擇合適的情感詞典。
進行情感分析,我們不能按照自己怎么想就去怎么進行分析,需要一定的支撐條件。我所用的算法是根據北京交通大學楊立月和王移芝兩位所寫的“微博情感分析的情感詞典構造及分析方法研究”這篇論文所編寫的,這論文的地址微博情感分析的情感詞典構造及分析方法研究 - 中國知網
進行情感分析的大致流程如下圖:
第一步先對文本進行預處理:
? ? 這里對文本進行預處理就是對句子進行分詞,分詞工具有很多,我選擇的是使用python中的結巴分詞,這個分詞工具很好用,可以在分詞的同時將詞性也分析出來。不過在分詞之前,對于一段文本內容來說,并不是所有的內容都對情感分析有幫助,比如一本書的書名,微博文本的標題以及一些非中文內容等,時候這個就我們可以用正則表達式只匹配我們需要的內容
import jieba.posseg as pseg #包括了詞性(詞語,詞性)def seg_word(sentenct):d = ""sentenct = re.sub(u"\\#.*?\\#|\\@.*?\\ |\\《.*?\\》|【.*?】", "", sentenct) # 處理#...#和@... (空格)間的數據s = re.compile(r'http://[a-zA-Z0-9.?/&=:]*', re.S)sentenct = s.sub("", sentenct)segList = pseg.cut(sentenct) #分詞segResult = []data_c = []data_p =[]for word,flag in segList:if ('\u4e00' <= word <= '\u9fa5'): #判斷字符串是否為中文if len(word)>1:data_p.append(word)segResult.append(word)s = word + "/" + flagd=d+s+" "data_c.append(d)return data_c #帶有詞性的列表第二步就是將分詞后的詞向量通過情感詞典進行訓練了:
? ? 英漢詞典情感包括情感詞,否定詞,副詞程度以及停用詞??
? ? ? ? ? 情感詞:是主體對某一客體表示內在評價的詞語,帶有強烈的感情色彩。
? ? ? ? ? 程度副詞:本身沒有情感傾向,但能夠增強或減弱情感強度??
? ? ? ? ? 否定詞:本身也沒有情感傾向,但能改變情感的極性
? ? ? ? ? 停用詞:完全沒有用或者沒有意義的詞
? ? 首先我們可以利用停用詞去掉一些沒有意義的詞語,比如這,那,是等詞語,將一些沒有意義的詞語過濾掉后,剩下的大部分就是對情感分析有用的詞語了。在去除了停用詞后,我們就可以利用情感詞,程度副詞以及否定詞來運用一定的算法進行情感分析了
下面是通過停用詞典匹配的代碼
def stopchineseword(segResult):file = open("f:\\chineseStopWords.txt","r")data = []new_segResult=[]for i in file.readlines(): #從文件中讀取數據并將其添加到列表中data.append(i.strip())for i in segResult:if i in data: #比較是否為停用詞continueelse:new_segResult.append(i)return new_segResult在做完上面兩步后,我們就可以開始利用情感詞典來進行分析了
? ? ?有人會問知道了情感詞后如何進行分析呢,這只是詞語啊?在這里,我們就需要給情感詞進行打分了。情感詞分為正面情感詞和負面情感詞,也可能會多分幾類,但在這只討論正反兩面。有些情感詞典可能會給出情感詞對應的分值(怎么算的我就不知道了)。根據上面說的論文中所寫,我們對情感詞進行賦值,正面情感詞分值為1,負面情感詞分值為-1,中性詞則為0程度副詞也可以根據詞典中所給出的不同程度基于不同等級的分值,否定詞則全部置為 - 1。
? ? ?語義是語句進行情感分類的重要特征,文檔分類判斷應按照詞匯,句子,微博短文的步驟進行判斷。情感傾向情感詞前經常有程度副詞修飾。當情感詞前有程度副詞修飾時,則會使情感詞的情感傾向加強或減弱。而情感詞前有否定詞修飾時會使情感詞的情感傾向反轉。但在這里需要注意一個問題,就是對于否定詞和程度詞的不同位置可能會有兩種結果。一是“否定詞+程度副詞+情感詞”,還有就是“程度副詞+否定詞+情感詞”。
對于“否定詞+程度副詞+情感詞”的計算方式是
? ? ? w = t *( - 1)* a * 0.5
對于“程度副詞+否定詞+情感詞”的計算方式是
? ? ?w = t *( - 1)* a * 2
其中w表示計算得到的情感詞語的情感強度值,t表示情感詞的權值,表示該情感詞t前的程度副詞的權值
在求得詞向量中所有情感詞的權值后進行求和,若得到的分值大于0,則為正面情感;若分值小于0,則為負面情感;若分值為0,則為中性情感。
大致算法的就跟下圖所示一樣,但我這張圖還存在一些缺陷,就是在判斷詞語詞性時沒有將循環展示出來
求情感詞的代碼如下(重點在于計算整句話中情感詞的權值)
def classify_words(dict_data):positive_words = []positive_word = open("f:\\正面情緒詞.txt","r",encoding="utf-8").readlines()for i in positive_word:positive_words.append(i.strip())negative_words = []negative_word = open("f:\\負面情緒詞.txt","r",encoding="utf-8").readlines()for i in negative_word:negative_words.append(i.strip())privative_words = []privative_word = open("f:\\否定詞.txt","r",encoding="utf-8").readlines()for i in privative_word:privative_words.append(i.strip())adverb_of_degree_words1 = []adverb_of_degree1 = open("f:\\2倍.txt","r").readlines()for i in adverb_of_degree1:adverb_of_degree_words1.append(i.strip())adverb_of_degree_words2 = []adverb_of_degree2 = open("f:\\1.5倍.txt","r").readlines()for i in adverb_of_degree2:adverb_of_degree_words2.append(i.strip())adverb_of_degree_words3 = []adverb_of_degree3 = open("f:\\1.25倍.txt","r").readlines()for i in adverb_of_degree3:adverb_of_degree_words3.append(i.strip())adverb_of_degree_words4 = []adverb_of_degree4 = open("f:\\1.2倍.txt","r").readlines()for i in adverb_of_degree4:adverb_of_degree_words4.append(i.strip())adverb_of_degree_words5 = []adverb_of_degree5 = open("f:\\0.8倍.txt","r").readlines()for i in adverb_of_degree5:adverb_of_degree_words5.append(i.strip())adverb_of_degree_words6 = []adverb_of_degree6 = open("f:\\0.5倍.txt","r").readlines()for i in adverb_of_degree6:adverb_of_degree_words6.append(i.strip())z = 0data = []for k,v in enumerate(dict_data):w = 0if v in positive_words: #為正面情感詞w += 1for i in range(z, int(k)):if dict_data[i] in privative_words:for j in range(z, i): #程度詞+否定詞+情感詞if dict_data[j] in adverb_of_degree_words6 or dict_data[j] in adverb_of_degree_words5 or \dict_data[j] in adverb_of_degree_words4 or dict_data[j] in adverb_of_degree_words3 or \dict_data[j] in adverb_of_degree_words2 or dict_data[j] in adverb_of_degree_words1:w = w * (-1) * 2breakfor j in range(i, int(k)): #否定詞+程度詞+情感詞if dict_data[j] in adverb_of_degree_words6 or dict_data[j] in adverb_of_degree_words5 or \dict_data[j] in adverb_of_degree_words4 or dict_data[j] in adverb_of_degree_words3 or \dict_data[j] in adverb_of_degree_words2 or dict_data[j] in adverb_of_degree_words1:w = w * 0.5breakelif dict_data[i] in adverb_of_degree_words1:w =w * 2elif dict_data[i] in adverb_of_degree_words2:w =w * 1.5elif dict_data[i] in adverb_of_degree_words3:w =w * 1.25elif dict_data[i] in adverb_of_degree_words4:w =w * 1.2elif dict_data[i] in adverb_of_degree_words5:w =w * 0.8elif dict_data[i] in adverb_of_degree_words6:w =w * 0.5z = int(k) + 1if v in negative_words: #為負面情感詞w -= 1for i in range(z, int(k)):if dict_data[i] in privative_words:for j in range(z, i): #程度詞+否定詞+情感詞if dict_data[j] in adverb_of_degree_words6 or dict_data[j] in adverb_of_degree_words5 or \dict_data[j] in adverb_of_degree_words4 or dict_data[j] in adverb_of_degree_words3 or \dict_data[j] in adverb_of_degree_words2 or dict_data[j] in adverb_of_degree_words1:w = w * (-1)*2breakfor j in range(i,int(k)): #否定詞+程度詞+情感詞if dict_data[j] in adverb_of_degree_words6 or dict_data[j] in adverb_of_degree_words5 or \dict_data[j] in adverb_of_degree_words4 or dict_data[j] in adverb_of_degree_words3 or \dict_data[j] in adverb_of_degree_words2 or dict_data[j] in adverb_of_degree_words1:w = w*0.5breakif dict_data[i] in adverb_of_degree_words1:w *= 2elif dict_data[i] in adverb_of_degree_words2:w *= 1.5elif dict_data[i] in adverb_of_degree_words3:w *= 1.25elif dict_data[i] in adverb_of_degree_words4:w *= 1.2elif dict_data[i] in adverb_of_degree_words5:w *= 0.8elif dict_data[i] in adverb_of_degree_words6:w *= 0.5z = int(k)+1data.append(w)return data總結
以上是生活随笔為你收集整理的基于情感词典进行情感态度分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安装VS2010旗帜版,出现“某些组件必
- 下一篇: 详解当当网的分布式作业框架elastic