注1:参考学习 科学空间论坛 苏剑林 的博文
注2:记录实验复现细节,并根据版本更新对代码作出修正。
注3:python3.5;keras2.0.9
【QLBD】LSTM情感分析实验复现(一)one-hot encoding
【QLBD】LSTM情感分析实验复现(二)分词&one-hot
【QLBD】LSTM情感分析实验复现(三)one embedding
【QLBD】LSTM情感分析实验复现(四)word embdding
实验一中以字为基本语义单元,实际上我们知道中文一般两字成词,甚至多字成词,相比于单字,词语表达的信息更为准确。因此我们可以考虑用词为基本的语义单元,处理语料的时候要首先对语料进行分词,这里我用的是结巴分词工具。
一、模块调用
import numpy as np
import pandas as pd
import jieba
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers import Dense, Activation, Dropout
from keras.layers import LSTM
import sys
sys.setrecursionlimit(10000) #增大堆栈最大深度(递归深度),据说默认为1000,报错
二、语料
pos = pd.read_excel('E:/Coding/yuliao/pos.xls',header=None,index=None)#10677篇
pos['label'] = 1
neg = pd.read_excel('E:/Coding/yuliao/neg.xls',header=None,index=None)#10428篇
neg['label'] = 0
all_ = pos.append(neg, ignore_index=True)
all_['word'] = all_[0].apply(lambda s: list(jieba.cut(s))) ###语料分词
三、部分数值设定
maxlen = 100 #截断词数
min_count = 5 #去除低频词,单句切成词数要比切成字数少的多,相应的要去掉的低频词频率也要比低频字低一些
四、语料预处理一
content = [] #词表
for i in all_['word']:
content.extend(i)
abc = pd.Series(list(content)).value_counts() #统计词频
abc = abc[abc >= min_count] #去掉低频词,简单降维
abc[:] = range(len(abc)) #len(abc)=14322 用0-14322间的整数对每个字按顺序重新赋值,一个整数代表一个字
abc[''] = 0 #添加空字符串用来补全
word_set = set(abc.index)#词典
五、语料预处理二
def doc2num(s, maxlen): #构建将文本转化为数字向量的函数,maxlen=100