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

How to initialize word-embeddings for Out of Vocabulary Word?

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

我的问题是最好的方法是什么?对此类研究的任何参考都会很有帮助吗?

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

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

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

Given the categorical nature of words, the model must first look up the source and target embeddings to retrieve the corresponding word representations. For this embedding layer to work, a vocabulary is first chosen for each language. Usually, a vocabulary size V is selected, and only the most frequent V words are treated as unique. All other words are converted to an "unknown" token and all get the same embedding. The embedding weights, one set per language, are usually learned during training.

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

  • 而不是使用 SENNA 嵌入,尝试使用 FastText embeddings. The advantage here is that they can infer embeddings for OOV words using character n-grams. For the exact methodology used, check the associated paper. Gensim 已经实现了所有需要的功能。这将大大减少问题,您可以按照您的描述进一步微调诱导嵌入。不便之处在于您必须从 Senna 更改为 FastText。
  • 尝试使用形态或语义相似性来初始化 OOV 词。对于形态学,我的意思是使用像 Levenshtein 这样的距离来 select 嵌入。对于像 apple 这样的 OOV 词,选择最接近(根据 Levenshtein 距离)你有嵌入的词,例如 apples。根据我的经验,这可以非常有效。另一方面,语义相似性建议使用例如从 WordNet 等资源中获得的同义词,甚至对 OOV 经常与之同时出现的词的嵌入进行平均。
  • 使用上述方法降低稀疏度后,再进行其他响应中讨论的随机初始化。

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

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

此处有一个包含预训练模型的 GitHub 存储库:https://github.com/yuvalpinter/mimick