总述
本文的目标是针对一个句子,给出其情感二分类,正向/负向。
代码存放地址:
https://github.com/stay-leave/BI-LSTM-sentiment-classify
输入数据集格式:
标签为1代表正向,0代表负向。
txt版本(即训练集、测试集不在一个文件内),这里我用的是百度千言数据集:
xls版本(即训练集、测试集在一个文件内):
输出数据示例:
接下来对整个流程作梳理。
数据处理
目标:将原始数据转为tensor并加载到dataloader,以供后续使用。
思路是将文本从txt或xls中提取出来,进行分词,划分句子长度,将句子进行编码,最后将其加载到pytorch的dataloader类。
1.提取文件
txt文件的提取:
def txt_file(self,inpath):
#输入TXT,返回列表
data = []
fp = open(self.inpath,'r',encoding='utf-8')
for line in fp:
line=line.strip('\n')
line=line.split('\t')
data.append(line)
data=data[1:]#去掉表头
return data
xls文件的提取:
def xls_file(self,inpath):
"""提取一个文件为一个列表"""
data = xlrd.open_workbook(self.inpath, encoding_override='utf-8')
table = data.sheets()[0]#选定表
nrows = table.nrows#获取行号
ncols = table.ncols#获取列号
numbers=[]
for i in range(1, nrows):#第0行为表头
alldata = table.row_values(i)#循环输出excel表中每一行,即所有数据
numbers.append(alldata)
return numbers
结果如下:
2.对句子进行分词
上面的数据中同时包含句子和标签,因此需要将其分开进行处理。
这是txt文件的代码,若使用xls文件,需要注释掉splitt函数的label那一行,取消下一行的注释。
def tokenlize(self,sentence):
#分词,只要/保留 中文/其他字符,单句
#sentence = re.sub('[^\u4e00-\u9fa5]+','',sentence)
URL_REGEX = re.compile(r'(?i)\b((?:https?://|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'".,<>?«»“”‘’]))',re.IGNORECASE)
sentence= re.sub(URL_REGEX,'', sentence)# 去除网址
sentence =jieba.cut(sentence.strip(),cut_all=False,use_paddle=10)#默认精确模式
out=[]
for word in sentence:
out.append(word)
return out
def splitt(self,data):
#句子和标签的提取
sentence=[]
label=[]
for i in data:
sentence.append(self.tokenlize(i[1]))
label.append(int(i[0]))#使用txt
#label.append(int(i[2]))#使用xls
sentence=tuple(sentence)
label=tuple(label)
return sentence,label
结果如下:
3.建立字典,对句子进行编码
思路是统计词频,将句子转换为数字序列,同时根据自己设置的句子长度对句子进行截取和补全。
这里使用PAD:0作为补全和未登录词的表示。
首先是建立字典,(词:词频):
txt与xls的转换同上
def cou