我想再训练 4 个 Word2vec 模型并对生成的嵌入矩阵进行平均
I want to Train 4 more Word2vec models and average the resulting embedding matrices
我写了下面的代码,我使用 Used spacy 将推文中的单词限制为实词,即名词、动词和形容词。将单词转换为小写并添加带有下划线的 POS。例如:
love_VERB old-fashioneds_NOUN
现在我想再训练 4 个 Word2vec 模型并对生成的嵌入矩阵进行平均。
但我对此一无所知,你能帮帮我吗?
# Tokenization of each document
from gensim.models.word2vec import FAST_VERSION
from gensim.models import Word2Vec
import spacy
import pandas as pd
from zipfile import ZipFile
import wget
url = 'https://raw.githubusercontent.com/dirkhovy/NLPclass/master/data/reviews.full.tsv.zip'
wget.download(url, 'reviews.full.tsv.zip')
with ZipFile('reviews.full.tsv.zip', 'r') as zf:
zf.extractall()
# nrows , max amount of rows
df = pd.read_csv('reviews.full.tsv', sep='\t', nrows=100000)
documents = df.text.values.tolist()
nlp = spacy.load('en_core_web_sm') # you can use other methods
# excluded tags
included_tags = {"NOUN", "VERB", "ADJ"}
vocab = [s for s in new_sentences]
sentences = documents[:103] # first 10 sentences
new_sentences = []
for sentence in sentences:
new_sentence = []
for token in nlp(sentence):
if token.pos_ in included_tags:
new_sentence.append(token.text.lower()+'_'+token.pos_)
new_sentences.append(new_sentence)
# initialize model
w2v_model = Word2Vec(
size=100,
window=15,
sample=0.0001,
iter=200,
negative=5,
min_count=1, # <-- it seems your min_count was too high
workers=-1,
hs=0
)
new_sentences
w2v_model.build_vocab(vocab)
w2v_model.train(vocab,
total_examples=w2v_model.corpus_count,
epochs=w2v_model.epochs)
w2v_model.wv['car_NOUN']
没有理由对来自多次训练 运行 的向量进行平均;它更有可能破坏个人 运行 的任何价值,而不是提供任何好处。
没有人 运行 创造了 'right' 最终位置,他们也不都接近一些理想化的位置。相反,每个人只是创建一组向量,这些向量在内部可与同一联合训练集中的其他向量进行比较。与来自其他非交错训练 运行 的向量进行比较或组合通常是无稽之谈。
相反,目标是一个足够的 运行。如果矢量移动很多,重复 运行s,那是正常的。但是,如果用于词与词的比较,或词 neighborhoods/directions 的分析,或作为下游算法的输入,每个重新配置应该都差不多有用。如果它们的用途差异很大,则数据或模型参数中可能存在其他不足之处。 (例如:数据太少——word2vec 需要大量数据才能给出有意义的结果——或者模型对于数据来说太大——使其容易过度拟合。)
关于您的设置的其他观察结果:
只有 103 sentences/texts 对于 word2vec 来说太小了;您不应该期望来自 运行 的向量具有算法通常提供的任何值。 (运行 如此小的数据集可能有助于验证过程中没有停止错误,或者熟悉 steps/APIs,但结果不会告诉你任何信息。)
min_count=1
在 word2vec 和类似算法中几乎总是一个坏主意。只出现一次(或几次)的词没有各种微妙的不同用法,无法将其训练成与其他词保持平衡的位置——因此它们以 weak/strange 最终位置结束,并且此类单词的数量过多会削弱其他更频繁单词的训练效果。丢弃稀有词的常见做法通常会得到更好的结果。
iter=200
是一个极端的选择,通常只有在试图从不充分的数据中挤出结果时才有价值。 (在这种情况下,您可能还必须将 vector-size
从正常的 100 多个维度减少。)因此,如果您似乎需要这样做,那么获取更多数据应该是重中之重。 (使用 20 倍多的数据远远好于在较小的数据上使用 20 倍多的迭代——但涉及相同数量的训练时间。)
我写了下面的代码,我使用 Used spacy 将推文中的单词限制为实词,即名词、动词和形容词。将单词转换为小写并添加带有下划线的 POS。例如:
love_VERB old-fashioneds_NOUN
现在我想再训练 4 个 Word2vec 模型并对生成的嵌入矩阵进行平均。 但我对此一无所知,你能帮帮我吗?
# Tokenization of each document
from gensim.models.word2vec import FAST_VERSION
from gensim.models import Word2Vec
import spacy
import pandas as pd
from zipfile import ZipFile
import wget
url = 'https://raw.githubusercontent.com/dirkhovy/NLPclass/master/data/reviews.full.tsv.zip'
wget.download(url, 'reviews.full.tsv.zip')
with ZipFile('reviews.full.tsv.zip', 'r') as zf:
zf.extractall()
# nrows , max amount of rows
df = pd.read_csv('reviews.full.tsv', sep='\t', nrows=100000)
documents = df.text.values.tolist()
nlp = spacy.load('en_core_web_sm') # you can use other methods
# excluded tags
included_tags = {"NOUN", "VERB", "ADJ"}
vocab = [s for s in new_sentences]
sentences = documents[:103] # first 10 sentences
new_sentences = []
for sentence in sentences:
new_sentence = []
for token in nlp(sentence):
if token.pos_ in included_tags:
new_sentence.append(token.text.lower()+'_'+token.pos_)
new_sentences.append(new_sentence)
# initialize model
w2v_model = Word2Vec(
size=100,
window=15,
sample=0.0001,
iter=200,
negative=5,
min_count=1, # <-- it seems your min_count was too high
workers=-1,
hs=0
)
new_sentences
w2v_model.build_vocab(vocab)
w2v_model.train(vocab,
total_examples=w2v_model.corpus_count,
epochs=w2v_model.epochs)
w2v_model.wv['car_NOUN']
没有理由对来自多次训练 运行 的向量进行平均;它更有可能破坏个人 运行 的任何价值,而不是提供任何好处。
没有人 运行 创造了 'right' 最终位置,他们也不都接近一些理想化的位置。相反,每个人只是创建一组向量,这些向量在内部可与同一联合训练集中的其他向量进行比较。与来自其他非交错训练 运行 的向量进行比较或组合通常是无稽之谈。
相反,目标是一个足够的 运行。如果矢量移动很多,重复 运行s,那是正常的。但是,如果用于词与词的比较,或词 neighborhoods/directions 的分析,或作为下游算法的输入,每个重新配置应该都差不多有用。如果它们的用途差异很大,则数据或模型参数中可能存在其他不足之处。 (例如:数据太少——word2vec 需要大量数据才能给出有意义的结果——或者模型对于数据来说太大——使其容易过度拟合。)
关于您的设置的其他观察结果:
只有 103 sentences/texts 对于 word2vec 来说太小了;您不应该期望来自 运行 的向量具有算法通常提供的任何值。 (运行 如此小的数据集可能有助于验证过程中没有停止错误,或者熟悉 steps/APIs,但结果不会告诉你任何信息。)
min_count=1
在 word2vec 和类似算法中几乎总是一个坏主意。只出现一次(或几次)的词没有各种微妙的不同用法,无法将其训练成与其他词保持平衡的位置——因此它们以 weak/strange 最终位置结束,并且此类单词的数量过多会削弱其他更频繁单词的训练效果。丢弃稀有词的常见做法通常会得到更好的结果。iter=200
是一个极端的选择,通常只有在试图从不充分的数据中挤出结果时才有价值。 (在这种情况下,您可能还必须将 vector-size
从正常的 100 多个维度减少。)因此,如果您似乎需要这样做,那么获取更多数据应该是重中之重。 (使用 20 倍多的数据远远好于在较小的数据上使用 20 倍多的迭代——但涉及相同数量的训练时间。)