我正在尝试使用CoNLL-2003 NER(英语)数据集,并希望利用预训练的嵌入。我使用的是SENNA预训练嵌入。现在我的词汇表中有大约2万个词,其中只有9500个词有可用的嵌入。
我的当前方法是初始化一个20k X embedding_size
的数组,并将其全部置为零,然后初始化那9500个我已知嵌入的词,并使所有嵌入可学习。
我的问题是,有没有更好的方法来做这件事?任何相关的研究所引用的资料都将非常有帮助?
回答:
我建议采用以下三种方法来解决这个问题,每种方法都有其独特的优势:
- 不使用SENNA嵌入,尝试使用FastText嵌入。其优势在于可以利用字符n-gram来推断词汇表外(OOV)词的嵌入。具体的方法可以在相关论文中找到。Gensim已经实现了所有需要的功能。这将大大减轻问题,你还可以进一步微调这些推断出的嵌入,如你所述。缺点是你需要从Senna切换到FastText。
- 尝试使用形态学或语义相似性来初始化OOV词。对于形态学,我指的是使用像Levenshtein距离这样的方法来选择嵌入。对于一个像
apple
这样的OOV词,选择最接近的(根据Levenshtein距离)你已有嵌入的词,例如apples
。根据我的经验,这种方法效果显著。另一方面,语义相似性建议使用例如来自WordNet的同义词,或者平均计算OOV词经常与之共现的词的嵌入。 - 在通过上述方法减少稀疏性之后,再进行随机初始化,如其他回答中所讨论的。