在words2vec训练后得到矢量标签对

时间:2017-12-03 22:09:01

标签: python parsing doc2vec

我正在尝试将一堆诗转换为矢量,然后在它们上使用我自己的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')

如果有人可以告诉我如何检索filename附加tags的向量,以及为什么vectors中有更多对象,那么tovecpoems会这样做,我会荷。

1 个答案:

答案 0 :(得分:0)

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

您向Doc2Vec提供了10个文字示例,但您提供的每个文字示例都有2 tagstags=[filename, subject]。因此,不是文件名的4个额外tags可能是subject重复的唯一值。

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

通过提供iter作为tovecpoems的参数,您已经触发了培训 - 根本无需拨打Doc2Vec。 (如果您还没有提供语料库,那么将train()build_vocab()分别调用一次是合理的,但不能更多。)

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

train()

请注意,您不会从微小的玩具大小的数据集中获得良好的learner = gensim.models.doc2vec.Doc2Vec(tovecpoems, iter=10) vectors = learner.docvecs # ...etc / Doc2Vec结果。它们通常需要成千上万的例子(包含数十万到数百万个单词)才能获得人们通常想要的矢量品质。 (你有时可以通过(1)从根本上缩小模型向量Word2Vec来从小数据集中挤出一点可演化的值;以及(2)增加size训练传递的数量,但这是击或错过。)