SNOWNLP情感分析报错解决

SNOWNLP情感分析报错解决,第1张

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

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

代码:

# 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自带语料,主题为购物评论,所以对购物评论的情感分析准确率较高。

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

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

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

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

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

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/langs/714040.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-24
下一篇 2022-04-24

发表评论

登录后才能评论

评论列表(0条)

保存