基於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()

例如:宗武生日

 

 原詩鑑賞:

 

 

還是比較吻合的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章