NLP:用Senta做文本情感分析

筆者在做Web敏感信息檢測功能時,需要用到NLP領域的文本情感分析,這裏用的是百度的預訓練模型Senta。

一、下載預訓練模型

百度提供的預訓練模型在GitHub上Senta,該模型所需環境是PaddlePaddle,這裏就不得不吐槽一下在線安裝的速度簡直不要太慢。

二、修改代碼

筆者的需求是我將一個網頁中含有敏感信息的語句存入一個文件中,然後利用Senta對文件中的所有數據進行預測,並返回預測的概率(接近1表示積極情感,接近0表示消極情感)。代碼如下:

# encoding=utf-8
import os
import time
import io
from datetime import datetime
import random
import jieba

# def sentiment_pro(all_data):
if __name__ == "__main__":
    all_data = [
            ['敏感詞','含有敏感詞的語句'],
            ['敏感字','含有敏感詞的語句']]
    start = datetime.now()
#     #將含有敏感詞的句子保存到一個文件中,用於預測
    basedir = os.path.abspath(os.path.dirname(__file__))
    file_name = basedir + '\\WebSensitiveContent\\' + str(datetime.now()).replace(":","").replace(".",'').replace("-","").replace(" ","") + str(random.randint(0,100)) + '.txt'
    with io.open(file_name, "w", encoding='utf8') as fin:
            for data_sentence in all_data:
                    seg_list = jieba.cut(data_sentence[1])  # 默認是精確模式
                    data_string = " ".join(seg_list)
                    fin.write('1'+'\t'+data_string+'\n')#第一列中寫個固定值1是因爲模型的輸入格式要求,與結果無關,可以是任意整數
    #調用另一個python文件,使用深度模型對生成的文件進行情感預測
    dir = "python ./Senta-master/sentiment_classify.py --test_data_path ./Senta-master/data/test_data/corpus.test --word_dict_path ./Senta-master/C-API/fluid-senti-classify_config/config/train.vocab --mode infer --model_path ./Senta-master/C-API/fluid-senti-classify_config/config/Senta/"
    result = os.popen(dir)
    res = result.read()#讀取返回結果
    #將檢測的結果保存到reslut_pos_score中,返回的結果是0到1之間的小數,越接近1代表情感越偏向積極,反正亦然
    reslut_pos_score = []
    for line in res.splitlines():
        print(line)
    os.remove(file_name)#刪除臨時生成的敏感詞文檔

    #加將正向敏感詞和負向敏感分別加入到一個list中,用於後面對敏感次的檢測
    PositiveSensitiveWords = list()
    NegativeSensitiveWords = list()

    with open('./Senta-master/mydict/na/party-department.txt', 'r', encoding='utf8') as f:
        for line in f.readlines():
                PositiveSensitiveWords.append(line.replace("\n",""))
    with open('./Senta-master/mydict/na/party-leader.txt', 'r', encoding='utf8') as f:
        for line in f.readlines():
                PositiveSensitiveWords.append(line.replace("\n",""))
    with open('./Senta-master/mydict/na/party-meeting.txt', 'r', encoding='utf8') as f:
        for line in f.readlines():
                PositiveSensitiveWords.append(line.replace("\n",""))
    with open('./Senta-master/mydict/na/reaction.txt', 'r', encoding='utf8') as f:
        for line in f.readlines():
                PositiveSensitiveWords.append(line.replace("\n",""))
    with open('./Senta-master/mydict/po/brute.txt', 'r', encoding='utf8') as f:
        for line in f.readlines():
                NegativeSensitiveWords.append(line.replace("\n",""))
    with open('./Senta-master/mydict/po/drug.txt', 'r', encoding='utf8') as f:
        for line in f.readlines():
                NegativeSensitiveWords.append(line.replace("\n",""))
    with open('./Senta-master/mydict/po/superstition.txt', 'r', encoding='utf8') as f:
        for line in f.readlines():
                NegativeSensitiveWords.append(line.replace("\n",""))
        
    i = 0 #用於確定當前敏感詞的索引值,以便於找到對應的情感分析結果
    result_need_remove = []#用於存儲通過情感判斷後不需要報警的敏感句子
    for SensitiveWord in all_data:
        if SensitiveWord[0] in PositiveSensitiveWords:#判斷是否爲正向敏感詞
                if float(reslut_pos_score[i]) > 0.6:#正向敏感詞 並且情感是積極的 則移除
                        print(SensitiveWord[0]+":是正向敏感次" + SensitiveWord[1] + "情感得分爲:"+str(reslut_pos_score[i]))
                        result_need_remove.append(SensitiveWord)
        elif SensitiveWord[0] in NegativeSensitiveWords:#判斷是否爲負向敏感詞
                if float(reslut_pos_score[i]) < 0.35:#負向敏感詞 並且情感是消極的 則移除
                        print(SensitiveWord[0]+":是負向敏感次" + SensitiveWord[1] + "情感得分爲:"+str(reslut_pos_score[i]))
                        result_need_remove.append(SensitiveWord)
        else:#中性或者是絕對敏感詞
                print(SensitiveWord[0]+":是中性或者絕對敏感詞" + SensitiveWord[1] + "情感得分爲:"+str(reslut_pos_score[i]))
        i = i + 1
    for need_remove in result_need_remove:
            all_data.remove(need_remove)
    end = datetime.now()
    print('Running time: %s Seconds'%(end-start))

 

該代碼文件存放的位置是sentiment_classify.py的上級目錄。結構如下圖:

筆者沒有展示訓練的過程,而是直接先用Senta也有的訓練模型。我看了一下訓練的數據量是1萬條。測試結果只能說還行吧,畢竟也就一萬條數據。

 

 

 

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