跨多种语言的语义相似性
Semantic Similarity across multiple languages
我正在使用词嵌入来寻找两个句子之间的相似性。使用 word2vec,如果一个句子是英语而另一个句子是荷兰语(虽然不是很好),我也会得到一个相似性度量。
所以我开始想知道是否有可能计算两种不同语言的两个句子之间的相似度(没有明确的翻译),特别是如果这些语言有一些相似之处 (Englis/Dutch)?
让我们假设您的句子相似度方案仅使用词向量作为输入——就像在简单的词向量平均方案或词移动距离中一样。
应该可以按照您的建议进行操作,前提是:
- 对于每种语言的词,你都有很好的词向量集
- 词向量的坐标space是兼容的,这意味着两种语言中表示完全相同事物的词具有几乎相同的坐标(并且具有相似含义的其他词具有接近的坐标)
第二种质量不能自动得到保证。事实上,考虑到 word2vec 模型的随机初始化,以及 algorithm/implementation 引入的其他随机化,即使是在完全相同的数据上运行后续训练也不会将单词放在完全相同的位置。因此,在完全独立的 English/Dutch 语料库上训练的词向量不太可能将等同的词放在相同的坐标上。
但是,你可以学习两个 space 之间的代数转换,基于某些 anchor/reference 词对(你知道应该有相似的向量)。然后,您可以将该转换应用于两个集合之一中的所有单词,这会导致您在 'canonical' 单词集的可比坐标 - space 内获得那些 'foreign' 单词的向量.
事实上,这个想法在第一篇 word2vec 论文中得到了应用:
"Exploiting Similarities among Languages for Machine Translation"
如果你要对你的一个语言词向量集应用类似的转换,然后使用这些转换后的向量作为你的句子向量方案的输入,这些句子向量可能与句子有一些有用的可比性-另一种语言的向量,从相同坐标中的词向量引导-space。
更新:在未来的重构中有一个非常有趣的recent paper that manages to train word-vectors in multiple languages simultaneously, using a corpus that includes both raw sentences in each single language, and a (smaller) set of aligned-sentences that are known to mean the same in both languages. Gensim doesn't yet support this mode, but there's discussion of supporting it。
我最近根据 @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
的 transform
方法提供一个二维数组,它会准确地执行此操作并为您提供一个近似的文档向量,因此即使语言不同,您也可以找到具有相似含义的文档。
我正在使用词嵌入来寻找两个句子之间的相似性。使用 word2vec,如果一个句子是英语而另一个句子是荷兰语(虽然不是很好),我也会得到一个相似性度量。
所以我开始想知道是否有可能计算两种不同语言的两个句子之间的相似度(没有明确的翻译),特别是如果这些语言有一些相似之处 (Englis/Dutch)?
让我们假设您的句子相似度方案仅使用词向量作为输入——就像在简单的词向量平均方案或词移动距离中一样。
应该可以按照您的建议进行操作,前提是:
- 对于每种语言的词,你都有很好的词向量集
- 词向量的坐标space是兼容的,这意味着两种语言中表示完全相同事物的词具有几乎相同的坐标(并且具有相似含义的其他词具有接近的坐标)
第二种质量不能自动得到保证。事实上,考虑到 word2vec 模型的随机初始化,以及 algorithm/implementation 引入的其他随机化,即使是在完全相同的数据上运行后续训练也不会将单词放在完全相同的位置。因此,在完全独立的 English/Dutch 语料库上训练的词向量不太可能将等同的词放在相同的坐标上。
但是,你可以学习两个 space 之间的代数转换,基于某些 anchor/reference 词对(你知道应该有相似的向量)。然后,您可以将该转换应用于两个集合之一中的所有单词,这会导致您在 'canonical' 单词集的可比坐标 - space 内获得那些 'foreign' 单词的向量.
事实上,这个想法在第一篇 word2vec 论文中得到了应用:
"Exploiting Similarities among Languages for Machine Translation"
如果你要对你的一个语言词向量集应用类似的转换,然后使用这些转换后的向量作为你的句子向量方案的输入,这些句子向量可能与句子有一些有用的可比性-另一种语言的向量,从相同坐标中的词向量引导-space。
更新:在未来的重构中有一个非常有趣的recent paper that manages to train word-vectors in multiple languages simultaneously, using a corpus that includes both raw sentences in each single language, and a (smaller) set of aligned-sentences that are known to mean the same in both languages. Gensim doesn't yet support this mode, but there's discussion of supporting it。
我最近根据 @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
的 transform
方法提供一个二维数组,它会准确地执行此操作并为您提供一个近似的文档向量,因此即使语言不同,您也可以找到具有相似含义的文档。