百度已收录

基于PaddleHub进行情感分析


情感倾向分析(Sentiment Classification,简称Senta)针对带有主观描述的中文文本,可自动判断该文本的情感极性类别并给出相应的置信度,能够帮助企业理解用户消费习惯、分析热点话题和危机舆情监控,为企业提供有利的决策支持。

Senta是百度NLP开放的中文情感分析模型,可以用于进行中文句子的情感分析,输出结果为{正向/中性/负向}中的一个


准备数据集

撰写本文时,站长采集了《云边有个小卖铺》豆瓣书评来进行测试


安装第三方工具包

pip install paddlepaddle(推荐安装 1.4.0版本以上)
pip install paddlehub

导入paddlehub并进行测试

# 导入模块
import paddlehub as hub
# 加载模型
senta = hub.Module(name='senta_lstm')

# 准备句子
result=[]
with open('H://douban.txt','r',encoding='utf-8') as f:
    for line in f:
        result.append(line.strip('\n'))

# 情绪识别
results = senta.sentiment_classify(data={"text":result})
# 输出识别结果
for result in results:
    print(result)

模型的选择与释义

Senta开源了一系列模型,供用户选择:

  • BOW(Bag Of Words)模型,是一个非序列模型,使用基本的全连接结构
  • CNN(Convolutional Neural Networks),是一个基础的序列模型,能处理变长序列输入,提取局部区域之内的特征
  • GRU(Gated Recurrent Unit),序列模型,能够较好地解决序列文本中长距离依赖的问题
  • LSTM(Long Short Term Memory),序列模型,能够较好地解决序列文本中长距离依赖的问题
  • Bi-LSTM(Bidirectional Long Short Term Memory),序列模型,采用双向LSTM结构,更好地捕获句子中的语义特征
模型名 PaddleHub Module
BOW hub.Module(name='senta_bow')
CNN hub.Module(name='senta_cnn')
GRU hub.Module(name='senta_gru')
LSTM hub.Module(name='senta_lstm')
Bi-LSTM hub.Module(name='senta_bilstm')

预训练模型Senta完成情感分析预测

安装第三方工具包

pip install xlsxwriter

代码编写测试

import os
import paddlehub as hub
import xlsxwriter
# 这个文件就是你的数据集文件,如果名字不一样只修改这里即可,数据集格式上方已经给出。
txtpath = "test.txt"

# 这里就是预测完输出的文件,就是把结果输出到哪里,文件名字自己随意修改。
outtxtpath = 'output.xlsx'

# 将数据集文件转换为list格式
with open(txtpath, 'r') as f:
    test_text = []
    for line in f:
        test_text.append(line.strip())
print(test_text)

# 加载预训练模型
senta = hub.Module(name="senta_bilstm")

# 将得到的数据list进行预测
input_dict = {"text": test_text}
results = senta.sentiment_classify(data=input_dict)

# 将输出结果写入文件
workbook = xlsxwriter.Workbook(outtxtpath) # 建立文件
worksheet = workbook.add_worksheet()
id = 0
for result in results:
    print(result['text'] + '\t' + result['sentiment_key'])
    worksheet.write(id,0,result['text'])
    worksheet.write(id,1,result['sentiment_key'])
    id+=1
workbook.close()
print('结果已经输入到' + outtxtpath + '文件')