情感分析
文本情感分析(Sentiment Analysis)是自然语言处理(NLP)中常见的也是很重要的一环,又称意见挖掘、倾向性分析等。它是对带有情感色彩的主观性文本进行分析、处理、归纳和推理的过程。它包括情感分类(情感倾向分析)、情感检索、情感抽取等。
我们今天只来练一练情感分类。所谓情感分类,指的是对文本进行褒义、贬义、中性的判断。在大多应用场景下,只分为两类。例如对于“好评”和“差评”这两个词,就属于不同的情感倾向。与文本分类不同的是,情感分类不基于内容本身,而是基于文本持有的情感态度。
那么基于机器学习或是深度学习的情感分类方法的主要流程包括:数据处理——提取文本情感特征——构建分类器分类。下面我们将详细介绍如何使用深度学习模型中的LSTM模型来实现文本的情感分类。不想看我啰嗦的之间点这里下载数据和全部代码哦!
预分析数据
我们用到的语料是京东评论数据集,这里是数据啦~ 提取码:iu43。
首先我们来看一看数据,好评和差评的数据分别存储在两个Excel里,样式如下图:
其中好评样本有10677条,差评有10428条,样本类别算均衡。我们接下来看看语句长度的分布情况:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib import font_manager
# 设置matplotlib绘图时的字体
my_font = font_manager.FontProperties(fname="/Library/Fonts/Songti.ttc")
# 读取数据
neg=pd.read_excel('D:/S/Learn/NLP/Jingdong/neg.xls',header=None,index=None)
pos=pd.read_excel('D:/S/Learn/NLP/Jingdong/pos.xls',header=None,index=None)
df=np.concatenate((pos[0], neg[0]))
#%%句子长度分布直方图
Num_len=[len(text) for text in df]
bins_interval=10#区间长度
bins=range(min(Num_len),max(Num_len)+bins_interval-1,bins_interval)#分组
plt.xlim(min(Num_len), max(Num_len))
plt.title("Probability-distribution")
plt.xlabel('Interval')
#plt.ylabel('Probability')
# 频率分布normed=True,频次分布normed=False
#prob,left,rectangle = plt.hist(x=Num_len, bins=bins, normed=True, histtype='bar', color=['r'])#分布直方图
plt.ylabel('Cumulative distribution')
prob,left,rectangle = plt.hist(x=Num_len, bins=bins,normed=True,cumulative=True, histtype='step', color=['r'])#累计分布图
plt.show()
分别得到预料中句子长度的分布直方图和累计分布图:
因为LSTM接受的句子长度或者叫序列长度都是固定的,所以在后面数据处理中我们需要将句子裁剪出一样的长度,我们根据语料的累积分布情况求样本中90%概率的句子长度作为裁剪后句子的统一长度。
#%%求分位点
import math
def quantile_p(data, p):
data.sort()
pos = (len(data) + 1)*p
#pos = 1 + (len(data)-1)*p
pos_integer = int(math.modf(pos)[1])
pos_decimal = pos - pos_integer
Q = data[pos_integer - 1] + (data[pos_integer] - data