Python分词,情感分析工具 SnowNLP

2020-01-07  本文已影响0人  鬼子口音

Python:Python分词,情感分析工具 SnowNLP

官方源码文档 GitHub:https://github.com/isnowfy/snownlp
现在训练数据主要是针对电商服务类的评价,所以对其他的一些可能效果不是很好

image

安装

pip install snownlp

官方实例

from snownlp import SnowNLP
from snownlp import sentiment

s=SnowNLP(u'这个东西真的很赞')
print(s.words)
print(s.sentiments)

text = u'''
自然语言处理是计算机科学领域与人工智能领域中的一个重要方向。
它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法。
自然语言处理是一门融语言学、计算机科学、数学于一体的科学。
因此,这一领域的研究将涉及自然语言,即人们日常使用的语言,
所以它与语言学的研究有着密切的联系,但又有重要的区别。
自然语言处理并不是一般地研究自然语言,
而在于研制能有效地实现自然语言通信的计算机系统,
特别是其中的软件系统。因而它是计算机科学的一部分。
'''
s=SnowNLP(text)   #不只是情感分析,训练出的snownlp模型还有提取关键字,摘要等功能
print(s.sentiments)
print(s.keywords(3))
print(s.summary(3))

积极和消极分类

from snownlp import SnowNLP

l=["卧槽","牛逼","他妈的","打死你","优秀","哈哈哈哈哈啊哈","好评","信不信我弄死你啊","强强强强强强强强"]

#保存情感极性值小于等于0.3的结果为负面情感结果
f1=open('neg.txt','w',encoding='utf-8')

#保存情感极性值大于0.3的结果为正面情感结果
f2=open('pos.txt','w',encoding='utf-8')

for j in l:
    s=SnowNLP(j)
    if s.sentiments <=0.4:
        f1.write(j+'\t'+str(s.sentiments)+'\n')
    else:
        f2.write(j + '\t' + str(s.sentiments) + '\n')
f1.close()
f2.close()

将全部词语分为 积极和消极 分别加入到 txt 文件中,小于 0.4 的为消极,否则为积极

结果以及所得分数:

# neg.txt
他妈的 0.3124999999999998
打死你 0.3150105708245242
信不信我弄死你啊    0.07091943747997087
# pos.txt
卧槽  0.5
牛逼  0.6923786120385603
优秀  0.8703703703703702
哈哈哈哈哈啊哈 0.8684210526315791
好评  0.44578313253012036
强强强强强强强强    0.421874597530976

主要功能

中文分词(Character-Based Generative Model)
词性标注(TnT 3-gram 隐马)
情感分析(现在训练数据主要是买卖东西时的评价,所以对其他的一些可能效果不是很好,待解决)
文本分类(Naive Bayes)
转换成拼音(Trie树实现的最大匹配)
繁体转简体(Trie树实现的最大匹配)
提取文本关键词(TextRank算法)
提取文本摘要(TextRank算法)
tf,idf
Tokenization(分割成句子)
文本相似(BM25)

训练

包括分词,词性标注,情感分析
这里有一份待训练服务类评论的带有标签的文本文件(1为好评 0为差评)
训练数据集

开始分类训练

from snownlp import sentiment
import pandas as pd

def train_model():
    data=pd.read_csv(r"./DataSet.csv",header=0)
    train=data.iloc[:40000,[1,2]]
    test=data.iloc[40000:,[1,2]]
    train_neg=train.iloc[:,1][train.label==0]
    train_pos=train.iloc[:,1][train.label==1]
    train_neg.to_csv(r"./neg.csv",index=0,header=0)
    train_pos.to_csv(r"./pos.csv",index=0,header=0)
    test.to_csv(r"./test.csv",index=0,columns=['label','review'])
    sentiment.train(r'./neg.csv',r'./pos.csv')
    sentiment.save(r'C:/ProgramData/Miniconda3/Lib/site-packages/snownlp/sentiment/sentiment.marshal')

if __name__ == '__main__':
    train_model()

结果分别加入到 csv 文件中,然后进行模型训练,保存的路径是默认分词模块的路径,它会覆盖掉原来的 .marshal 模型文件

测试数据集

测试所得分数


import pandas as pd
from snownlp import SnowNLP
from snownlp import sentiment
import Train

if __name__ == '__main__':
    test=pd.read_csv(r"./test.csv")
    review_list=[review for review in test['review']]
    label_list=[label for label in test['label']]
    list_test=[(label,review) for label,review in list(zip(label_list,review_list)) if type(review)!=float]

    for j in list_test:
        print(j[1],j[0],SnowNLP(j[1]).sentiments)


    senti=[SnowNLP(review).sentiments for label,review in list_test]

    newsenti=[]
    for i in senti:  #预测结果为pos的概率,大于0.6我们认定为积极评价
        if(i>=0.6):
            newsenti.append(1)
        else:
            newsenti.append(0)

    counts=0
    for i in range(len(list_test)):
            if(newsenti[i]==list_test[i][0]):
                counts+=1

    accuracy=float(counts)/float(len(list_test))
    print("准确率为:%.2f" %accuracy)

测试得到的准确率分数是 90
现在就可以用新的模型来进行预测分类了

欢迎转载,但要声明出处,不然我顺着网线过去就是一拳。
个人技术博客:http://www.gzky.live

上一篇下一篇

猜你喜欢

热点阅读