LSTM 文本情感分析/序列分类 Keras

LSTM 文本情感分析/序列分类 Keras

请参考 http://spaces.ac.cn/archives/3414/

neg.xls是这样的


pos.xls是这样的

neg=pd.read_excel(‘neg.xls’,header=None,index=None)

pos=pd.read_excel(‘pos.xls’,header=None,index=None) #读取训练语料完毕

pos[‘mark’]=1

neg[‘mark’]=0 #给训练语料贴上标签

pn=pd.concat([pos,neg],ignore_index=True) #合并语料

neglen=len(neg)

poslen=len(pos) #计算语料数目

cw = lambda x: list(jieba.cut(x)) #定义分词函数

pn[‘words’] = pn[0].apply(cw)

comment = pd.read_excel(‘sum.xls’) #读入评论内容

#comment = pd.read_csv(‘a.csv’, encoding=’utf-8′)

comment = comment[comment[‘rateContent’].notnull()] #仅读取非空评论

comment[‘words’] = comment[‘rateContent’].apply(cw) #评论分词

d2v_train = pd.concat([pn[‘words’], comment[‘words’]], ignore_index = True)

w = [] #将所有词语整合在一起

for i in d2v_train:

w.extend(i)

dict = pd.DataFrame(pd.Series(w).value_counts()) #统计词的出现次数

del w,d2v_train

dict[‘id’]=list(range(1,len(dict)+1))

get_sent = lambda x: list(dict[‘id’][x])

pn[‘sent’] = pn[‘words’].apply(get_sent)

maxlen = 50

print “Pad sequences (samples x time)”

pn[‘sent’] = list(sequence.pad_sequences(pn[‘sent’], maxlen=maxlen))

x = np.array(list(pn[‘sent’]))[::2] #训练集

y = np.array(list(pn[‘mark’]))[::2]

xt = np.array(list(pn[‘sent’]))[1::2] #测试集

yt = np.array(list(pn[‘mark’]))[1::2]

xa = np.array(list(pn[‘sent’])) #全集

ya = np.array(list(pn[‘mark’]))

print ‘Build model…’

model = Sequential()

model.add(Embedding(len(dict)+1, 256))

model.add(LSTM(256, 128)) # try using a GRU instead, for fun

model.add(Dropout(0.5))

model.add(Dense(128, 1))

model.add(Activation(‘sigmoid’))

model.compile(loss=’binary_crossentropy’, optimizer=’adam’, class_mode=”binary”)

print ‘Fit model…’

model.fit(xa, ya, batch_size=32, nb_epoch=4) #训练时间为若干个小时

classes = model.predict_classes(xa)

acc = np_utils.accuracy(classes, ya)

print ‘Test accuracy:’, acc

可以试一试

w = [] #将所有词语整合在一起

for i in d2v_train:

w.extend(i)

newList = list(set(w))

print “newlist len is”

print len(newList)

dict = pd.DataFrame(pd.Series(w).value_counts()) #统计词的出现次数

print type(dict)

print len(dict)

可以发现print len(newList)结果和print len(dict)  也就是说dict的长度就是所有不重复词语的distinct的长度。

主要有一个这个函数  sequence.pad_sequences

https://keras.io/preprocessing/sequence/#pad_sequences

http://www.360doc.com/content/16/0714/10/1317564_575385964.shtml

如果指定了参数maxlen,比如这里maxlen为50,那么意思就是这里每句话只截50个单词,后面就不要了,如果一句话不足50个单词,则用0补齐。

首先,Word2Vec  将词语对应一个多维向量,

model.add(Embedding(len(dict)+1, 256))

参数参考 http://www.360doc.com/content/16/0714/09/1317564_575385061.shtml

http://blog.csdn.net/niuwei22007/article/details/49406355

然后

model.add(LSTM(256, 128)) # try using a GRU instead, for fun

model.add(Dropout(0.5))

model.add(Dense(128, 1))

model.add(Activation(‘sigmoid’))

整个流程对应下图


结果

再看一看keras自带的例子:imdb_lstm

maxlen = 100

print(“Pad sequences (samples x time)”)

X_train = sequence.pad_sequences(X_train, maxlen=maxlen)

X_test = sequence.pad_sequences(X_test, maxlen=maxlen)

print(‘X_train shape:’, X_train.shape)

print(‘X_test shape:’, X_test.shape)

print(‘Build model…’)

model = Sequential()

model.add(Embedding(max_features, 128))

model.add(LSTM(128, 128))  # try using a GRU instead, for fun

model.add(Dropout(0.5))

model.add(Dense(128, 1))

model.add(Activation(‘sigmoid’))

同样的道理

如果训练样本较少,为了防止模型过拟合,Dropout可以作为一种trikc供选择。在每个训练批次中,通过忽略一半的特征检测器(让一半的隐层节点值为0),可以明显地减少过拟合现象。这种方式可以减少特征检测器间的相互作用,检测器相互作用是指某些检测器依赖其他检测器才能发挥作用。

时间: 2024-10-07 03:10:48

LSTM 文本情感分析/序列分类 Keras的相关文章

主题模型及其在文本情感分析中的应用

