注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的方法表示 单个字,本篇将采用字向量的方法表示字,也就是原博所说的one embdding。Word2vec 的思想是用训练得到的高维词向量来表示一个英文单词,并且单词之间的某些关系在词向量的运算上可以体现出来。但是英文与中文又有不同,英文的每一个单词单独成词,而中文的单字成词的情况并不多。one-hot的方法缺陷在与字与字之间的关系完全相同,事实上并非如此。如果以字为基本单元训练词向量,则可以捕捉到字之间的某些联系。
这里说一下原博在博文中提到的“只有one hot和word embedding才是理论上说得过去的,而one embedding则看上去变得不伦不类了,因为字似乎不能说具有比较确定的意思。”我觉得这里还要说到词向量的发展上,词向量首先是以英文作为研究对象的,英文的最小单位是24个英文字母,这些字母是不带任何含义的(不包括部分冠词),而再上一级的是各个英文单词,每一个都单独成词,且都包含意思,显然以每个字母为最小语义单位生成词向量并没有任何意义,但是以每个单词为单位生成词向量是有意义的。而对应到中文,中文最小的语义单元是字,很多字都有具体的含义,一种或者多种含义;字与字组合成词,其表述的意义相对于单个字的含义会减少,但是含义更准确。一个英文单词可能对应一个词,也可能对应一个字,这样以字为最小语义单位和以词为语义单位都是有意义的。其实我们可以将one embdding 看做是解决one-hot无法衡量两个字之间联系问题的一种方法,当然字向量挖掘出来的字与字之间的关系是否靠谱有待验证商榷。以上仅为个人理解,不当之处欢迎指出讨论。
字向量的训练将直接使用keras中的embdding层。
本次实验测试one embdding 的方法:以字为单位,不分词,将每个句子截断为200字(不够则补空字符串),然后将句子以字向量矩阵的形式输入到LSTM模型中进行学习分类。
一、程序模块调用
import numpy as np
import pandas as pd
from keras.models import Sequential
from keras.layers import Dense, Activation, Dropout, Embedding
from keras.layers import LSTM
二、语料