学习
实践
活动
专区
工具
TVP
写文章

用keras对国产剧评论文本的情感进行预测

向AI转型的程序员都关注了这个号

大数据挖掘DT数据分析 公众号: datadw

RNN即循环神经网络,其主要用途是处理和预测序列数据。在CNN中,神经网络层间采用全连接的方式连接,但层内节点之间却无连接。RNN为了处理序列数据,层内节点的输出还会重新输入本层,以实现学习历史,预测未来。

RNN的两个主要改进是LSTM(长短时记忆网络)和GRU(门控循环单元),二者为基本神经单元增加了额外的功能门,从而更好的实现长时记忆的处理。

在此基础上,通过两层或者多个RNN层的堆叠,可以实现双向循环神经网络(bidirectionalRNN)及深层循环神经网络(deepRNN)。

Keras对RNN的支持

Keras在layers包的recurrent模块中实现了RNN相关层模型的支持,并在wrapper模块中实现双向RNN的包装器。

下面的示例使用了LSTM模型,通过对豆瓣电视剧评论进行训练,最终使得模型可以对评论的好恶进行预测,或者说简单的情感分析。

语料处理

原始语料来自豆瓣,采集了约100w条豆瓣国产剧评论及对应的评分。在语料处理中,借助jeiba分词工具进行分词,并去除停词。这里下载停词表https://github.com/dongxiexidian/Chinese/tree/master/dict

最终处理得到的语料类似于下面的格式,即每行一条评论。每行第一个字段为评分,其余字段为分词去停词后的评论。

将语料文件review.csv放在corpus目录下。将stop_word.txt放在dict目录下

评分与情感的关系

为了简化示例,简单的认为1-2分为负面情感,4-5分为正面情感。未评分及3分为中性,不计入训练。这样将问题转化为一个二分类问题。

文本向量表示

借助Keras提供的文本预处理类Tokenizer,可以很容易的实现文本向量化。处理代码如下:

由于每句长度不同,为便于计算,最终统一用0填充成长度为100的向量.

模型构建

采用双向LSTM的结构,构建代码如下:

完整代码:

http://blog.csdn.net/zzulp/article/details/76589044

fromkeras.modelsimportSequential

fromkeras.preprocessing.textimportTokenizer

importkeras.preprocessing.sequenceasS

fromkeras.utilsimportto_categorical

fromkeras.layersimportEmbedding, Bidirectional, LSTM, Dropout, Dense

importjieba

importjson

importnumpyasnp

vocab_size=350000

sentence_max_len=100

model_path='keras.h5'

classSentimentLSTM:

def__init__(self):

self.tokenizer=Tokenizer(num_words=vocab_size)

self.stop_words=[]

self.model= None

defload_stop_word(self,path='dict/stop_word.txt'):

withopen(path,'r')asf:

forlineinf:

content=line.strip()

self.stop_words.append(content.decode('utf-8'))

defjieba_cut(self,line):

lcut=jieba.lcut(line)

cut=[xforxinlcutifxnot inself.stop_words]

cut=" ".join(cut)

returncut

defload_cuted_corpus(self,dir,input):

f=open(dir+'/'+input,'r')

lines=f.readlines()

texts=[]

labels=[]

forlineinlines:

fields=line.split()

rate=int(fields[])

ifrate==orrate==3:

continue

elifrate

rate=

else:

rate=1

cont=fields[1:]

cont=" ".join(cont)

texts.append(cont)

labels.append(rate)

self.tokenizer.fit_on_texts(texts)

f.close()

returntexts,labels

defload_data(self):

x,y=self.load_cuted_corpus('corpus','review.csv')

x=self.tokenizer.texts_to_sequences(x)

x=S.pad_sequences(x,maxlen=sentence_max_len)

y=to_categorical(y,num_classes=2)

return((x[:500000],y[:500000]), (x[500000:], y[500000:]))

deftrain(self,epochs=50):

print'building model ...'

self.model=SentimentLSTM.build_model()

print'loading data ...'

(text_train, rate_train), (text_test, rate_text)=self.load_data()

print'training model ...'

self.model.fit(text_train, rate_train,batch_size=1000,epochs=epochs)

self.model.save('model/keras.model')

score=self.model.evaluate(text_test,rate_text)

printscore

defload_trained_model(self,path):

model=SentimentLSTM.build_model()

model.load_weights(path)

returnmodel

defpredict_text(self,text):

ifself.model== None:

self.model=self.load_trained_model(model_path)

self.load_stop_word()

self.load_cuted_corpus('corpus','review.csv')

vect=self.jieba_cut(text)

vect=vect.encode('utf-8')

vect=self.tokenizer.texts_to_sequences([vect,])

printvect

returnself.model.predict_classes(S.pad_sequences(np.array(vect),100))

@staticmethod

defbuild_model():

model=Sequential()

model.add(Embedding(vocab_size,256,input_length=sentence_max_len))

model.add(Bidirectional(LSTM(128,implementation=2)))

model.add(Dropout(0.5))

model.add(Dense(2,activation='relu'))

model.compile('RMSprop','categorical_crossentropy',metrics=['accuracy'])

returnmodel

defmain():

lstm=SentimentLSTM()

lstm.train(10)

while True:

input=raw_input('Please input text:')

ifinput=='quit':

break

printlstm.predict_text(input)

if__name__=="__main__":

main()

运行代码,在训练完模型之后,在交互器中输入新的评论,即可以查看训练的模型对评论的预测了.负向输出为0,正向输出为1.

PS:在约60w的数据集上,CPU上跑10轮至少要10个小时.在GeForce GTX 1080上跑需要30分钟. 模型在测试集上的准确度能达到86%,召回率98%,精确度61%,F1评分75%.增大训练的轮数,100轮左右,仍可提升相关得分。

人工智能大数据与深度学习

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20171213B0W94I00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

关注

腾讯云开发者公众号
10元无门槛代金券
洞察腾讯核心技术
剖析业界实践案例
腾讯云开发者公众号二维码

扫码关注腾讯云开发者

领取腾讯云代金券