【问题标题】:Either one of corpus_file or corpus_iterable value must be provided while training the word2vec model python在训练 word2vec 模型 python 时,必须提供 corpus_file 或 corpus_iterable 值之一
【发布时间】:2021-06-01 02:47:21
【问题描述】:

我刚开始使用 word2vec 模型,我想根据我的问题数据制作不同的集群。

所以要制作集群,我必须这样做

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

所以要得到word2vec词向量,one of the article says

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

然后创建句子向量和 Kmeans。

and other article says,得到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) 是否有必要构建词汇然后训练数据?或者获取模型是我唯一需要做的事情?

【问题讨论】:

    标签: python machine-learning gensim word2vec


    【解决方案1】:

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

    corpus_iterable 替换 sentence 参数名称,这样如果您的迭代工作正常,您应该能够轻松生成:

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

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

    训练需要列表列表,因此请尝试以该格式提供数据。另外,请尝试清理您的数据。我认为空白空间不是一个好的选择,但我也没有尝试过。其他一切都是一样的。只需关注official Documentation on FastText training 就可以了。它也适用于Word2Vec,但这个有更多的解释。

    注意:给出的示例来自旧版本,这就是为什么 sentence= 参数会给出错误

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

    通过查看Astronomergeology,它可以为您提供astrology 的嵌入,即使它一次都没见过。

    【讨论】:

      【解决方案2】:

      在最近的 Gensim 版本中,名称 sentences 已被替换。 (它经常误导人们认为每个文本都必须是一个正确的句子,而不仅仅是一个标记列表。)

      您应该将您的语料库指定为 corpus_iterable(如果它类似于 Python list,或可重复迭代的序列),或者指定为 corpus_file(如果它位于已经存在的单个磁盘文件中)用换行符分割成文本,用空格分割成标记)。

      分别:

      • 您可能不需要重复重新洗牌您的语料库的复杂性。 (如果您的数据源在某些范围内有大量的单词类型——比如单词 A 的所有示例都出现在早期的一行文本中,而单词 B 的所有示例都出现在后面的一行文本中——那么 one 开始前洗牌可能会有所帮助,因此所有单词在语料库的早期和晚期出现的可能性均等。)
      • 多次调用.train() 几乎总是一个错误,这会导致对训练过程的混淆以及对学习率alpha 衰减的管理不善。有关更多详细信息,请参阅有关(相关算法)Doc2Vec 的答案:https://stackoverflow.com/a/62801053/130288

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-03
        • 1970-01-01
        • 2021-12-15
        • 1970-01-01
        • 1970-01-01
        • 2022-07-31
        相关资源
        最近更新 更多