如何为Out of Vocabulary Word初始化单词嵌入?

时间:2018-01-23 06:35:43

标签: machine-learning nlp deep-learning word-embedding

我正在尝试使用CoNLL-2003 NER(英语)数据集,我正在尝试使用预训练嵌入。我正在使用SENNA预训练嵌入。现在我的词汇量大约有20k字,而且我只有9.5k字的嵌入 我目前的方法是用零初始化20k X embedding_size数组,并初始化我知道其嵌入的9.5k字,并使所有嵌入都可以学习。

我的问题是,最好的方法是什么?对此类研究的任何提及都会非常有用吗?

3 个答案:

答案 0 :(得分:1)

我建议采用三种方法来解决这个问题,每种方法都有不同的优势:

  • 请尝试使用FastText嵌入,而不是使用SENNA嵌入。这里的优点是它们可以使用字符n-gram来推断OOV字的嵌入。有关使用的确切方法,请查看相关文件。 Gensim已实施所需的所有功能。这将大大减少问题,您可以进一步微调诱导嵌入,如您所述。不便之处在于您必须从Senna更改为FastText。
  • 尝试使用形态学或sementic相似性来初始化OOV单词。对于形态学,我的意思是使用像Levenshtein这样的距离来选择嵌入。对于像apple这样的OOV字词,请选择与您有嵌入的最接近(根据Levenshtein距离)字词,例如apples。根据我的经验,这可以非常好地工作。另一方面,语义相似性将建议使用例如从诸如WordNet之类的资源获得的同义词,或者甚至平均OOV经常与之共同出现的词的嵌入。
  • 在通过上述方式减少稀疏度之后,继续进行或在其他响应中讨论的随机初始化。

答案 1 :(得分:1)

上面的好建议,可能适用于大多数应用程序。如果你想获得花哨和最先进的技术,那么你可以训练一个模型来预测未知的单词嵌入。请查看最近的EMNLP 2017论文:https://arxiv.org/pdf/1707.06961.pdf

TL; DR给出了一组已知的单词嵌入,其目的是训练一个字符级的BiLSTM,它试图预测仅仅给出单词字符的嵌入。然后,这个网络可以推广以预测未知单词的嵌入。理想情况下,网络捕获一些形态信息,例如预测的apples嵌入将接近apple,文中的评估似乎支持这一假设。

这里有一个带有预训练模型的GitHub存储库:https://github.com/yuvalpinter/mimick

答案 2 :(得分:0)

你的方法听起来不错,如果你可以训练任何有意义的嵌入这些词汇外单词,这可能是棘手的,因为它们很少见。如果你不能,他们的嵌入不会比随机嵌入好得多。

在实践中,所有词汇表外的单词通常都会转换为<UNK>,并且所有词汇都会被归为零。在这种情况下,您不需要将所有这些零存储在嵌入矩阵中,而是进行智能查找,如果索引是词汇表,则选择嵌入向量,否则选择零。如果你正在使用张量流,这正是tf.nn.embedding_lookup所做的。因此嵌入矩阵会更小(10k x embedding_size)并且训练会更快。

我不确定是否有很多关于OOV词的研究,但作为参考我可以提到Google's Neural Machine Translation system

  

鉴于单词的分类性质,模型必须首先查找   源和目标嵌入以检索相应的单词   表示。要使这个嵌入层起作用,词汇表就是   首先为每种语言选择。通常,词汇量V是   选中,只有最频繁的V字被视为唯一。   所有其他字词都转换为&#34;未知&#34;令牌和所有得到的   相同的嵌入。嵌入权重,每种语言一套,是   通常在训练期间学习。