我正在尝试使用CoNLL-2003 NER(英语)数据集,我正在尝试使用预训练嵌入。我正在使用SENNA预训练嵌入。现在我的词汇量大约有20k字,而且我只有9.5k字的嵌入
我目前的方法是用零初始化20k X embedding_size
数组,并初始化我知道其嵌入的9.5k字,并使所有嵌入都可以学习。
我的问题是,最好的方法是什么?对此类研究的任何提及都会非常有用吗?
答案 0 :(得分:1)
我建议采用三种方法来解决这个问题,每种方法都有不同的优势:
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;令牌和所有得到的 相同的嵌入。嵌入权重,每种语言一套,是 通常在训练期间学习。