使用 Word Embeddings (word2vec) 时如何克服训练示例的不同长度

数据挖掘 词嵌入 word2vec 情绪分析
2021-09-17 06:46:04

我正在使用 word2vec 作为单词表示对推文进行情绪分析。

我已经训练了我的 word2vec 模型。但是当我要训练我的分类器时,我面临的问题是每条推文都有不同的长度,并且分类器(RandomForest)需要所有示例的大小相同。

目前,对于每条推文,我都会对其所有单词的向量进行平均,最终得到推文的向量表示。

例如:我的 word2vec 模型将每个单词表示为大小为 300 的向量。

Tweet1由10个单词Tweet2组成,由5个单词组成。

所以我要做的是,因为 Tweet1

(v1_Tweet1 + v2_Tweet1 + ... +v10_Tweet1)/10 = v_Tweet1 #avg vector of 300 elements.

对于Tweet2

(v1_Tweet2 + v2_Tweet2 + ... +v5_Tweet1)/5 = v_Tweet2 #avg vector of 300 elements.

*作为 v1_TweetX 的 TweetX 的第一个单词的向量,依此类推。

这工作“很好”,但我想知道您采取了哪些其他方法来克服分类器的火车和文本示例的不同大小。

谢谢。

4个回答

让我建议三个简单的选择:

  1. 平均向量(组件方式),即计算文本中每个单词的词嵌入向量,并对它们进行平均。(正如其他人所建议的那样)。

  2. 取向量的(分量)最大值。(最大值,而不是平均值)

  3. 取向量的(分量)最小值。(最小值,而不是平均值)

这些中的每一个都会产生一个与文本长度无关的特征向量。

有一些研究表明,连接最大值和最小值会产生一个非常有效的特征空间:它不是绝对最优的,但它接近最优,并且简单且易于实现。有关详细信息,请参阅Statistics.SE 上的此问题


这是一个受cubone 的回答启发的替代想法,据我所知,它之前没有经过测试。这个想法是使用词性标记器标记文本,然后使用这些标记来通知特征化过程。

特别是,写下 POS 标记器可能发出的所有可能的 POS 标签的列表。假设有 20 个可能的标签(CC、DT、JJS、MD、NNP、...)。然后特征向量将是 20*300 = 6000 个元素长:每个 POS 标签将有一个 300 个向量,以某种规范顺序连接。每个标签的 300 个向量可以通过对 POS 标记器用该标签标记的所有单词的词嵌入向量进行平均来计算。或者,您可以通过计算带有该标签的所有单词向量的最小值和最大值来获得每个 POS 标签一个 600 向量。

这可能会产生更丰富的特征空间,我不知道它是否会产生任何改进,但如果你想尝试不同的想法,你可以尝试一下。

这里有两个非常不同的建议来避免对向量进行平均:

  1. 使用 Word Mover 的距离 ( https://github.com/mkusner/wmd ) 计算推文之间的距离(不确定它在推文等短文本上的效果如何,我仍然需要自己尝试......)
  2. 对单词向量本身进行聚类(例如使用 kmeans),然后为每条推文创建一个包含 k 个条目(每个集群一个)的向量,该向量对它是否包含属于该集群的单词进行编码。我想我在关于 word2vec 的 Kaggle 教程中看到了这个,如果你找到它,我会很高兴看到这个链接!

您可以获取每个单词的向量以及不同长度的向量大小,而不是平均并获取推文的单个向量,填充可以用零完成。

在我的工作中,我通过平均词向量来完成相同的方法。但我想尝试另一个想法。它是在 POS 标签的帮助下。

首先用尽可能多的词性标签构造一个最复杂的句子,并将这些词性标签设置为模板。对于 twitter 语料库中的每个句子,POS 标记其中的所有单词并将这些词向量分别应用于模板中的 POS 标记。因此,看不见的 POS 标签将为零。

例如:NNP PDT DT NNS VB MD JJS CC PRP RBS是模板。因此每个位置将包含 300 维向量,总共 3000 维向量。如果第一条推文的 POS 标签是NNP VB JJS PRP,那么词向量将应用于这些位置,并且在位置上具有向量,NNP VB JJS PRP在其他位置上具有 300 维零向量。

该方法不仅解决了用单个向量表示句子的问题,而且通过定位在正确的词性中来保留句子的句法结构。

当然,当POS标签多于一个或标签位置混乱时,就会出现问题。这只是其中一种可能性。