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

2017 年 12 月 13 日 数据挖掘入门与实战 要学习更多点这→

 向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目录下

5  经典作品 道听途说 以为 懂 实际 读 觉得 独特 意想不到 新颖                  5  东京 看过 热海 看过 回家                  5  这部 电影 里 看出 东西 太多 比方说 注意 尾道 家中 鸡冠花 会 明白 黑白 影像 彩色 影像 不能 取代 魅力 母亲 热海 防波堤 上 说 东京 游览 热海 回家 真是 人生 非常 隽永 总结                  5  刚 几幕 觉得 极 做作 哪有 众人 说 这般 好 再 耐心 看 下去 方 发觉 表面 客套 微笑 下 内心深处 悲凉 其实 很 幸福 其实 幸福 等到 老时 会 老伴 相视而笑5  生活 总是 人 失望            

评分与情感的关系

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

 文本向量表示

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

texts = []
labels = []for line in lines:
    fields = line.split()
    rate = int(fields[0])    if rate==0 or rate==3:        
continue    elif rate < 3:        rate = 0    else:        rate = 1    cont = fields[1:]    cont = " ".join(cont)    texts.append(cont)    labels.append(rate) tokenizer.fit_on_texts(texts) tokenizer.texts_to_sequence(texts)

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


模型构建

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

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'])
完整代码:
http://blog.csdn.net/zzulp/article/details/76589044


from keras.models import Sequential
from keras.preprocessing.text import Tokenizer
import keras.preprocessing.sequence as S
from keras.utils import to_categorical
from keras.layers import Embedding, Bidirectional, LSTM, Dropout, Dense

import jieba
import json
import numpy as np

vocab_size = 350000
sentence_max_len = 100
model_path = 'keras.h5'

class SentimentLSTM:
   def __init__(self):
       self.tokenizer = Tokenizer(num_words=vocab_size)
self.stop_words = []
self.model = None

   def load_stop_word(self,path='dict/stop_word.txt'):
       with open(path, 'r') as f:
           for line in f:
               content = line.strip()
self.stop_words.append(content.decode('utf-8'))

def jieba_cut(self,line):
       lcut = jieba.lcut(line)
cut = [x for x in lcut if x not in self.stop_words]
cut = " ".join(cut)
return cut

def load_cuted_corpus(self, dir, input):
       f = open(dir + '/' + input , 'r')
lines = f.readlines()
texts = []
labels = []
for line in lines:
           fields = line.split()
rate = int(fields[0])
if rate==0 or rate==3:
               continue
           elif rate < 3:
               rate = 0
           else:
               rate = 1
           cont = fields[1:]
cont = " ".join(cont)
texts.append(cont)
labels.append(rate)

self.tokenizer.fit_on_texts(texts)
f.close()
return texts,labels

def load_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[0:500000],y[0:500000]), (x[500000:], y[500000:]))

def train(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)
print score

def load_trained_model(self,path):
       model = SentimentLSTM.build_model()
model.load_weights(path)
return model

def predict_text(self,text):
       if self.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,])
print vect
return self.model.predict_classes(S.pad_sequences(np.array(vect),100))

@staticmethod
   def build_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'])
return model

def main():
   lstm = SentimentLSTM()
lstm.train(10)
while True:
       input = raw_input('Please input text:')
if input == 'quit':
           break
       print lstm.predict_text(input)

if __name__=="__main__":
   main()

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

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


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

搜索添加微信公众号:weic2c

长按图片,识别二维码,点关注



大数据挖掘DT数据分析

搜索添加微信公众号:datadw


教你机器学习,教你数据挖掘

长按图片,识别二维码,点关注

登录查看更多
3

相关内容

