Combining/adding 来自不同 word2vec 模型的向量
Combining/adding vectors from different word2vec models
我正在使用 gensim 创建在大型文本语料库上训练的 Word2Vec 模型。我有一些基于 StackExchange 数据转储的模型。我也有一个模型是在来自英语维基百科的语料库上训练的。
假设两个模型中都有一个词汇术语,并且这些模型是使用与 Word2Vec 相同的参数创建的。有什么方法可以组合或添加来自两个单独模型的向量以创建一个新模型,该模型具有与我最初组合两个语料库并使用此数据训练时相同的词向量吗?
我想这样做的原因是我希望能够生成一个具有特定语料库的模型,然后如果我以后处理一个新的语料库,我希望能够将这些信息添加到现有的模型而不是必须组合语料库并从头开始重新训练所有内容(即我想避免每次我想向模型添加信息时重新处理每个语料库)。
gensim 或其他地方是否有内置函数可以让我像这样组合模型,向现有模型添加信息而不是重新训练?
一般来说,只有一起训练的词向量才具有有意义的可比性。 (这是训练期间交错的拔河 war 将它们移动到有意义的相对方向,并且在这个过程中有足够的随机性,即使是在同一个语料库上训练的模型也会在放置单个单词的位置上有所不同。)
使用两个语料库中的词作为路标,可以学习从一个 space A 到另一个 B 的转换,试图将那些已知共享词移动到它们在另一个语料库中的相应位置space。然后,对 A 中 在 B 中 不存在的词应用相同的转换,您可以找到这些词的 B 坐标,使它们与其他母语 B 词具有可比性。
这种技术已在 word2vec 驱动的语言翻译(其中路标对是已知翻译)中取得了一些成功,或者作为一种使用来自其他地方的词向量来增长有限词向量集的方法。我不知道它是否足以满足您的目的。我想它可能会误入歧途,尤其是在两个训练语料库以截然不同的方式使用共享标记的情况下。
class、TranslationMatrix
可能可以在 gensim
库中为您执行此操作。参见:
https://radimrehurek.com/gensim/models/translation_matrix.html
在以下位置有一个演示笔记本:
https://github.com/RaRe-Technologies/gensim/blob/develop/docs/notebooks/translation_matrix.ipynb
(只要可行,在混合在一起的语料库上进行全面训练,使用所有单词示例,可能会做得更好。)
如果您想避免在包含翻译的大型混合语料库上训练新模型,我建议您查看我的新 Python 包 (transvec
),它允许您在两者之间转换词嵌入预训练的 word2vec 模型。您需要做的就是提供一组具有代表性的目标语言的单个单词以及它们在源语言中的翻译作为训练数据,这更易于管理(我只是拿了几千个单词并将它们扔进 Google 翻译一些相当不错的结果)。
它的工作方式与另一个答案中提到的 TranslationMatrix
类似,因为它适用于预训练的 word2vec 模型,但除了为您提供翻译外,它还可以为您提供翻译后的内容词向量,允许您在混合语言语料库上进行最近邻聚类等操作。
它还支持在训练阶段使用正则化,以在训练数据有限时帮助改进翻译。
这是一个小例子:
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)]
可以在 PyPi 上找到安装指南和更多详细信息:https://pypi.org/project/transvec/。
我正在使用 gensim 创建在大型文本语料库上训练的 Word2Vec 模型。我有一些基于 StackExchange 数据转储的模型。我也有一个模型是在来自英语维基百科的语料库上训练的。
假设两个模型中都有一个词汇术语,并且这些模型是使用与 Word2Vec 相同的参数创建的。有什么方法可以组合或添加来自两个单独模型的向量以创建一个新模型,该模型具有与我最初组合两个语料库并使用此数据训练时相同的词向量吗?
我想这样做的原因是我希望能够生成一个具有特定语料库的模型,然后如果我以后处理一个新的语料库,我希望能够将这些信息添加到现有的模型而不是必须组合语料库并从头开始重新训练所有内容(即我想避免每次我想向模型添加信息时重新处理每个语料库)。
gensim 或其他地方是否有内置函数可以让我像这样组合模型,向现有模型添加信息而不是重新训练?
一般来说,只有一起训练的词向量才具有有意义的可比性。 (这是训练期间交错的拔河 war 将它们移动到有意义的相对方向,并且在这个过程中有足够的随机性,即使是在同一个语料库上训练的模型也会在放置单个单词的位置上有所不同。)
使用两个语料库中的词作为路标,可以学习从一个 space A 到另一个 B 的转换,试图将那些已知共享词移动到它们在另一个语料库中的相应位置space。然后,对 A 中 在 B 中 不存在的词应用相同的转换,您可以找到这些词的 B 坐标,使它们与其他母语 B 词具有可比性。
这种技术已在 word2vec 驱动的语言翻译(其中路标对是已知翻译)中取得了一些成功,或者作为一种使用来自其他地方的词向量来增长有限词向量集的方法。我不知道它是否足以满足您的目的。我想它可能会误入歧途,尤其是在两个训练语料库以截然不同的方式使用共享标记的情况下。
class、TranslationMatrix
可能可以在 gensim
库中为您执行此操作。参见:
https://radimrehurek.com/gensim/models/translation_matrix.html
在以下位置有一个演示笔记本:
https://github.com/RaRe-Technologies/gensim/blob/develop/docs/notebooks/translation_matrix.ipynb
(只要可行,在混合在一起的语料库上进行全面训练,使用所有单词示例,可能会做得更好。)
如果您想避免在包含翻译的大型混合语料库上训练新模型,我建议您查看我的新 Python 包 (transvec
),它允许您在两者之间转换词嵌入预训练的 word2vec 模型。您需要做的就是提供一组具有代表性的目标语言的单个单词以及它们在源语言中的翻译作为训练数据,这更易于管理(我只是拿了几千个单词并将它们扔进 Google 翻译一些相当不错的结果)。
它的工作方式与另一个答案中提到的 TranslationMatrix
类似,因为它适用于预训练的 word2vec 模型,但除了为您提供翻译外,它还可以为您提供翻译后的内容词向量,允许您在混合语言语料库上进行最近邻聚类等操作。
它还支持在训练阶段使用正则化,以在训练数据有限时帮助改进翻译。
这是一个小例子:
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)]
可以在 PyPi 上找到安装指南和更多详细信息:https://pypi.org/project/transvec/。