源码地址:https://gitee.com/xxr007/BILSTM-sentimentAnalysis.git
数据探测
得到了数据第一步应该做什么?当然是摸清这批数据的底,这个步骤也叫数据分析。对于用于做情感分析的文本数据,数据分析大概需要如下几步:
-
数据总量多少条
-
标签有几种,他们的比例是多少
-
每一条的评论的长度是多少
-
分词,去停用词后,每条评论的长度又是多少
-
做一个简单的词云图
对于文本数据的分析用pandas这个库就够用了
import pandas as pd
import jieba
import seaborn as sea
import matplotlib.pyplot as plt
#导入词云和参数
import pyecharts.options as opts
from pyecharts.charts import WordCloud
# train = pd.read_csv('data/train.csv')
# print(train.head)
# print(train.shape)#数据规模
# print(pd.unique(train['label'].values))# 有哪几个标签
# print(len(train[train['label']==0])/len(train)) #标签为0所占比例
#
# sentence_length = train['data'].apply(lambda x:len(x))#统计每个句子的长短
# sentence_length_fenci = train['data'].apply(lambda x:len(jieba.lcut(x)))
# print(sentence_length)
# print(sentence_length_fenci)
# sea.displot(sentence_length_fenci) #画出直方图
# plt.show()
#导入停用词
with open('data/stopwords.txt',encoding='utf-8') as f:
stopwords = []
# print(f.readlines())
for word in f.readlines():
stopwords.append(word.strip('\n'))
#分词
def fenci(sentence):
return [word for word in jieba.lcut(sentence) if word not in stopwords]
train_data = pd.read_csv('data/train.csv')
total_word = train_data['data'].apply(fenci)
#统计词频
word_dict = {
}
for words in total_word:
for word in words:
flag = word_dict.get(word,0)
if flag == 0:
word_dict[word] = 1
else:
word_dict[word] += 1
# print(word_dict)
#按词频排序
word_dict = sorted(word_dict.items(),key=lambda x:x[1],reverse = True )
# print('new',word_dict)
#生成词云
c = WordCloud()
c.add(series_name='',data_pair=word_dict[10:1000])
c.render()#默认生成一个html文件
数据加载与封装
使用torchtext这个库
-
首先声明一个Filed对象,这个对象指定处理数据的方式。
- tokenize传入分词的函数,将文本分割成token
- sequential表示是否切分数据,如果数据已经是序列化的了而且是数字类型的,则应该传递参数use_vocab = False和sequential = False.如LABEL
除了上面提到的关键字参数之外,Field类还允许用户指定特殊标记(用于标记词典外词语的unk_token,用于填充的pad_token,用于句子结尾的eos_token以及用于句子开头的可选的init_token)。设置将第一维是batch还是sequence(第一维默认是sequence),并选择是否允许在运行时决定序列长度还是预先就决定好
-
使用TabularDataset类告诉Filed需要处理那些数据。TabularDataset处理csv,tsv类文件很方面,使用TabularDataset.splits同时将训练集、验证集、测试集加载进来
-
建立词表,比如在训练集上建立词汇表,还可以将预训练的词向量加载到模型中。
TEXT.build_vocab(train, vectors=“glove.6B.100d”)
输入:包含一行一行文本