# lstm-sentiment-analysis
sentiment analysis with chinese and english
本项目相关文章说明转到[http://slg.charmculture.com/article/5a60a16080a23b7b1c9df3f9](http://slg.charmculture.com/article/5a60a16080a23b7b1c9df3f9)
#### 情感分析工具keras,语言包括中文和英文
开始之前,你需要对深度学习原理有比较深刻的了解,lstm的原理,调参优化细节,keras基本知识的掌握。Python 版本 3.6.5
**1. 准备语料**
本次收集的语料不是太多。中文大概2w多条(淘宝评论),英文1w多条(电影评论),以后有时间会继续补充语料。其中有5%作为验证集,10%为测试集合。文件已经切分好,但是因为需要训练所有数据集,所以这个提前切分到不同文件夹并没有什么作用(后面讲到会重新合并再切分)。
**2.选择语言版本,分别设置训练集、测试集、验证集和维度**
因为后面的程序要训练中文或英文,所以在这里提前选择语言版本和不同的语言版本训练相关的参数。
```python
# 选择语言中文还是英文
languageType = ''
while (languageType != 'c' and languageType != 'e'):
languageType = input("Please enter a train type(chinese enter lower: c , english enter lower: e): ")
max_length = '' #一句话最大长度
load_path = '' #文件加载路径
language = '' #语言类型
tr_num = 17000 #训练集
va_num = 2000 #训练集
if languageType == 'c':
max_length = 100
load_path = 'data/chinese'
language = 'chinese'
tr_num = 17000
va_num = 2000
elif languageType == 'e':
max_length = 40
load_path = 'data/english'
language = 'english'
tr_num = 8000
va_num = 600
```
**3.加载数据集**
这里把中文和英文放在不同的文件夹下,利用 `pandas`中的`read_csv()`读取数据集合并到一起,如果这里本来就是一个整的数据集。则直接读取就好。
```python
# 获取csv文件:内容放到数组里面 分别是训练集、验证集、测试集,最后合并到一起
def sst_binary(data_dir='data/chinese'):
tr_data = pd.read_csv(os.path.join(data_dir, 'train_binary_sent.csv'))
va_data = pd.read_csv(os.path.join(data_dir, 'valid_binary_sent.csv'))
te_data = pd.read_csv(os.path.join(data_dir, 'test_binary_sent.csv'))
all_data = tr_data.append(va_data).append(te_data)
return all_data
```
**4.数据预处理**
这一步是针对中文和英文的特点来处理掉对分析无用的词提升精度。比如停用词、标点符号、特殊字符、转义字符等等。因为语料比较少,这个程序还没有针对这一块做处理。
**5.将词语转化为向量**
这里是最核心的地方,深度学习在训练数据的时候要求输入的数据是一个向量,这样才能进行矩阵运算,也是多层感知器的输入。所以如果直接将一组句子是无法识别的。所以最重要的一步就是将词语转化为词向量,可是如何才能得到向量呢?
这里用到的是词嵌入的方法,大概步骤是:
1. 中文最小统计粒度是词,所以要先切词(`jieba`)将一句话按照词语切分开来而非字。
2. 将所有词放在一起,统计每个词出现的次数按照重大到小的排序,然后加上索引。
3. 将句子中的词语全部替换成相应的索引,这样一个句子中的每个词语就用一个数字去表示了。
4. 调用keras model第一层`Embedding()`,该层会利用词嵌入将句子数字数组转化为词向量。
需要注意的是,jieba分词虽然是分中文的,但是也可以处理英文(英文是按照空格切分的),这样可以得到比较统一的数组shape。
```python
#定义模型
class Model(object):
def __init__(self, sentence_max_length=100):
sentence_max_length = sentence_max_length #截断词数 cut texts after this number of words (among top max_features most common words)
sentence_drop_length = 5 #出现次数少于该值的词扔掉。这是最简单的降维方法
#将每个句子里的词转化成词频索引值
def transform(data):
#如果是中文调用结巴分词
xs = data['sentence'].apply(lambda s: list(jieba.cut(s)))
#将所有词放到一个数组中
word_all = []
for i in xs:
word_all.extend(i)
#统计词频并排序建索引
global word_frequency, word_set
word_frequency = pd.Series(word_all).value_counts() #统计词频,从大到小排序
word_frequency = word_frequency[word_frequency >=
sentence_drop_length] #出现次数小于5的丢弃
word_frequency[:] = list(range(
1,
len(word_frequency) + 1)) #将词频排序的结果加索引
word_frequency[''] = 0 #添加空字符串用来补全,之前丢弃的后面的找不到的会用0代替
word_set = set(
word_frequency.index) #经过处理之后的所有词的数组集合,并且去掉可能存在的重复元素
#将词语替换成按照所有训练集词频排序后的索引
xt = xs.apply(lambda s: word2num(s, sentence_max_length))
xt = np.array(list(xt))
yt = np.array(list(data['label'])).reshape(
(-1, 1)) #此处用来调整标签形状n行1列 (-1是模糊控制即有不定多少行,1是1列)
#当前训练集合词的索引长度
wi = len(word_frequency)
return xt, yt, wi
self.transform = transform
```
**6.keras 训练数据集**
这一部分就交给keras处理了,具体用法可以参见keras中文文档,可以自定义一些参数,比如训练轮数、激活函数、加入验证集等等。当然核心的还是lstm了,相对于RNN,在训练长文本有更好的效果。训练完了之后可以选择保存模型。方便下次直接调用。
```python
#将词转化为数字向量 即一个句子里的每个词都有用上面生成的索引值代替
def word2num(s, sentence_max_length):
s = [i for i in s if i in word_set]
s = s[:sentence_max_length] + [''] * max(0, sentence_max_length - len(s))
return list(word_frequency[s])
# krea 训练数据集
def model_train(x, y, wi, language, sentence_max_length=100, tr_num=17000, va_num=2000):
global model
model = Sequential()
model.add(Embedding(wi, 256, input_length=sentence_max_length))
model.add(LSTM(128))
model.add(Dropout(0.5))
model.add(Dense(1))
model.add(Activation('sigmoid'))
model.compile(
loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(
x[:tr_num],
y[:tr_num],
batch_size=128,
nb_epoch=30,
validation_data=(x[tr_num:tr_num + va_num], y[tr_num:tr_num + va_num]))
score = model.evaluate(
x[tr_num + va_num:], y[tr_num + va_num:], batch_size=128)
model.save('model_' + language + '.h5')
return score[1]
#加载已经训练好的模型
def model_load(language):
global model
model = load_model('model_' + language + '.h5')
```
![中文语言训练过程与结果](http://upload-images.jianshu.io/upload_images/3502567-db3bff5980a8bac6.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![英文语言训练过程与结果](http://upload-images.jianshu.io/upload_images/3502567-9941d04c3670f58a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
**7.预测单个句子**
预测单个句子依然需要将这个句子分词,然后将词转化为数字,所以还是用到训练模型时用到的处理方式。
```python
#单个句子的预测函数
def model_predict(s, s
没有合适的资源?快使用搜索试试~ 我知道了~
2020美赛C题资料.zip
共98个文件
sample:12个
pdf:6个
csv:6个
需积分: 5 169 下载量 68 浏览量
2020-05-14
23:32:16
上传
评论 11
收藏 342.37MB ZIP 举报
温馨提示
关于2020年数模美赛c题的,题目,数据,文献资料,一些代码,以及思路和感想。其中在感想部分谈及了C题两种解答方法的对比(评论处理方法,另一种是我们老师带的另外几队拿了H奖的)。我们对这次论文交的比较匆忙,摘要是在最后一点时间里赶出来的,文章很多细节部分都有些问题,特别是问题分析部分忘记放上去就交了,有点尴尬。本来对这次结果不抱太大希望,后来却拿了m奖(虽然对于拿o奖,f奖的大佬们来说这不算什么),但对于失误较多的我们来说已经比较满意了。希望我的分享能对美赛有兴趣的同学起到一些帮助。
资源推荐
资源详情
资源评论
收起资源包目录
2020美赛C题资料.zip (98个子文件)
C题文献
文献C题淘宝评论挖掘及其应用研究.caj 4.1MB
Automatically assessing review helpfulness, In Proceedings of the 2006 Conference on Empirical Methods in Natural Language Processing.pdf 88KB
文献C题在线评论与消费者购买意向的关系研究.caj 1.36MB
Jordan Rodak, Minna Xiao, Steven Longoria, Predicting Helpfulness Ratings of Amazon Product Reviews.pdf 369KB
Training Deep Convolutional Neural Network for Twitter Sentiment Classification.pdf 266KB
文献C题电子商务网站在线评论有用性研究.caj 1.95MB
一种基于情感分析的UGC模糊综合_省略_法_以淘宝商品文本评论UGC为.pdf 269KB
搜索型商品评论有用性影响因素研究_何有世.pdf 556KB
文献C题在线评论对消费者感知及企业商品销量的影响研究.caj 5.84MB
Problem_C_Data
microwave.tsv 1011KB
hair_dryer.tsv 4.92MB
pacifier.tsv 7.39MB
2020_MCM_Problem_C.pdf 315KB
python代码
代码2
wordVectors.npy 76.29MB
Nlp_npy.ipynb 2KB
NLP.ipynb 17KB
idsMatrix.npy 23.37MB
wordsList.npy 25.94MB
test_review.npy 41.96MB
idsTestMatrix.npy 20.98MB
lstm-sentiment-analysis.rar 114.9MB
lstm-sentiment-analysis
model_english.h5 14.28MB
.idea
misc.xml 320B
workspace.xml 6KB
inspectionProfiles
profiles_settings.xml 174B
modules.xml 305B
.gitignore 41B
lstm-sentiment-analysis.iml 350B
vcs.xml 185B
encoder.pyc 4KB
README.md 8KB
.git
logs
HEAD 195B
refs
heads
master 195B
remotes
origin
HEAD 195B
packed-refs 114B
info
exclude 240B
index 1KB
objects
66
0692b6a0397c76145000d498e4a35681453912 205B
pack
0a
93a6766dbc660a797ae073ef2cdfe670021b5b 522KB
50
14280e8749c3093a6be9647080253e996ccdd4 41.43MB
info
73
8c9ff5b8775028f8994ba7e9e0dc9d6156cee2 13.4MB
6f975ea6e0284c5078eadb21a4e55e6a523655 511B
da
33b563009f6ab178d12d4163ab30389bc45c44 54B
74
b6fe5bee5be721516b44eb141dc3a84ce1c878 126B
ae
db59f476400a98613f6e7fbd1127d37459c956 233B
f7
b4623ae8c7420b9ac8352f9e454e1ff4f8d4e2 129B
97
35b5f1670405415be2b0d50118474b6aa11dc1 549B
c6
d0743ff6d00345fe72f6a7d2f9c0c71e6e4598 163B
2d
ccc31a21668892bdc6e5078f50d0c66872c3d4 199B
53
38f1c024dcb44ed63a4f2fd51f70cb99f55ead 80B
c8
8d6d58735bab38a27c63e7a47eefdc0b5f67bf 234B
a7
585b7f41a960dcaef5d7f31becb99d465b3b41 760B
8ac21cb1c476bc4c7251c86250cd715cf7d55f 125B
dc
ca09006e090e62c180277894d834b289069d10 834B
e9
96af1542d468377356298dc4d891ab836ba3d4 233B
0f
f6282c423a8325e13b69653295995fb9e859b1 44KB
91
6ae40b26a5dde39d10b2e6c0e889685dd5c7ab 183KB
d4
4c64914c37b9cd829431d3aff500c2de792120 4KB
b7
d5db54f8b8d67f8890415caadf9ae4be4fd593 2KB
fe
6e4d8337e53c2d58b64c7bbc77c301b14f9e63 578B
c1
a63034cb9ff475e7b0eb264a9a60ecb1d100c1 2KB
ba
a7ee87347cb77b007f175ae4e7d33a5e0b6199 879B
ccf0521250125c3ebb13bca5c2467ea5a480c9 2.14MB
20
5565fc5d243c53bf8ee660bc1b98210c2b5eae 4KB
58
f2b7325d2151c99bc11baca6a34e7e3c7456ec 91KB
e1
82a21a1500db681182fe5e5626dceb4039a29d 234B
e2
eb191488f7801500f7747ada57827ac0f797d3 547B
56
d1a77499120f8f872ef0bd8032e59e51443468 344KB
f6
72779fe7c59117f6e7fb41000010db6a60bda8 70B
17
48bdf7509c43b4fda32cd7e74e908699fec3eb 106B
HEAD 23B
config 342B
refs
heads
master 41B
tags
remotes
origin
HEAD 32B
hooks
pre-applypatch.sample 424B
pre-push.sample 1KB
commit-msg.sample 896B
pre-merge-commit.sample 416B
pre-commit.sample 2KB
applypatch-msg.sample 478B
prepare-commit-msg.sample 1KB
update.sample 4KB
fsmonitor-watchman.sample 3KB
post-update.sample 189B
pre-rebase.sample 5KB
pre-receive.sample 544B
description 73B
__pycache__
encoder.cpython-37.pyc 3KB
encoder.py 4KB
sentiment_analysis.py 2KB
data
chinese
test_binary_sent.csv 1.01MB
train_binary_sent.csv 4.56MB
valid_binary_sent.csv 361KB
english
test_binary_sent.csv 188KB
train_binary_sent.csv 716KB
valid_binary_sent.csv 91KB
model_chinese.h5 44.24MB
C题一些思路及感想.docx 16KB
共 98 条
- 1
资源评论
weixin_44202775
- 粉丝: 0
- 资源: 5
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功