首页 > 解决方案 > 在训练 word2vec 模型 python 时,必须提供 corpus_file 或 corpus_iterable 值之一

问题描述

我刚刚开始使用 word2vec 模型,我想从我的问题数据中创建不同的集群。

所以要制作我得到的集群,我必须

创建词嵌入模型 从模型中获取词向量 从词向量中创建句子向量 使用 Kmeans 对问题数据进行聚类

所以要得到word2vec词向量,一篇文章说

def get_word2vec(tokenized_sentences):
    print("Getting word2vec model...")
    model = Word2Vec(tokenized_sentences, min_count=1)
    return model.wv

然后只需创建句子向量和 Kmeans。

和其他文章说,在获得 word2vec 模型后,我必须构建词汇,然后需要训练模型。然后创建句子向量,然后创建 Kmeans/

def get_word2vec_model(tokenized_sentences):
    start_time = time.time()
    print("Getting word2vec model...")
    model = Word2Vec(tokenized_sentences, sg=1, window=window_size,vector_size=size, min_count=min_count, workers=workers, epochs=epochs, sample=0.01)
    log_total_time(start_time)
    return model 


def get_word2vec_model_vector(model):
    start_time = time.time()
    print("Training...")
#     model = Word2Vec(tokenized_sentences, min_count=1)
    model.build_vocab(sentences=shuffle_corpus(tokenized_sentences), update=True)
    # Training the model
    for i in tqdm(range(5)):
        model.train(sentences=shuffle_corpus(tokenized_sentences), epochs=50, total_examples=model.corpus_count)
    log_total_time(start_time)
    return model.wv

def shuffle_corpus(sentences):
    shuffled = list(sentences)
    random.shuffle(shuffled)
    return shuffled

这就是我的 tokenized_sentences 的样子

8857                                     [, , , year, old]
11487     [, , birthday, canada, cant, share, job, friend]
20471                       [, , chat, people, also, talk]
5877                                           [, , found]

Q1)第二种方法给出以下错误

---> 54     model.build_vocab(sentences=shuffle_corpus(tokenized_sentences), update=True)
     55     # Training the model
     56     for i in tqdm(range(5)):

~\AppData\Local\Programs\Python\Python38\lib\site-packages\gensim\models\word2vec.py in build_vocab(self, corpus_iterable, corpus_file, update, progress_per, keep_raw_vocab, trim_rule, **kwargs)
    477 
    478         """
--> 479         self._check_corpus_sanity(corpus_iterable=corpus_iterable, corpus_file=corpus_file, passes=1)
    480         total_words, corpus_count = self.scan_vocab(
    481             corpus_iterable=corpus_iterable, corpus_file=corpus_file, progress_per=progress_per, trim_rule=trim_rule)

~\AppData\Local\Programs\Python\Python38\lib\site-packages\gensim\models\word2vec.py in _check_corpus_sanity(self, corpus_iterable, corpus_file, passes)
   1484         """Checks whether the corpus parameters make sense."""
   1485         if corpus_file is None and corpus_iterable is None:
-> 1486             raise TypeError("Either one of corpus_file or corpus_iterable value must be provided")
   1487         if corpus_file is not None and corpus_iterable is not None:
   1488             raise TypeError("Both corpus_file and corpus_iterable must not be provided at the same time")

TypeError: Either one of corpus_file or corpus_iterable value must be provided

Q2)是否有必要建立词汇然后训练数据?或者获取模型是我唯一需要做的事情?

标签: pythonmachine-learninggensimword2vec

解决方案


而不是做model.build_vocab(sentences=shuffle_corpus(tokenized_sentences), update=True)

用corpus_iterable替换句子参数名称,因此如果您的 iterable 工作正常,您应该能够轻松生成:

model.build_vocab(shuffle_corpus(tokenized_sentences), update=True)

或者

model.build_vocab(corpus_iterable=shuffle_corpus(tokenized_sentences), update=True)

它需要列表列表进行培训,因此请尝试以该格式提供数据。另外,请尝试清理您的数据。我认为空白空间不是一个好的选择,但我也没有尝试过。其他一切都是一样的。只需遵循有关 FastText 培训的官方文档,就可以继续前进。它也适用,Word2Vec但这个有更多的解释。

注意:给出的示例来自旧版本,这就是sentence=param 给出错误的原因

Q.2:模式构建词汇。显然有必要构建词汇,否则模型将如何知道是什么a,the,book,reader等等。每个单词都需要一个相应的数字,这就是它的用途。如果您正在处理一些包含许多 OOV 词的数据,请尝试使用FastText.

它有一件事,通过查看Astronomerand geology,它可以为您提供嵌入,astrology即使它一次也没见过。


推荐阅读