Skip to main content

多语言词嵌入。

项目描述

结合针对不同语言的预训练词嵌入模型来向量化多语言文档。

这个包包括MLS2013中概述的方法的 python 实现,它允许将来自一个模型的词嵌入转换到另一个模型的向量空间。

这允许您组合来自不同语言的词嵌入,避免训练双语模型的费用和复杂性。使用transvec,您可以简单地使用针对不同语言的预训练Word2Vec 模型来测量不同语言中单词的相似度,并为混合语言文本生成文档向量。

安装

pip install transvec

例子

假设我们要研究一个包含俄语和英语混合的文本语料库。 gensim有两种语言的预训练模型:

>>> import gensim.downloader
>>> ru_model = gensim.downloader.load("word2vec-ruscorpora-300")
>>> en_model = gensim.downloader.load("glove-wiki-gigaword-300")

现在假设您没有资源来训练一个能够很好地理解两种语言的模型(而且您可能没有)。最好利用我们在这两个预训练模型中所拥有的知识。让我们用俄语模型比较俄语单词,用英语模型比较英语单词:

>>> en_model.similar_by_word("king", 1)
[('queen', 0.6336469054222107)]

>>> ru_model.similar_by_word("царь_NOUN", 1) # "king"
[('царица_NOUN', 0.7304918766021729)] # "queen"

正如所宣传的那样,这些模型正确地找到了具有相似含义的单词。如果我们现在想比较不同语言的单词怎么办?

>>> ru_model.similar_by_word("king", 1)
Traceback (most recent call last):
    ...
KeyError: "word 'king' not in vocabulary"

它不起作用,因为俄罗斯模型没有接受过英语单词的训练。我们当然可以将我们的单词转换为英文模型中的向量,然后在我们的语料库中寻找最相似的向量:

>>> king_vector = en_model.get_vector("king")
>>> ru_model.similar_by_vector(king_vector, 1)
[('непроизводительный_ADJ', 0.21217751502990723)]

我们的结果(适当地意味着“非生产性”)根本没有意义。含义与我们的输入词完全不同。为什么会这样?因为“王”向量是由英语模型的向量空间定义的,与俄语模型的向量空间无关。这两个模型的输出是完全无法比较的。为了解决这个问题,我们必须将向量从空间(上例中的英语)翻译到目标空间(俄语)。

这就是transvec可以帮助您的地方。通过提供源语言中的成对单词以及它们到目标语言的翻译,transvec可以训练一个模型,该模型将源语言中的单词向量转换为目标语言中的向量:

>>> from transvec.transformers import TranslationWordVectorizer

>>> train = [
...     ("king", "царь_NOUN"), ("tsar", "царь_NOUN"),
...     ("man", "мужчина_NOUN"), ("woman", "женщина_NOUN")
... ]

>>> bilingual_model = TranslationWordVectorizer(en_model, ru_model).fit(train)

为了方便说英语的人,在这种情况下,我们将英语定义为我们的目标语言。这将创建一个可以接受任何一种语言输入的模型,但其输出将始终为英语。

现在我们可以对两种语言进行比较:

>>> bilingual_model.similar_by_word("царь_NOUN", 1) # "tsar"
[('king', 0.8043200969696045)]

如果提供的词在源语料库中不存在,但在目标语料库中存在,则模型将回退到使用目标语言的向量:

>>> bilingual_model.similar_by_word("king", 1)
[('queen', 0.6336469054222107)]

对于不在我们的训练集中的单词,我们也可以获得合理的结果(质量将取决于您的训练单词对的全面程度):

>>> bilingual_model.similar_by_word("царица_NOUN", 1) # "queen"
[('king', 0.7763221263885498)]

请注意,如果需要,您可以向TranslationWordVectorizer提供正则化参数 以帮助改进这些结果。

额外功能

批量矢量化

为方便起见,TranslationWordVectorizer还实现了scikit-learn Transformer API,让您可以轻松地对管道中的大量数据集进行矢量化。如果您提供一个 2D 单词矩阵,它将假定每一行代表一个文档并为每一行生成一个向量,这只是文档中所有单词向量的平均值(这是一种简单、廉价的方法当您的文档包含多种语言时近似文档向量)。

多语言模型

上面的示例将单一源语言转换为目标语言。但是,您可以训练一个能够识别多种源语言的模型。初始化模型时只需提供一种以上的源语言。源语言将按照您定义它们的顺序排列优先级。请注意,您的训练数据现在必须包含单词元组而不是单词对;与模型顺序匹配的语言顺序。

它是如何工作的?

MLS2013中概述了完整的细节,但基本上它只是普通最小二乘法。论文指出,单语模型的向量空间之间存在线性关系,这意味着可以使用简单的翻译矩阵将向量从其原生向量空间转换为目标向量空间中的相似点,将其放置在靠近单词的位置。具有相似含义的目标语言。

与原始论文不同,transvec使用岭回归而不是 OLS 来推导这个翻译矩阵:如果你只有一小部分训练词对,这有助于防止过度拟合。如果您想改用 OLS,只需在TranslationWordVectorizer 构造函数中将正则化参数 ( alpha ) 设置为零。

参考

项目详情


下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

transvec-0.1.0.tar.gz (12.1 kB 查看哈希)

已上传 source

内置分布

transvec-0.1.0-py3-none-any.whl (21.4 kB 查看哈希

已上传 py3