在 words2vec 中训练后获得矢量标签对

getting vector-tags pair after training in words2vec

我正在尝试将一堆诗歌转换成向量,然后对它们使用我自己的 k-means 实现,但我无法弄清楚如何在 doc2vec 中训练后获得带有标签的向量。我还发现,当我训练 11 个文件时,我得到 14 个文件(显然我希望输入的向量数量与输出的向量数量相同)。

我的代码接受了一个文件夹的路径,其中包含一些文本文件。现在我只是打印 learner.docvecs 给出的向量,不知道哪个向量是哪个。

代码:

import os
import gensim

def parse_doc2vec(direc):

    # gets list of file names
    files = os.listdir(direc)

    translator = str.maketrans("", "", string.punctuation)

    tovecpoems=[]

    count = 0
    for filename in files:

        file = open(direc + "/" + filename)
        list = file.read().split(sep= "\n")
        subject = list[0].split(" ",1)[0]

        poem = list[3:]
        poem = ''.join(poem)
        poem = poem.split()
        for i in range (len(poem)):
            poem[i] = poem[i].replace('\t','').replace('\n','')
            poem[i] = poem[i].translate(translator)
            if poem[i] == '':
                poem.remove(poem[i])


        tovecpoem = gensim.models.doc2vec.LabeledSentence(words = poem, tags = [filename,subject])
        tovecpoems.append(tovecpoem)
        count += 1


    learner = gensim.models.doc2vec.Doc2Vec(tovecpoems,alpha=0.025, min_alpha=0.025)

    for epoch in range(10):
        learner.train(tovecpoems,total_examples = learner.corpus_count, epochs = learner.iter)
        learner.alpha -= 0.002
        learner.min_alpha = learner.alpha


    vectors = learner.docvecs

    for vec in vectors:
        print(vec,'\n')

如果有人能告诉我如何检索从 tags 附加了 filename 的向量,以及为什么 vectors 中有更多的对象然后 tovecpoems 有,我将不胜感激。

您应该显示您的代码打印的内容,让回答者知道您所看到的内容不正确。

您正在为 Doc2Vec 提供 10 个文本示例,但您提供的每个文本示例都有 2 个 tagstags=[filename, subject]。因此,这 4 个额外的 tags 不是文件名,可能是 subject 的重复值。

另外,尝试自己管理 alpha/min_alpha 或在自己的循环中多次调用 train() 是个坏主意。只需将这些值保留为默认值,使用 Doc2Veciter 参数指定您想要的训练次数。

并且通过提供 tovecpoems 作为 Doc2Vec 的参数,您已经触发了训练 - 根本不需要调用 train()。 (如果你还没有提供语料库,那么调用 build_vocab()train() 一次是有意义的,但不会更多。)

因此,例如您的代码将更有意义:

learner = gensim.models.doc2vec.Doc2Vec(tovecpoems, iter=10)
vectors = learner.docvecs
# ...etc

请注意,您不会从小型玩具数据集获得好的 Doc2Vec/Word2Vec 结果。他们通常需要数千个示例(包含数十万到数百万个单词)才能获得人们通常希望从中获得的那种矢量质量。 (有时您可以通过以下方式从小型数据集中挤出一点可演示的价值:(1) 从根本上缩小模型向量 size;以及 (2) 增加 iter 训练遍数,但那是命中或未命中。)