随着Web2.0技术的出现和发展,互联网上(包括门户网站.电子商务网站.社交网站.音/视频分享网站.论坛.博客.微博等)产生了海量的.由用户发表的对于诸如人物.事件.产品等目标实体的评论信息.例如,下面这两个短文本评论:(1)“比较了多个智能手机后选择了8150,性价比还可以.另外,就是考虑到它是3.7的屏幕,大小比较合适,否则携带很不方便.”(京东商城用户,2011.11.25):(2)“我以前在杭州做二手房地产,用温州炒房客的话说:全世界房价降了,杭州的房价永远不会降,因为他们有一道坚不可摧

动手学深度学习--文本情感分析之RNN

?本分类是?然语?处理的?个常?任务,它把?段不定?的?本序列变换为?本的类别.它的?个?问题:使??本情感分类来分析?本作者的情绪.这个问题也叫情感分析,并有着?泛的应?.例如,我们可以分析?户对产品的评论并统计?户的满意度,或者分析?户对市场?情的情绪并?以预测接下来的?情. 这里将应?预训练的词向量和含多个隐藏层的双向循环神经?络,来判断?段不定?的?本序列中包含的是正?还是负?的情绪. 1.导入包和模块 1 import collections 2 import os 3 import

文本情感分析(一):基于词袋模型(VSM、LSA、n-gram)的文本表示

现在自然语言处理用深度学习做的比较多,我还没试过用传统的监督学习方法做分类器,比如SVM.Xgboost.随机森林,来训练模型.因此,用Kaggle上经典的电影评论情感分析题,来学习如何用传统机器学习方法解决分类问题. 通过这个情感分析的题目,我会整理做特征工程.参数调优和模型融合的方法,这一系列会有四篇文章.这篇文章整理文本特征工程的内容. 文本的特征工程主要包括数据清洗.特征构造.降维和特征选择等. 首先是数据清洗,比如去停用词.去非字母汉字的特殊字符.大写转小写.去掉html标签等. 然后

文本情感分析(二):基于word2vec和glove词向量的文本表示

上一篇博客用词袋模型,包括词频矩阵.Tf-Idf矩阵.LSA和n-gram构造文本特征,做了Kaggle上的电影评论情感分类题. 这篇博客还是关于文本特征工程的,用词嵌入的方法来构造文本特征,也就是用word2vec词向量和glove词向量进行文本表示,训练随机森林分类器. 一.训练word2vec词向量 Kaggle情感分析题给出了三个数据集,一个是带标签的训练集,共25000条评论,一个是测试集,无标签的,用来做预测并提交结果,这两个数据集是上一篇文章里我们用过的. 此外还有一个无标签的数据

文本情感分析的基础在于自然语言处理、情感词典、机器学习方法等内容。以下是我总结的一些资源。

词典资源:SentiWordNet<知网>中文版中文情感极性词典 NTUSD情感词汇本体下载 自然语言处理工具和平台:哈尔滨工业大学社会计算与信息检索研究中心isnowfy/snownlp · GitHub 汉语分词:自然语言处理与信息检索共享平台 NLPIR.orgfxsjy/jieba · GitHub 语料资源:信息分类与情感发现 课程:斯坦福大学自然语言处理第七课"情感分析(Sentiment Analysis)" 网站和博客:Text Classification

【转】用python实现简单的文本情感分析

import jieba import numpy as np # 打开词典文件,返回列表 def open_dict(Dict='hahah',path = r'/Users/zhangzhenghai/Downloads/Textming/'): path = path + '%s.txt' %Dict dictionary = open(path, 'r', encoding='utf-8') dict = [] for word in dictionary: word = word.st

R语言对推特数据进行文本情感分析

美国调查公司盖洛普公司(Gallup poll found)民调显示,至少51%美国人不赞同总统特朗普的政策.据外媒报道,特朗普上任8天以来引发51%美国人的不满,42%美国人赞同新总统的政策.该项调查共有1500名成年美国人,误差为3%. 为了验证美国民众的不满情绪,我们以R语言抓取的特朗普推特数据为例,对数据进行文本挖掘,进一步进行情感分析,从而得到很多有趣的信息. 找到推特来源是苹果手机或者安卓手机的样本,清理掉其他来源的样本 tweets <-trump_tweets_df>%sele

自然语言11_情感分析

http://blog.csdn.net/erli11/article/details/23918751 斯坦福大学自然语言处理第七课"情感分析(Sentiment Analysis)" 转自:52opencourse.com/ http://52opencourse.com/235/%E6%96%AF%E5%9D%A6%E7%A6%8F%E5%A4%A7%E5%AD%A6%E8%87%AA%E7%84%B6%E8%AF%AD%E8%A8%80%E5%A4%84%E7%90%86%E7

文本分类之情感分析 – 朴素贝叶斯分类器

情感分析正成为研究和社交媒体分析的热点领域,尤其是在用户评论和微博上.它是文本挖掘的一种特殊情况,一般关注在识别正反观点上,虽然它常不很准确,它仍然是有用的.为简单起见(因为训练数据容易获取),我将重点放在2个可能的情感分类:积极的和消极的. NLTK 朴素贝叶斯分类 NLTK附带了所有你需要的情感分析的入手的东西:一份带有分为POS和NEG类别的电影评论语料,以及一些可训练分类器.我们先从一个简单的NaiveBayesClassifier作为基准,用布尔特征提取. 词袋特征提取 所有NLTK分