基於Word2vec的詩詞多情感分析


Word2vec構造情感字典

基本含義

基於Word2vec的字向量能從大量未標注的普通文本數據中無監督地學習到字向量,而且這些字向量包含了字與字之間的語義關系,正如現實世界中的“物以類聚,類以群分”一樣,字可以由它們身邊的字來定義。

從原理上講,基於字嵌入的Word2vec是指把一個維數為所有字的數量的高維空間嵌入到一個維數低得多的連續向量空間中,每個單字被映射為實數域上的向量。把每個單字變成一個向量,目的還是為了方便計算,比如“求單字A的同義字”,就可以通過“求與單字A在cos距離下最相似的向量”來做到。相關案例可參看《作為一個合格的“增長黑客”,你還得重視外部數據的分析!》。下面是基於Word2vec的字向量模型原理示意圖。

 

情感字典

首先加載咱們的詩詞數據,進行切分,然后用word2vec進行訓練

然后將我們需要的七中情感詞進行關聯詞查找,並保存至對應的表中

from gensim import models from gensim.models.word2vec import Word2Vec import os def split_poetry(file='qi_jueju.txt'): all_data=open(file,"r",encoding="utf-8").read() # all_data=all_data.replace(',','').replace('。','')
    all_data_split=" ".join(all_data) with open("split.txt", "w", encoding='utf-8') as f: f.write(all_data_split) def train_vec(split_file='split.txt'): #word2vec模型
    vec_params_file= "vec_params.pkl"
    #判斷切分文件是否存在,不存在進行切分
    if os.path.exists(split_file)==False: split_poetry() #讀取切分的文件
    split_all_data=open(split_file,"r",encoding="utf-8").read().split("\n") #存在模型文件就去加載,返回數據即可
    if os.path.exists(vec_params_file): return Word2Vec.load(vec_params_file) #詞向量大小:vector_size,構造word2vec模型,字維度107,只要出現一次就統計該字,workers=6同時工作
    embedding_num=128 model=Word2Vec(split_all_data,vector_size=embedding_num,min_count=1,workers=6) #保存模型
 model.save(vec_params_file) return model if __name__ == '__main__': model=train_vec() emotion=['','','','','','',''] em_list={} for e in emotion: res = model.wv.most_similar(e, topn=100) lists=[] lists.append(e) for item in res: print(item[0] + "," + str(item[1])) lists.append(item[0]) em_list[e]=",".join(lists) import xlwt xl = xlwt.Workbook() # 調用對象的add_sheet方法
    sheet1 = xl.add_sheet('sheet1', cell_overwrite_ok=True) sheet1.write(0, 0, "emotion") sheet1.write(0, 1, 'similar') i=0 for k in em_list.keys(): sheet1.write(i + 1, 0, emotion[i]) sheet1.write(i + 1, 1, em_list[k]) i+=1 xl.save("emotion.xlsx")

結果:

 

 情感分析

任選一首古詩,對其進行單句切分,分析每個句子的情感,然后進行匯總,預測整首詩的情感

import pandas as pd def emotion(): data=pd.read_excel('emotion.xlsx') similar=data.get('similar') sad_list=str(similar[0]).split(',') fear_list=str(similar[1]).split(',') happy_list=str(similar[2]).split(',') anger_list=str(similar[3]).split(',') think_list=str(similar[4]).split(',') like_list=str(similar[5]).split(',') worry_list=str(similar[6]).split(',') return sad_list,fear_list,happy_list,anger_list,think_list,like_list,worry_list def test_sentence(sentence): sad_list, fear_list, happy_list, anger_list, think_list, like_list, worry_list=emotion() sad=fear=happy=anger=think=like=worry=0 for k in sentence: if k in sad_list: sad+=1
        elif k in fear_list: fear+=1
        elif k in happy_list: happy+=1
        elif k in anger_list: anger+=1
        elif k in think_list: think+=1
        elif k in like_list: like+=1
        elif k in worry_list: worry+=1 ans=max(sad,fear,happy,anger,think,like,worry) scord_list=[] scord_list.append(sad) scord_list.append(fear) scord_list.append(happy) scord_list.append(anger) scord_list.append(think) scord_list.append(like) scord_list.append(worry) emotion_list=['','','','','','',''] i=0 for i in range(len(scord_list)): if scord_list[i]==ans: print(emotion_list[i]) break
    return emotion_list[i] def read(): data=pd.read_excel('tang.xlsx') content_list=data.get('content') for i in range(len(content_list)): content=content_list[i].replace('\n','') ans_content=[] content_l=str(content).split('') for k in content_l: kk=str(k).split('') for it in kk: if it!='': ans_content.append(it) ans_emotion = {} for sentence in ans_content: print(sentence) emot=test_sentence(sentence) if emot not in ans_emotion.keys(): ans_emotion[emot] = 1
            else: ans_emotion[emot]+=1
        print(sorted(ans_emotion.items(), key=lambda item: item[1], reverse=True)) ans_emotion=dict(sorted(ans_emotion.items(), key=lambda item: item[1], reverse=True)) for key,value in ans_emotion.items(): print('整篇文章情感:'+key) break
        break




if __name__ == '__main__': read()

例如:宗武生日

 

 原詩鑒賞:

 

 

還是比較吻合的


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM