SNOWNLP情感分析报错解决

snownlp是python中的一个库,从文件导入数据后调用函数即可进行情感分析。

数据:100条微博评论数据,标签1为正向,0为负向

SNOWNLP情感分析报错解决

代码:

import sys
import pandas as pd #加载pandas
from snownlp import sentiment #加载情感分析模块
from snownlp import SnowNLP
#import importlib

importlib.reload(sys)
sys.setdefaultencoding('utf-8')

text=pd.read_excel('./weibo.xlsx',header=0) #读取文本数据
text0=text.iloc[:,0] #提取所有数据(第0列)
print(text0)
text1=[i.encode("utf-8").decode('utf-8') for i in text0] #上一步提取数据不是字符而是object,所以在这一步进行转码为字符
text1=[i for i in text0]
print(text1)
#
t1=time.time()
sentiment.train('D:/pythontool/Anaconda/Lib/site-packages/snownlp/sentiment/neg.txt', 'D:/pythontool/Anaconda/Lib/site-packages/snownlp/sentiment/pos.txt') #对语料库进行训练,把路径改成相应的位置。我这次练习并没有构建语料库,用了默认的,所以把路径写到了sentiment模块下。
t2=time.time()
print("训练语料库用时",t2-t1)
#
t3=time.time()
senti=[SnowNLP(i).sentiments for i in text1] #遍历每条评论进行预测
t4=time.time()
print("预测用时",t4-t3)
#
newsenti=[]
#
for i in senti:
    if (i>=0.6):
        newsenti.append(1)
    else:
        newsenti.append(0)
text['predict']=newsenti #将新的预测标签增加为text的某一列,所以现在text的第0列为评论文本,第1列为实际标签,第2列为预测标签
counts=0
for j in range(len(text.iloc[:,0])): #遍历所有标签,将预测标签和实际标签进行比较,相同则判断正确。
    if text.iloc[j,2]==text.iloc[j,1]:
        counts+=1
print("准确率为:%f"%(float(counts)/float(len(text))))#输出本次预测的准确率

修改默认编码

import sys
import importlib
importlib.reload(sys)
sys.setdefaultencoding('utf-8')

实际这一部分完全不需要,写了会画蛇添足,Python3字符串默认编码utf-8, 所以sys.setdefaultencoding不存在了,python2需要写。详细可看(都是踩过的坑)Python3异常-AttributeError: module ‘sys’ has no attribute ‘setdefaultencoding_琦彦的博客-CSDN博客_python3 sys.setdefaultencoding

Python 解决 :NameError: name ‘reload’ is not defined 问题_lxw1844912514的博客-CSDN博客

提取数据:

import pandas as pd #加载pandas
text=pd.read_excel('./weibo.xlsx',header=0) #读取文本数据
text0=text.iloc[:,0] #提取所有数据(第0列)
print(text0)
text1=[i.encode("utf-8").decode('utf-8') for i in text0] #上一步提取数据不是字符而是object,所以在这一步进行转码为字符
text1=[i for i in text0]
print(text1)

转码这一块从本质上来说,编码和解码就是Python中str和bytes这两种字符串类型之间的互相转换。, str包含一个encode方法,使用特定编码将该字符串其转换为一个bytes,这称之为编码。 bytes类包含了一个decode方法,也接受一个编码作为单个必要参数,并返回一个str,这称之为解码。这种转换操作是显式的操作,且必须根据数据被编码时采用的编码类型进行解码。

python3似乎对一切的unicode都那么的友好,当一个字符串里存在unicode的时候,只要字符串是硬编码的,就可以转换成中文打印在控制台上,但是,假如你。。的这段含有’\u’的unicode编码不是硬编码进脚本的,而是通过requests在网上爬的。。。那么你会发现,你打印出来的,还是长这样的unicode编码,换句话说,解释器这个时候根本就没认出这东西原来是unicode编码,当成普通的字符序列了。

然后本人就想,encode之后在decode不就又回到初始状态了吗,实际操作之后证明是可以的,并不影响运行结果。(这点还请评论区指点一二)

详细可看AttributeError: ‘str’ object has no attribute ‘decode’_微信-支付宝的博客-CSDN博客

训练语料库

from snownlp import sentiment
sentiment.train('D:/pythontool/Anaconda/Lib/site-packages/snownlp/sentiment/neg.txt', 'D:/pythontool/Anaconda/Lib/site-packages/snownlp/sentiment/pos.txt')

语料库为snownlp自带语料,主题为购物评论,所以对购物评论的情感分析准确率较高。

SNOWNLP情感分析报错解决

接下来就是对每一条评论进行预测,然后贴标签,再与原标签对比计算准确率。

丛实际运行来看,训练语料需要较长时间,差不多10分钟,预测还是挺快的,由于语料是购物评论,数据是微博数据,所以准确率不高。

SNOWNLP情感分析报错解决

跑完才发现预测那块时间写错了,不想再跑一次了哈哈哈。

这是本人的处女作,有不足之处还请多多指教,刚开始接触nlp,希望能和大家多多交流。

参考博客:snownlp 原理_snownlp入门_马福报的博客-CSDN博客

自建语料库后准确率提高不少

SNOWNLP情感分析报错解决

Original: https://blog.csdn.net/qq_53139305/article/details/124291443
Author: NLP小白白白白白
Title: SNOWNLP情感分析报错解决

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/528112/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球