我正在尝试将一堆诗转换为矢量,然后在它们上使用我自己的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
会这样做,我会荷。
答案 0 :(得分:0)
您应该显示您的代码正在打印的内容,让答案者知道您看到的内容不正确。
您向Doc2Vec
提供了10个文字示例,但您提供的每个文字示例都有2 tags
:tags=[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
训练传递的数量,但这是击或错过。)