【问题标题】:Doc2Vec not providing adequate results in most_similarDoc2Vec 在 most_similar 中没有提供足够的结果
【发布时间】:2020-11-06 12:32:15
【问题描述】:

我正在尝试使用 Doc2Vec 进行经典的 Wikipedia 文章训练练习,使用文章标题作为标签。

这是我的代码和结果,我是否遗漏了一些东西,他们不会给出与 most_similar 匹配的结果?关注this tutorial,不过我用的是gensim自带的wiki-english-20171001数据集。

import gensim.downloader as api
from gensim.models.doc2vec import Doc2Vec, TaggedDocument
import re

def cleanText(text):
    text = re.sub(r'\|\|\|', r' ', text)
    text = re.sub(r'http\S+', r'<URL>', text)
    text = text.lower()
    text = re.sub(r'[^\w\s]','',text)
    return text


wiki = api.load("wiki-english-20171001")

data = [d for d in wiki]

for i in range(10):
    print(data[i])
def my_create_tagged_docs(data):
    for wikiidx in range(len(data)):
        yield TaggedDocument([i for i in data[wikiidx].get('section_texts') for i in cleanText(i).split()], [data[wikiidx].get('title')])


wiki_data = my_create_tagged_docs(data)
del data
del wiki


model = Doc2Vec(dm=1, dm_mean=1, size=200, window=8, min_count=19, iter =10, epochs=40)
model.build_vocab(wiki_data)

model.train(wiki_data, total_examples=model.corpus_count, epochs=model.epochs)
model.docvecs.most_similar(positive=["Lady Gaga"], topn=10)
[('Chlorothrix', 0.35521823167800903),
 ("A Child's Garden of Verses", 0.3533579707145691),
 ('Fish Mooney', 0.35129639506340027),
 ('2000 Paris–Roubaix', 0.3463437855243683),
 ('Calvin C. Chaffee', 0.3439667224884033),
 ('Murders of Eve Stratford and Lynne Weedon', 0.3397218585014343),
 ('Black Air', 0.3396576941013336),
 ('Turzyn', 0.3312540054321289),
 ('Scott Baker', 0.33018186688423157),
 ('Amongst the Waves', 0.3297169804573059)]
model.docvecs.most_similar(positive=["Machine learning"], topn=10)
[('Wolf Rock, Connecticut', 0.3855834901332855),
 ('Amália Rodrigues', 0.3349645137786865),
 ('Victoria Park, Leicester', 0.33312514424324036),
 ('List of visual anthropology films', 0.3311382532119751),
 ('Sadqay Teri Mout Tun', 0.3287636637687683),
 ('T. Damodaran', 0.32876330614089966),
 ('Urqu Jawira (Aroma)', 0.32281631231307983),
 ('Tiggy Wiggy', 0.3226730227470398),
 ('Frédéric Brun (cyclist, born 1988)', 0.32106447219848633),
 ('Unholy Crusade', 0.3200794756412506)]

【问题讨论】:

    标签: python gensim doc2vec


    【解决方案1】:

    看起来你的wiki_data 是一个单通道生成器,由my_create_tagged_docs() 返回,它只能迭代一次 - 不是一个能够多次迭代的可迭代对象,就像Doc2Vec 的许多步骤一样培训需要。

    您可以测试您的 wiki_data 对象是否是可多次迭代的,就在它被分配之后,通过执行:

        print(sum(1 for _ in wiki_data))
        print(sum(1 for _ in wiki_data))
    

    如果您两次看到相同的数字(文档总数),则一切正常。如果第二个数字是0,则您创建了一个单次使用的迭代器,而不是一个多次使用的iterable

    因此,build_vocab() 调用将用于初始化 known-vocabulary & 模型 - 但随后 train() 将看到一个空的迭代,立即完成而没有真正的训练发生。 (如果您在 INFO 级别运行日志记录,这在各个步骤的日志时间戳中可能很明显。)

    两个可能的修复:

    如果你有幸拥有足够的 RAM 来将整个语料库作为 Python 对象保存,将其转换为内存列表将确保它是可多次迭代的:

        wiki_data = list(my_create_tagged_docs(data))
    

    但是,大多数没有那么多 RAM * 不应该/不需要采取这一步。相反,您可以为数据的可迭代视图定义一个类,它可以在每次需要时返回一个新的迭代器。 gensim 项目创始人的博文中有一个示例,其中有进一步的解释:

    https://rare-technologies.com/data-streaming-in-python-generators-iterators-iterables/

    【讨论】:

      猜你喜欢
      • 2018-07-21
      • 2020-06-18
      • 2017-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-30
      • 2021-10-29
      • 1970-01-01
      相关资源
      最近更新 更多