在 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 个 tags
:tags=[filename, subject]
。因此,这 4 个额外的 tags
不是文件名,可能是 subject
的重复值。
另外,尝试自己管理 alpha
/min_alpha
或在自己的循环中多次调用 train()
是个坏主意。只需将这些值保留为默认值,使用 Doc2Vec
的 iter
参数指定您想要的训练次数。
并且通过提供 tovecpoems
作为 Doc2Vec
的参数,您已经触发了训练 - 根本不需要调用 train()
。 (如果你还没有提供语料库,那么调用 build_vocab()
和 train()
一次是有意义的,但不会更多。)
因此,例如您的代码将更有意义:
learner = gensim.models.doc2vec.Doc2Vec(tovecpoems, iter=10)
vectors = learner.docvecs
# ...etc
请注意,您不会从小型玩具数据集获得好的 Doc2Vec
/Word2Vec
结果。他们通常需要数千个示例(包含数十万到数百万个单词)才能获得人们通常希望从中获得的那种矢量质量。 (有时您可以通过以下方式从小型数据集中挤出一点可演示的价值:(1) 从根本上缩小模型向量 size
;以及 (2) 增加 iter
训练遍数,但那是命中或未命中。)
我正在尝试将一堆诗歌转换成向量,然后对它们使用我自己的 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 个 tags
:tags=[filename, subject]
。因此,这 4 个额外的 tags
不是文件名,可能是 subject
的重复值。
另外,尝试自己管理 alpha
/min_alpha
或在自己的循环中多次调用 train()
是个坏主意。只需将这些值保留为默认值,使用 Doc2Vec
的 iter
参数指定您想要的训练次数。
并且通过提供 tovecpoems
作为 Doc2Vec
的参数,您已经触发了训练 - 根本不需要调用 train()
。 (如果你还没有提供语料库,那么调用 build_vocab()
和 train()
一次是有意义的,但不会更多。)
因此,例如您的代码将更有意义:
learner = gensim.models.doc2vec.Doc2Vec(tovecpoems, iter=10)
vectors = learner.docvecs
# ...etc
请注意,您不会从小型玩具数据集获得好的 Doc2Vec
/Word2Vec
结果。他们通常需要数千个示例(包含数十万到数百万个单词)才能获得人们通常希望从中获得的那种矢量质量。 (有时您可以通过以下方式从小型数据集中挤出一点可演示的价值:(1) 从根本上缩小模型向量 size
;以及 (2) 增加 iter
训练遍数,但那是命中或未命中。)