RNN:循环神经网络,是深度学习的一种模型。
【ICML2020-华为港科大】RNN和LSTM有长期记忆吗?
专知会员服务
75+阅读 · 2020年6月25日
【实用书】Python数据科学从零开始,330页pdf
专知会员服务
142+阅读 · 2020年5月19日
《强化学习—使用 Open AI、TensorFlow和Keras实现》174页pdf
专知会员服务
136+阅读 · 2020年3月1日
【华侨大学】基于混合深度学习算法的疾病预测模型
专知会员服务
96+阅读 · 2020年1月21日
【模型泛化教程】标签平滑与Keras, TensorFlow,和深度学习
专知会员服务
20+阅读 · 2019年12月31日
知识神经元网络 KNN(简介),12页pdf
专知会员服务
14+阅读 · 2019年12月25日
初学者的 Keras:实现卷积神经网络
Python程序员
24+阅读 · 2019年9月8日
盘一盘 Python 系列 10 - Keras (上)
平均机器
5+阅读 · 2019年8月26日
基于TensorFlow和Keras的图像识别
Python程序员
16+阅读 · 2019年6月24日
用 TensorFlow hub 在 Keras 中做 ELMo 嵌入
AI研习社
5+阅读 · 2019年5月12日
NLP - 15 分钟搭建中文文本分类模型
AINLP
79+阅读 · 2019年1月29日
【年度系列】使用LSTM预测股票市场基于Tensorflow
量化投资与机器学习
19+阅读 · 2018年10月16日
基于 Keras 用 LSTM 网络做时间序列预测
R语言中文社区
21+阅读 · 2018年8月6日
基于 Keras 用深度学习预测时间序列
R语言中文社区
23+阅读 · 2018年7月27日
手把手教你用Python库Keras做预测(附代码)
数据派THU
14+阅读 · 2018年5月30日
用深度学习Keras判断出一句文本是积极还是消极
北京思腾合力科技有限公司
6+阅读 · 2017年11月16日
Arxiv
3+阅读 · 2019年3月1日
Attend More Times for Image Captioning
Arxiv
6+阅读 · 2018年12月8日
Arxiv
3+阅读 · 2018年11月14日
Implicit Maximum Likelihood Estimation
Arxiv
7+阅读 · 2018年9月24日
Arxiv
14+阅读 · 2018年5月15日
VIP会员
相关VIP内容
【ICML2020-华为港科大】RNN和LSTM有长期记忆吗?
专知会员服务
75+阅读 · 2020年6月25日
【实用书】Python数据科学从零开始,330页pdf
专知会员服务
142+阅读 · 2020年5月19日
《强化学习—使用 Open AI、TensorFlow和Keras实现》174页pdf
专知会员服务
136+阅读 · 2020年3月1日
【华侨大学】基于混合深度学习算法的疾病预测模型
专知会员服务
96+阅读 · 2020年1月21日
【模型泛化教程】标签平滑与Keras, TensorFlow,和深度学习
专知会员服务
20+阅读 · 2019年12月31日
知识神经元网络 KNN(简介),12页pdf
专知会员服务
14+阅读 · 2019年12月25日
相关资讯
初学者的 Keras:实现卷积神经网络
Python程序员
24+阅读 · 2019年9月8日
盘一盘 Python 系列 10 - Keras (上)
平均机器
5+阅读 · 2019年8月26日
基于TensorFlow和Keras的图像识别
Python程序员
16+阅读 · 2019年6月24日
用 TensorFlow hub 在 Keras 中做 ELMo 嵌入
AI研习社
5+阅读 · 2019年5月12日
NLP - 15 分钟搭建中文文本分类模型
AINLP
79+阅读 · 2019年1月29日
【年度系列】使用LSTM预测股票市场基于Tensorflow
量化投资与机器学习
19+阅读 · 2018年10月16日
基于 Keras 用 LSTM 网络做时间序列预测
R语言中文社区
21+阅读 · 2018年8月6日
基于 Keras 用深度学习预测时间序列
R语言中文社区
23+阅读 · 2018年7月27日
手把手教你用Python库Keras做预测(附代码)
数据派THU
14+阅读 · 2018年5月30日
用深度学习Keras判断出一句文本是积极还是消极
北京思腾合力科技有限公司
6+阅读 · 2017年11月16日
Top
微信扫码咨询专知VIP会员