【QLBD】LSTM情感分析实验复现(一)one-hot encoding

注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

中文最小的单位是字,再上一级是词,那么在文本表示的时候就有两种选择,一个是直接以字作为基本单位,一个是以词作为基本单位。以词作为基本单位时就涉及到分词,这个以后再说。以字作为基本单位时,有一种是用one-hot encoding的方法去表示一个字。

本文测试模型为one-hot表示方法:以字为单位,不分词,将每个句子截断为两百字(不够补空字符串),然后将句子以one-hot矩阵的形式输入LSTM模型进行训练分类。

one-hot的优缺点这里不再细说,直接从代码上看整个实验的思路吧。

一、程序模块调用

import numpy as np
import pandas as pd
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)#共21105篇
三、部分数值设置

maxlen = 200 #截断字数
min_count = 20 #出现次数少于该值的字扔掉。这是最简单的降维方法
四、语料预处理一

content = ''.join(all_[0])  #所有语料拼接成一个字符串
abc = pd.Series(list(content)).value_counts() #统计每个字的频率
abc = abc[abc >= min_count] #去掉低频字,简单降维
abc[:] = range(len(abc)) #用0-2416间的整数对每个字按顺序重新赋值,一个整数代表一个字
word_set = set(abc.index) #构建字典

五、语料预处理二

def doc2num(s, maxlen):                   #构建将文本转化为数字向量的函数,maxlen=200
    s = [i for i in s if i in word_set]
    s = s[:maxlen]  #截取200字
    return list(abc[s])

all_['doc2num'] = all_[0].apply(lambda s: doc2num(s, maxlen)) #使用函数将文本转化为数字向量
##all_中的文本向量表示形式:[8, 65, 795, 90, 152, 152, 289, 37, 22, 49, 12...
六、打乱数据

idx = list(range(len(all_))) #生成实际的索引列表
np.random.shuffle(idx) #根据索引打乱文本顺序
all_ = all_.loc[idx] #重新生成表格
七、按要求规范数据格式

#按keras的输入要求来生成数据
x = np.array(list(all_['doc2num'])) #
y = np.array(list(all_['label'])) #
y = y.reshape((-1,1)) #调整标签形状

# x:array([ list([8, 65, 795, 90, 152, 152, 289, 37, 22, 49, 125, 324, 64, 28, 38, 261, 1, 876, 74, 248, 43, 54, 175, 537, 213, 671, 0, 33, 713, 8, 373, 222, 1, 3, 10, 534, 29, 420, 261, 324, 64, 976, 832, 1, 120, 64, 15, 674, 106, 480, 70, 51, 169, 42, 28, 46, 95, 268, 83, 5, 51, 152, 42, 28, 0, 269, 41, 6, 256, 1, 3, 15, 10, 51, 152, 42, 28, 111, 333, 625, 211, 326, 54, 180, 74, 70, 122, 19, 19, 19, 8, 45, 24, 9, 373, 222, 0, 151, 47, 231, 534, 120, 64, 125, 72, 142, 32, 9, 4, 68, 0, 91, 70, 215, 4, 453, 353, 118, 8, 45, 24, 61, 824, 742, 1, 4, 194, 518, 0, 151, 47, 10, 54, 1206, 529, 1, 143, 921, 71, 31, 5, 603, 175, 276, 3, 691, 37, 731, 314, 372, 314, 3, 6, 17, 713, 12, 2227, 2215, 1, 109, 131, 0, 66, 8, 4, 403, 222, 824, 742, 25, 3, 10, 84, 0, 37, 4, 82, 175, 276, 49, 607, 5, 601, 81, 54, 462, 815, 0, 8, 57, 20, 32, 194, 745, 144]),
       list([667, 426, 581, 635, 478, 19
  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值