首页 > 人工智能 > > 词嵌入学习笔记:如何进行情感分析?
作者:Bert Carremans
当将一个独热编码(One-Hot Encoding)应用于单词时,我们最终得到具有高维度的稀疏向量(包含许多零向量)。在大型数据集上,这可能会导致性能问题。另外,独热编码并没有考虑单词的语义。因此,airplane和aircraft等词语被认为是两个不同的特征。虽然我们知道它们具有非常相似的含义。词嵌入(word embedding)解决了这两个问题。
单词嵌入是一种维度低得多的密集向量。其次,单词之间的语义关系反映在向量的距离和方向上。
我们将使用Kaggle上的TwitterAirlineSentiment数据。(https://www.kaggle.com/crowdflower/twitter-airline-sentiment)
这个数据集包含大约15K的推文,其中3个可能的情绪类别(正面、负面和中性)。在我之前的文章中,我们尝试通过对单词进行标记,并应用逻辑回归和朴素贝叶斯等算法来对推文进行分类。让我们看看单词嵌入是否可以比这种方法更好。
在名为"文本挖掘的情感分析"的教程中,将探讨一些用于情感分析的文本挖掘技术。(https://towardsdatascience.com/sentiment-analysis-with-text-mining-13dd2b33de27)
阅读本教程后,你将了解如何使用Keras的嵌入层计算任务特定的单词嵌入。其次,我们将研究在更大的语料库上训练的单词嵌入是否可以提高模型的准确性。
本教程的结构是:
•单词嵌入背后的直觉
•项目设置
•数据准备
•Keras及其嵌入层
•预先训练的文字嵌入—GloVe
•训练具有更多维度的单词嵌入
(1)单词嵌入背后的直觉
在我们可以在分类器中使用单词之前,需要将它们转换为数字。一种方法是简单地将单词映射为整数。另一种方法是采用独热编码单词。然后可以将每个推文表示为具有等于(有限的一组)语料库中的单词维度的向量。在推文中出现的单词在向量中的值为1。所有其他向量值等于零。
单词嵌入的计算方式则不同。每个单词都定位在一个多维空间中。数据科学家选择此空间中的维数。你可以尝试不同的维度,看看哪些提供了最佳结果。
单词的向量值表示其在此嵌入空间中的位置。发现同义词彼此接近,而具有相反含义的单词之间具有大的距离。你还可以对应该生成语义正确结果的向量应用数学运算。一个典型的例子是,国王和女性的嵌入词之和产生了女王的单词嵌入。
(2)项目设置
让我们从导入该项目的所有包开始。
我们定义了整个项目中使用的一些参数和路径。其中大多数都是自我解释的。但其他的将在代码中进一步解释。
在整个代码中,我们还将使用一些辅助函数进行数据准备、建模和可视化。这里没有显示这些函数定义,以免博客文章杂乱无章。你可以随时参考Github中的笔记本来查看代码。()
(3)数据准备
·读取数据和清洗
我们用推文阅读csv文件并对其索引应用随机排序(random shuffle)。之后我们删除了停用词和@ mentions。拆分10%的测试集以评估新数据的模型。
·将单词转换为整数
使用Keras的Tokenizer,我们将推文转换为整数序列。我们将单词数量限制为NB_WORDS最常用的单词。此外,推文使用一些过滤器进行清理,设置为小写,并采用空格进行分割。
·序列长度相等
每个批次需要提供方程长度的序列。我们使用pad_sequences方法实现了这一点。这个方法其中包括定maxlen、序列或填充零或截断。
·编码目标变量
目标类是需要转换为数字向量的字符串。这是通过Sklearn的LabelEncoder和Keras的to_categorical方法完成的。
·拆分验证集
我们从训练数据中拆分出10%的验证集,以便在训练期间使用。
(4)Keras和嵌入层
Keras提供了将每个单词转换为多维向量的便捷方式。这可以通过嵌入层完成。它将计算单词嵌入(或使用预先训练的嵌入),并在字典中查找每个单词以找到其向量表示。在这里,我们将训练8维的单词嵌入。
我们的验证准确率约为74%。推文中的单词数量相当少,因此这个结果相当不错。通过比较训练和验证损失,我们看到模型从第6个周期开始过度拟合。
当你在训练数据上很好地拟合模型时会发生过度拟合,它并没有很好地概括。
当我们在所有数据(包括验证数据,但不包括测试数据)上训练模型并将周期数设置为6时,我们得到78%的测试准确度。这个测试结果非常好,但让我们看看我们是否可以通过预先训练的单词嵌入来改进。
(5)预先训练的单词嵌入— Glove
由于训练数据的数量不是很大,因此这个可能无法学习良好的嵌入情感分析。或者,我们可以加载建立在更大的训练数据上的预先训练的单词嵌入。
GloVe数据库包含多个预先训练的单词嵌入,以及在推文上训练的更具体的嵌入。所以这可能对当前的任务有用。
首先,我们将单词嵌入放在一个字典中,其中的关键是单词和单词嵌入的值。
将GloVe嵌入加载到字典中,我们可以查找航空公司推文语料库中每个单词的嵌入。这些将存储在NB_WORDS和GLOVE_DIM的矩阵中。如果在GloVe词典中找不到单词,则单词的嵌入值为零。
然后我们像上面的模型一样指定模型。
在嵌入层(这里是第0层)中,我们将单词的权重设置为GloVe单词嵌入中的权重。通过将trainable设置为False,我们确保不能更改GloVe字嵌入。之后我们运行模型。
在3个周期之后,该模型快速适应。此外,与在训练数据上训练的嵌入相比,验证准确性较低。
作为最后的练习,让我们看看当使用与GloVe数据相同数量的维度训练嵌入时所得到的结果。
(6)训练更多维度的单词嵌入
我们将使用与GloVe嵌入相同的维度(即GLOVE_DIM)来训练嵌入单词。
在测试数据上,我们得到了很好的结果,但我们没有使用CountVectorizer超越LogisticRegression。所以仍有改进的余地。
结论
使用在可用数据上训练的100维单词嵌入实现最佳结果。这甚至优于使用在更大的Twitter语料库上训练的单词嵌入。
到目前为止,我们只是将全连接层(Dense layer)放在扁平嵌入上。通过这样做,我们不会考虑推文中单词之间的关系。这可以通过递归神经网络或1D卷积网络来实现。但那是在未来实现的事情。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69918097/viewspace-3145720/ ,如需转载,请注明出处,否则将追究法律责任。