基于词典的情感分析实验
生活随笔
收集整理的這篇文章主要介紹了
基于词典的情感分析实验
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
基于詞典的情感分析實驗
做了下初步實驗,因為現在還是有點蒙,所以決定先寫初稿理理思路。
數據說明
實驗數據來源于各大平臺五臺山景區游記評論
詞典說明
- 清華大學——李軍中文褒貶義詞典
- 臺灣大學NTUSD
- 知網Hownet
- 常用停用詞
- 中文情感詞匯本體庫
中文情感詞匯本體
中文情感詞匯本體庫是大連理工大學信息檢索研究室在林鴻飛教授的指導下經過全體教研室成員的努力整理和標注的一個中文本體資源。該資源從不同角度描述一個中文詞匯或者短語,包括詞語詞性種類、情感類別、情感強度及極性等信息。
中文情感詞匯本體的情感分類體系是在國外比較有影響的Ekman的6大類情感分類體系的基礎上構建的。在Ekman的基礎上,詞匯本體加入情感類別“好”對褒義情感進行了更細致的劃分。最終詞匯本體中的情感共分為7大類21小類。
構造該資源的宗旨是在情感計算領域,為中文文本情感分析和傾向性分析提供一個便捷可靠的輔助手段。中文情感詞匯本體可以用于解決多類別情感分類的問題,同時也可以用于解決一般的傾向性分析的問題。
本體格式介紹
情感詞匯本體中,一般的格式為。
表一 情感詞匯本體格式舉例| 無所畏懼 | idiom | 1 | 1 | PH | 7 | 1 |
| 手頭緊 | idiom | 1 | 1 | NE | 7 | 0 |
| 周到 | adj | 1 | 1 | PH | 5 | 1 |
| 言過其實 | idiom | 1 | 1 | NN | 5 | 2 |
情感分類及情感強度
情感分類按照論文《情感詞匯本體的構造》所述,情感分為7大類21小類。
情感強度分為1,3,5,7,9五檔,9表示強度最大,1為強度最小。
| 1 | 樂 | 快樂(PA) | 喜悅、歡喜、笑瞇瞇、歡天喜地 |
| 2 | 安心(PE) | 踏實、寬心、定心丸、問心無愧 | |
| 3 | 好 | 尊敬(PD) | 恭敬、敬愛、畢恭畢敬、肅然起敬 |
| 4 | 贊揚(PH) | 英俊、優秀、通情達理、實事求是 | |
| 5 | 相信(PG) | 信任、信賴、可靠、毋庸置疑 | |
| 6 | 喜愛(PB) | 傾慕、寶貝、一見鐘情、愛不釋手 | |
| 7 | 祝愿(PK) | 渴望、保佑、福壽綿長、萬壽無疆 | |
| 8 | 怒 | 憤怒(NA) | 氣憤、惱火、大發雷霆、七竅生煙 |
| 9 | 哀 | 悲傷(NB) | 憂傷、悲苦、心如刀割、悲痛欲絕 |
| 10 | 失望(NJ) | 憾事、絕望、灰心喪氣、心灰意冷 | |
| 11 | 疚(NH) | 內疚、懺悔、過意不去、問心有愧 | |
| 12 | 思(PF) | 思念、相思、牽腸掛肚、朝思暮想 | |
| 13 | 懼 | 慌(NI) | 慌張、心慌、不知所措、手忙腳亂 |
| 14 | 恐懼(NC) | 膽怯、害怕、擔驚受怕、膽顫心驚 | |
| 15 | 羞(NG) | 害羞、害臊、面紅耳赤、無地自容 | |
| 16 | 惡 | 煩悶(NE) | 憋悶、煩躁、心煩意亂、自尋煩惱 |
| 17 | 憎惡(ND) | 反感、可恥、恨之入骨、深惡痛絕 | |
| 18 | 貶責(NN) | 呆板、虛榮、雜亂無章、心狠手辣 | |
| 19 | 妒忌(NK) | 眼紅、吃醋、醋壇子、嫉賢妒能 | |
| 20 | 懷疑(NL) | 多心、生疑、將信將疑、疑神疑鬼 | |
| 21 | 驚 | 驚奇(PC) | 奇怪、奇跡、大吃一驚、瞠目結舌 |
極性標注
每個詞在每一類情感下都對應了一個極性。其中,0代表中性,1代表褒義,2代表貶義,3代表兼有褒貶兩性。
注:褒貶標注時,通過詞本身和情感共同確定,所以有些情感在一些詞中可能極性1,而其他的詞中有可能極性為0。
前期準備
數據預覽
import pandas as pdweibo_df = pd.read_excel('F:\\BaiduNetdiskDownload\\論文\\###論文數據\\pythonProject2\\Ensio\\論文\\詞典文件保存路徑\\攜程旅行游記攻略6837.xlsx')weibo_df.head(100)情感詞本體預覽
# 讀取import pandas as pddf = pd.read_excel('F:\BaiduNetdiskDownload\論文\###論文數據\詞典匯總\三個情感詞典匯總\其他詞典和分類\情感詞匯本體\情感詞匯本體.xlsx')df.head(10)實驗過程
提取可用數據特征
df = df[['詞語', '詞性種類', '詞義數', '詞義序號', '情感分類', '強度', '極性']]df.head()情感詞加載
Happy = []Good = []Surprise = []Anger = []Sad = []Fear = []Disgust = []for idx, row in df.iterrows():if row['情感分類'] in ['PA', 'PE']:Happy.append(row['詞語'])if row['情感分類'] in ['PD', 'PH', 'PG', 'PB', 'PK']:Good.append(row['詞語']) if row['情感分類'] in ['PC']:Surprise.append(row['詞語']) if row['情感分類'] in ['NA']:Anger.append(row['詞語']) if row['情感分類'] in ['NB', 'NJ', 'NH', 'PF']:Sad.append(row['詞語'])if row['情感分類'] in ['NI', 'NC', 'NG']:Fear.append(row['詞語'])if row['情感分類'] in ['NE', 'ND', 'NN', 'NK', 'NL']:Disgust.append(row['詞語'])Positive = Happy + Good +SurpriseNegative = Anger + Sad + Fear + Disgustprint('情緒詞語列表整理完成') print(Positive) print(Negative)庫、數據、詞典加載
from string import digits import jieba # 分詞 import re # 過濾特殊字符 import numpy as np # 輔助處理 import pandas as pd # 處理 import emoji # 過濾表情 import jieba.analyse # 分級級別權重 import imageio # 圖片 import jieba.posseg as pseg # 詞性標注 from wordcloud import WordCloud # 詞云 import os import matplotlib.pyplot as plt # 畫布 import difflib # 相似度判斷path = 'F:\\BaiduNetdiskDownload\\論文\\###論文數據\\pythonProject2\\Ensio\\論文\\詞典文件保存路徑\\result\\juzi_1.txt'# 臺灣大學積極詞典 pos_dict_path = 'F:\\BaiduNetdiskDownload\\論文\\###論文數據\\pythonProject2\\Ensio\\論文\\詞典文件保存路徑\\ntusd-positive.txt' # 臺灣大學消極詞典 neg_dict_path = 'F:\\BaiduNetdiskDownload\\論文\\###論文數據\\pythonProject2\\Ensio\\論文\\詞典文件保存路徑\\ntusd-negative.txt' # 臺灣大學停用詞 no_dict_path = 'F:\\BaiduNetdiskDownload\\論文\\###論文數據\\pythonProject2\\Ensio\\論文\\詞典文件保存路徑\\not.txt' # 常用中文停用詞 cn_stopwords = 'F:\\BaiduNetdiskDownload\\論文\\###論文數據\\pythonProject2\\Ensio\\論文\\詞典文件保存路徑\\cn_stopwords.txt' # 宋體字體 simsun_path = 'F:\\BaiduNetdiskDownload\\論文\\###論文數據\\pythonProject2\\Ensio\\論文\\詞典文件保存路徑\\simsun.ttc' # 詞云背景圖片 bg_path = 'F:\\BaiduNetdiskDownload\\論文\\###論文數據\\pythonProject2\\Ensio\\論文\\詞典文件保存路徑\\五臺山字.jpg'# 評論元數據 excel_path = 'F:\\BaiduNetdiskDownload\\論文\\###論文數據\\pythonProject2\\Ensio\\論文\\詞典文件保存路徑\\攜程旅行游記攻略6837.xlsx' # 情感分析結果輸出 初始文件為空 Sentiment_analysis_ioPath = 'F:\\BaiduNetdiskDownload\\論文\\###論文數據\\pythonProject2\\Ensio\\論文\\詞典文件保存路徑\\result\\攜程旅行游記攻略6837-情感分析結果.txt' # 評論格式化寫出 初始文件為空 comment_ioPath = 'F:\\BaiduNetdiskDownload\\論文\\###論文數據\\pythonProject2\\Ensio\\論文\\詞典文件保存路徑\\result\\攜程旅行游記攻略-純文本6837.txt' # 句子級寫出 juzi_path = 'F:\\BaiduNetdiskDownload\\論文\\###論文數據\\pythonProject2\\Ensio\\論文\\詞典文件保存路徑\\result\\juzi_1_1.txt' # 詞云保存路徑 初始文件為空 wordcloud_ioPath = 'F:\\BaiduNetdiskDownload\\論文\\###論文數據\\pythonProject2\\Ensio\\論文\\詞典文件保存路徑\\result\\五臺山詞云.png' # 五臺山關鍵字詞典 初始不為空 wts_dict_path = 'F:\\BaiduNetdiskDownload\\論文\\###論文數據\\pythonProject2\\Ensio\\論文\\詞典文件保存路徑\\五臺山關機鍵詞典.txt'元數據預處理
weibo_text = weibo_comment[0] weibo_text = "".join(weibo_text.split()) weibo_text = re.sub(u"([^\u4e00-\u9fa5\u0030-\u0039\u0041-\u005a\u0061-\u007a])", "",weibo_text) print(weibo_text)元數據預處理二
def filter_emoji(test_str):result = emoji.demojize(test_str)return emoji.emojize(result) def pretreatment():# 加載excelexcel = pd.read_excel(excel_path) #encoding = utf-8# punt_list = ',.!?;~。!?;~… '.encode('utf8').decode('utf8')# 暫時留取時間,不做處理data = excel[['Title', 'Notes']]# 生成單維DataFrame 并刪除重復行datafreame = pd.DataFrame(data).dropna(how='any').drop_duplicates(subset='Notes')# 去除空值 NaNdataToTwo = datafreame.dropna(axis=0)# 存放comment列----》字符串列表dataToTwoStr = []for i in dataToTwo['Notes']:dataToTwoStr.append(filter_emoji(str(i))) # 表情處理#print(dataToTwoStr)return dataToTwoStr pretreatment()情感值計算方法
import jiebaimport timedef emotion_caculate(text):positive = 0negative = 0anger = 0disgust = 0fear = 0sad = 0surprise = 0good = 0happy = 0wordlist = jieba.lcut(text)wordset = set(wordlist)wordfreq = []for word in wordset:freq = wordlist.count(word)if word in Positive:positive+=freqif word in Negative:negative+=freqif word in Anger:anger+=freqif word in Disgust:disgust+=freqif word in Fear:fear+=freqif word in Sad:sad+=freqif word in Surprise:surprise+=freqif word in Good:good+=freqif word in Happy:happy+=freqemotion_info = {'length':len(wordlist),'positive': positive,'negative': negative,'anger': anger,'disgust': disgust,'fear':fear,'good':good,'sadness':sad,'surprise':surprise,'happy':happy,}indexs = ['length', 'positive', 'negative', 'anger', 'disgust','fear','sadness','surprise', 'good', 'happy']return pd.Series(emotion_info, index=indexs) weibo_comment = weibo_df['Notes']實例
emotion_caculate(text='景區人太多了吧,物價還死貴死貴的,買瓶水要5塊,隨處可見的垃圾,讓人心情不好!!')去除停用詞,冗余數據,進行分詞
# 相似度計算 def get_equal_rate_1(str1, str2):return difflib.SequenceMatcher(None, str1, str2).quick_ratio() # 對比關鍵字詞典 def comment_base_split(wts_lst, comment_base):index = []for i in wts_lst:if i in comment_base:sall_index = [r.span() for r in re.finditer(i, comment_base)]index.append(sall_index)index_commnet = list(index)t = []# print(index_commnet)for i in index_commnet:for j in i:tutle = list(j)if tutle[0] < 10:tutle[0] = 0else:tutle[0] = tutle[0] - 30if tutle[1] < 10:tutle[1] = 20else:tutle[1] = tutle[1] + 30t.append(tutle)for s in range(len(index_commnet)):index_commnet[s] = t# print(index_commnet)comment_base_split_dict = []for i in index_commnet:for j in i:comment_base_split_dict.append(comment_base[j[0]:j[1]])for i in comment_base_split_dict:for j in comment_base_split_dict:if get_equal_rate_1(i, j) > 0.85: # 相似度大于0.85 刪除comment_base_split_dict.remove(j)breakreturn comment_base_split_dict# 加載關鍵字詞典 def wts_dict():wts_lst = []with open(wts_dict_path, encoding='utf-8') as f:for line in f:line = line.replace("\n", "").replace("\r", "")wts_lst.append(line)return wts_lst # 加載詞典 def dict_load(path):print("文件加載!")dt = []with open(path, encoding='utf-8-sig') as f:for line in f:if line.strip() != '': # 去除空格dt.append(line.strip())return (dt) def first_Load():neg_dict = [] # 消極情感詞典pos_dict = [] # 積極情感詞典no_dict = [] # 否定詞詞典pos_dict = dict_load(pos_dict_path)# print(pos_dict)neg_dict = dict_load(neg_dict_path)# print(neg_dict)no_dict = dict_load(no_dict_path)# print(no_dict)return pos_dict, neg_dict, no_dict# dicts = {,{,[]}} def batchProcessing():with open(juzi_path, 'a', encoding='utf-8') as f:# 加載五臺山關鍵字詞典wts_lst = wts_dict()# 三個情感分析詞典加載pos_dict, neg_dict, no_dict = first_Load()# 獲取評論 字符串列表inputs = pretreatment()lsts = []lst = []#print(inputs)for i in inputs:comment_base = i.replace("\n", "")lst.append(comment_base_split(wts_lst, comment_base))breakfor i in lst:for j in i:base = re.sub(u"([^\u4e00-\u9fa5\u0030-\u0039\u0041-\u005a\u0061-\u007a])", "", j)remove_digits = str.maketrans('', '', digits)res =base.translate(remove_digits)emo = emotion_caculate(text=res)lsts.append(emo)f.write(res + '\n')print("句子級寫入完成!")return lsts #batchProcessing()情感值預覽
lsts = batchProcessing() # s = lsts[0] # length 31 # positive 2 正向 # negative 0 負向 # anger 0 憤怒 # disgust 0 厭惡 # fear 0 恐懼 # sadness 0 悲傷 # surprise 0 驚喜 # good 2 好 # happy 0 快樂 # dtype: int64 pos_scores = [] neg_scores = [] for i in lsts:pos_scores.append(int(i[1]))neg_scores.append(int(i[2]))final_scores = sum(pos_scores) - sum(neg_scores) # 情感分 print(final_scores) lsts計算結果
第1天2014-09-05前記:山西游的想法來自于父親,他說幾乎游遍了祖國的大好河山,現在全中國的省份只有山西、西藏和寧夏沒有去過。我琢磨著想和爸爸一起旅游,所以便說我們帶你去山西吧,老爸隨即說了他特別想去的幾個景點,我上網查山西地圖,可以啊,這幾個景點幾乎縱貫山西,從南到北。。。好吧,反正說都說了,就走吧!寫這篇游記的初衷:之前去過不少地方旅游,從來沒有寫過游記,但是這次去山西,感觸太深了。每次 做攻略都會上網參照網友的旅游信息,自己也得益不少,這次去了山西以后,發現有不少信息,主要是交通方面的,都已經不是最新的了,所以想把自己認為是最新的消息提供出來,方便之后想去山西(僅限我去過的地方哈:))的朋友們。 第一天都是在路上度過的,因為第一站去晉城皇城相府,而上海沒有直接到晉城的火車,所以我選擇了離晉城相對較近而且長途車班次較多的鄭州作為中轉站。上海到鄭州的動車大概7個半小時左右,長途汽車站就在火車站對面,鄭州到晉城的長途車差不多一個小時一班,最晚到6點。我們下午2點半到達鄭州,買到了3點半前往晉城的車票,車程說是3個半小時,不過從汽車站開到高速入口這一路堵的不行,足足多出了40分鐘,最后快8點才到達晉城客運東站。需要注意的是,現在晉城的長途汽車已經全部從客運東站始發和到達,之前的省運和市運已退出歷史舞臺,據說是為了緩解市內交通。客運東站地點比較偏,離我們住的地方也就4,5公里路,正常的出租費用在11元左右, 不過出租車司機都不愿意去,畢竟在汽車站候客的出租車總想拉個遠差,問了一個黑車,說20能走,這樣的價錢我還是能接受的。之后在各地的火車站和汽車站都碰到了出租車不愿去酒店的情形,稍后再說。晉城的酒店定在錦江之星金廣快捷七星廣場店,因為我有錦江之星的會員卡,而且我覺得錦江之星在全國各地的分店設施都差不多,屬于滿規范化的連鎖快捷酒店,價錢折后也在150之內,所以這次旅行地只要有錦江之星的,我都會預訂。上海鄭州晉城,第2天2014-09-06晉城 美好的一天從美好的早餐開始,這是在山西的第一頓早飯,山西的豆腐很出 名,這看上去太贊了。吃完早飯,出發去此行的第一個景點——皇城相府。晉城晉城 晉城到皇城相府的車子每天從早上6點半開始,幾乎一個小時一班,最后一般是晚上6點半。車費15,車程一個半小時。因為去完皇城相府,我們還是要回到晉城客運東站再坐車前往臨汾,所以一早我們就帶了行李,直接把行李寄放在了汽車站,4元一件。皇城相府 皇城相府是康熙的老師、《康熙字典》總閱官、清代名相陳廷敬的府邸。明清時期生活在這里的陳氏家族科甲鼎盛,有多達38人走上仕途,而且大多政績顯赫,可謂是翰林世家。導游說,皇城相府后來是讓老百姓居住的,直到1998年才被國家收回作為旅游景點開發。說到導游,我之前去買票的時候忘了找在售票處旁邊的導 游,結果進了景區,被告之有實習導游,50一次(導游是80),不過實習導游和正式導游還是有差距的,我蹭聽了好多別人家的導游。皇城相府皇城相府皇城相府皇城相府皇城相府 彩旗飄揚的地方是階梯,長長的階梯一共53格(應該沒有記錯),陳廷敬當官53載,巧合!皇城相府 從皇城相府回晉城的車,在景區門口是沒有站的,不過可以有幾種方式回去,一種就是在景區門口等開往皇城相府的車,然后車會把你帶到北留鎮上,皇城相府是屬于北留鎮的,再從北留鎮上坐車回晉城;還有一種就是在景區門口叫面的,3元一人,也是把你拉到北 留鎮上的汽車點。兩種方式花費一樣,唯一不同的是,可能第一種方式需要等很長時間才會有車來,而第二種應該是招手即有的。我比較幸運,出了景點就有一部到站的汽車,所以我們就上了。回到晉城客運東站,直接買票去臨汾,好巧的是買到了5分鐘后的汽車,時間算的太好了。 從晉城開往臨汾大概需要4個小時左右,途徑一個休息站休息的時候,看到一張山西全省的旅游景點地圖。我給老爸指了指要去的那些景點,老爸說,離的那么遠啊,你太偉大了,哈哈。 臨汾沒有錦江之星,所以預訂了離汽車站不遠的堯都區政府商務酒店,三人套房,兩個房間,還不錯,比周圍的那些酒店看上去好,反正湊活一夜,明天一早就上路了。,第3天2014-09-07 前往壺口瀑布的交通不是很方便,我在淘寶上覓得壺口小李,成人190一位,包含來去車費和門票及保險,享受免票政策的人群120一位。全程高速,車上備有WIFI,有免費的接送站服務,他們還會提前一天和當天早上電話確認,性價比滿高的,最最主 要是方便。其實這就是包車,不過人家信譽做出來了,就比較可靠。聽說從今年9月開始,自己的車不能開進景區了,從售票處到景點還有4公里的路,所以必須坐景點提供的所謂環保車,20一人,好吧。黃河壺口瀑布風景名勝區 壺口瀑布的雄偉只有自己去了才能感受到,我們在那里足足呆了2個多小時,只是呆呆地看。我們運氣好好,包車的司機說這幾天水特別大,只要靠近圍欄將近10米左右,就感覺像下雨一般,密密的,這直接導致了我們全身濕透,而且干了以后到處留下了泥印。 水中冒煙的奇景描述的就是這種畫面吧。黃河壺口瀑布風景名勝區黃河壺口瀑布風景名勝區黃河壺口瀑布風景名勝區黃河壺口瀑布風景名勝區黃河壺口瀑布風景名勝區 每頭毛驢頭上都貼著它們的名字。黃河壺口瀑布風景名勝區 這位叫壺口老什么來著,還看到過壺口花花,壺口小花什么的。黃河壺口瀑布風景名勝區 壺口瀑布一游非常順利,前一天晚上到我們出發一直都在下大雨,車子上了高速,開到一半,雨停了。路上幾乎都沒有車,超爽。車程2個小時,再加上景區呆2個多小時,我們是早上8點出發的,下午3點不到已經回到了市區。我買了下午4點臨汾到平遙的火車,本想去看看能夠改簽到早一班的伐,不過沒有座位了,只好等咯。平遙古城的住宿是定在錦江之星平遙古城店,離火車站不遠,靠近西大門,住宿正好是周日和周一兩天,還搶到了錦江之星的百元房,實在是劃算。 積極傾向值:56 消極傾向值:64 情感傾向:積極 ------------------詞云
詞云繪制
def toWordCloud():# 停用詞fr = open(cn_stopwords, 'r', encoding='utf-8')stop_word_list = fr.readlines()new_stop_word_list = []for stop_word in stop_word_list:stop_word = stop_word.replace('\ufeef', '').strip()new_stop_word_list.append(stop_word)with open(path, 'r', encoding='utf-8') as f:words = f.read()word_dict = {}word_list = ''words_arr = words.split('\n')words_jiebas = []for i in words_arr:words_jiebas.append(jieba.lcut(i))for words_jieba in words_jiebas:for word in words_jieba:if (len(word) > 1 and not word in new_stop_word_list):word_list = word_list + ' ' + wordif (word_dict.get(word)):word_dict[word] = word_dict[word] + 1else:word_dict[word] = 1##print(word_list)# print(word_dict)# 按次數進行排序sort_words = sorted(word_dict.items(), key=lambda x: x[1], reverse=True)print(sort_words[0:101]) # 輸出前0-100的詞#color_mask = imageio.imread(bg_path)wc = WordCloud(background_color="white", # 背景顏色max_words=1000, # 顯示最大詞數font_path=simsun_path, # 使用字體min_font_size=20,max_font_size=500,random_state=42, # 隨機數collocations=False, # 避免重復單詞width=1600,height=1200,margin=10,#mask=color_mask) # 圖幅寬度)#wc.recolor([random_state, color_func, colormap])wc.generate(word_list)wc.to_file(wordcloud_ioPath)plt.figure(dpi=100)# 以圖片的形式顯示詞云plt.imshow(wc,interpolation='catrom',vmax=1000)# 關閉圖像坐標系plt.axis("off")plt.show()詞語預覽
不足之處
- 實驗過程有大量冗余代碼沒有過濾優化。
- 詞典構建只是簡簡單單的對三個詞典進行了合并。
- 現階段只是做初步試驗。
總結
以上是生活随笔為你收集整理的基于词典的情感分析实验的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: gcc -fPIC选项
- 下一篇: Android Studio导出jar包