如何在预训练的ELMO嵌入中获取相似单词?

4
如何在预训练的ELMO嵌入中获取与给定单词相似的单词?例如:在Glove中,我们有glove_model.most_similar()来查找任何给定单词的最相似单词及其嵌入。那么在ELMO中是否有类似的功能呢?
1个回答

1
与GloVe不同,ELMo使用字符级CNN动态计算单词嵌入,因此理论上ELMo应该能够处理无限的词汇量。实际上,它只能很好地处理在训练中遇到过的单词及其相似的单词,但仍能获得任意字符串的向量。因此,像GloVe一样拥有一个方法并没有太多意义。但是,您可以为您感兴趣的词汇表预先计算向量,并自己实现最近邻搜索,例如使用scipy.spatial.cKDTree。

1
KDTree将帮助我们在给定新点和现有点具有相同维度的情况下找到最近的邻居。 单词“Display”和“Screen”的ELMO编码分别为(7,1024)和(6,1024)。 ELMO编码的维数取决于单词中字符的数量,因为ELMO执行字符级CNN,因此无法比较任何ELMO嵌入单词与其他ELMO嵌入单词,因为这两个单词的维数不同。由于嵌入单词的维度不同,因此KDTree将无法帮助我们找到最近的邻居。 - Anvitha
1
CNN 的输出被最大池化成单个向量:https://github.com/allenai/allennlp/blob/master/allennlp/modules/elmo.py#L376,然后经过一些 highway 层处理:https://github.com/allenai/allennlp/blob/master/allennlp/modules/elmo.py#L384。因此,在最后,在 LSTM 中输入每个 token 的一个向量。当您遇到这样的形状时,可能存在分词问题。 - Jindřich
我猜你需要将池化层转换为一个固定维度的单一向量? - rjurney
如果您想要一个多词输入的单一向量,那么是的。这个问题是关于孤立单词的,对于这些单词,ELMo返回一个单一向量(其中已经包括字符级汇集)。 - Jindřich
@Anvitha,这个方法可以实现功能,但效率十分低下:使用gensim和GloVe找到与您要替换的单词最相似的topn个单词(虽然您熟悉这些单词,但它们并不一定符合语境),然后在ELMo中查询每个单词(作为您的句子替换词)的余弦距离,以确定哪些单词能够符合上下文。有人对此存在问题吗? - aldorath

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接