1. 引入
情绪识别是NLP中的比较重要的通用任务。
对于情绪识别来说,通常标注的数据量都会比较小,一般语料中也就一万到十万个单词。
这样小的语料,对于训练NLP模型来说,是一个难点。
下面给出两种方法,借助于词嵌入,我们都能在比较小的语料中,得到不错的模型。
2. 方法一:平均词向量
具体步骤:
- 获取各个单词的词向量
直接用句子中,每个单词的one-hot编码,乘以词嵌入矩阵
,得到每个单词的词向量
-
将句子中各个单词词向量相加后取平均,得到一个新向量,用于表示该句子
-
用这个新的词向量,送到softmax,输出预测值
这个方法的优点
- 适用于任何长度的句子,因为最终表示该句子的词向量,都是各个词平均后的向量,向量维度与句子长度无关
这个方法的缺点
- 它不会考虑语序,比如下面的句子
- completely lacking in good taste, good service, and good ambience.
这个句子本身是负面情绪,但应为句子中有3个good,平均后,词向量大概率表示正面情绪。这样的预测结果就不准。
如何解决这个问题呢?
3. 方法二:RNN
我们用RNN来保证模型能考虑到语序。
具体步骤:
- 获取各个单词的词向量
直接用句子中,每个单词的one-hot编码,乘以词嵌入矩阵
,得到每个单词的词向量
-
将句子中各个单词词向量,直接送给RNN
-
RNN使用多对一的结构,最后一位输出情绪值,这是many-to-one的RNN结构[2]
RNN结构能考虑到语序,解决了方法1的缺点。
4. 情绪数据集
常见的情绪识别数据集,是斯坦福开源的IMDB评论情绪数据集,可以在参考3中下载到。
这个数据集提供了25000个训练集样本,25000个测试集样本。各个集合中,各有12500句话属于正面情绪,另外12500句话属于负面情绪。
参考4中也给出了一个非常小的IMDB简化数据集,其中有500个正例样本,500个负例样本,用于做简单的测试。
5. 总结
情绪识别最大的难点,是通常情况下,训练集数据都比较小。
有了词嵌入,只需要中等规模的数据集,你也能训练出一个情绪识别模型。
这也是词嵌入对情绪识别的贡献。
参考
-
- AndrewNg的《序列模型》教程
-
- RNN的5种典型结构. https://blog.csdn.net/ybdesire/article/details/104095916
-
- https://ai.stanford.edu/~amaas/data/sentiment/
-
- https://github.com/arafato/rt-analytics/blob/master/ml/imdb_labelled.csv