我想再训练4个Word2vec模型,并对得到的嵌入矩阵进行平均。

问题描述 投票:0回答:1

我写了下面的代码,我用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']
python pandas nlp spacy gensim
1个回答
1
投票

没有理由将来自多个训练运行的向量平均在一起;它更有可能破坏来自单个运行的任何价值,而不是提供任何好处。

没有一个运行能创建 "正确的 "最终位置,也没有一个运行能接近一些理想化的位置。相反,每一个都只是创建了一个与同一联合训练集中的其他向量具有内部可比性的向量集。与其他非交错训练运行中的向量进行比较或组合,通常会是无稽之谈。

相反,要以一个足够的运行为目标。如果向量在重复运行中经常移动,那是正常的。但如果用于词与词之间的比较,或者分析词的邻域,或者作为下游算法的输入,每个重构应该是差不多有用的。如果它们的有用性差别很大,很可能是数据或模型参数的其他不足。例如:数据太少--word2vec需要大量的数据才能给出有意义的结果--或者模型对数据来说太大--使其容易过拟合)。

关于你的设置的其他观察。

  • 对于word2vec来说,只有103个句子texts是很小的;你不应该期望这种运行的向量有任何算法通常会提供的价值。(运行这样一个微小的数据集可能有助于验证过程中没有停顿错误,或者让你自己熟悉stepAPIs,但结果不会告诉你什么。)

  • min_count=1 在word2vec和类似算法中,几乎总是一个坏主意。只出现一次(或几次)的词没有各种微妙不同的用法,而这些用法是将它训练成与其他词相平衡的位置所需要的--所以它们最终的最终位置很弱(weakstrange),而且这种词的数量稀释了其他更频繁的词的训练效果。通常的做法是丢弃罕见的单词,通常会得到更好的效果。

  • iter=200 是一个极端的选择,通常只对试图从不充分的数据中挤出结果有价值。(在这种情况下,你可能还需要减少向量------------------------------------。size 从正常的100多个维度)。) 所以,如果你似乎需要,获得更多的数据应该是首要任务。(使用20倍以上的数据比在较小的数据上使用20倍以上的迭代要好得多,好得多--但涉及的训练时间是一样的)。

© www.soinside.com 2019 - 2024. All rights reserved.