我正在使用单词嵌入来查找两个句子之间的相似性。使用word2vec,如果一个句子是英语而另一个句子是荷兰语(虽然不是很好),我也会得到相似性度量。
所以我开始想知道是否可以用两种不同的语言计算两个句子之间的相似性(没有明确的翻译),特别是如果语言有一些相似之处(英语/荷兰语)?
答案 0 :(得分:4)
假设您的句子相似性方案仅使用字向量作为输入 - 如简单的字向量平均方案或Word Mover的距离。
如果符合以下条件,应该可以按照您的建议行事:
不能自动确保第二个质量。事实上,鉴于word2vec模型的随机初始化以及算法/实现引入的其他随机化,即使后续训练在完全相同的数据上运行也不会将单词放入完全相同的位置。因此,在完全独立的英语/荷兰语语料库上训练的单词向量不可能在相同的坐标处放置相同的单词。
但是,你可以根据某些锚/参考词对(你知道应该有类似的向量)来学习两个空间之间的代数转换。然后,您可以将该变换应用于两个集合中的一个中的所有单词,这将导致您在“规范”单词集的可比较坐标空间内具有这些“外来”单词的向量。
事实上,这个想法曾在第一篇word2vec论文中使用过:
“Exploiting Similarities among Languages for Machine Translation”
如果你要在你的一个语言词汇矢量集上应用类似的变换,那么使用那些变换后的矢量作为你的句子矢量方案的输入,那些句子矢量可能会对句子矢量有一些有用的可比性。另一种语言,从相同坐标空间中的字向量引导。
更新:有一个非常有趣的recent paper设法同时训练多种语言的单词向量,使用包含每种单一语言的原始句子的语料库,以及(更小) )一组对齐句子,已知在两种语言中都是相同的。 Gensim尚不支持这种模式,但未来的重构中有discussion of supporting it。
答案 1 :(得分:0)
我最近通过@gojomo的答案transvec对本文中提到的技术进行了Python实现。
您需要提供单词翻译对作为训练数据(我只是将语料库中的单词扔进Google Translate以获取尽可能多的此类对),然后可以使用transvec
中的包装器模型产生可比较的多种语言单词嵌入。这是一个示例:
import gensim.downloader
from transvec.transformers import TranslationWordVectorizer
# Pretrained models in two different languages.
ru_model = gensim.downloader.load("word2vec-ruscorpora-300")
en_model = gensim.downloader.load("glove-wiki-gigaword-300")
# Training data: pairs of English words with their Russian translations.
# The more you can provide, the better.
train = [
("king", "царь_NOUN"), ("tsar", "царь_NOUN"),
("man", "мужчина_NOUN"), ("woman", "женщина_NOUN")
]
bilingual_model = TranslationWordVectorizer(en_model, ru_model).fit(train)
# Find words with similar meanings across both languages.
bilingual_model.similar_by_word("царица_NOUN", 1) # "queen"
# [('king', 0.7763221263885498)]
不用担心俄语单词上的POS标签很奇怪-这只是我使用的特定预训练模型的怪癖。
对于文档而不是单词而言,事情有些棘手,因为Doc2Vec不能使用经过预训练的Word2Vec模型作为起点。但是,您可以通过简单地获取该文档中所有单词矢量的均值来获得近似文档矢量。如果为TranslationWordVectorizer
的{{1}}方法提供2d数组,它将精确地做到这一点并为您提供近似的文档向量,因此即使语言不同,您也可以找到具有相似含义的文档。 / p>