【发布时间】:2017-12-20 21:39:38
【问题描述】:
我有两个目录,我想从中读取它们的文本文件并标记它们,但我不知道如何通过TaggedDocument 执行此操作。我认为它可以作为 TaggedDocument([Strings],[Labels]) 工作,但这显然不起作用。
这是我的代码:
from gensim import models
from gensim.models.doc2vec import TaggedDocument
import utilities as util
import os
from sklearn import svm
from nltk.tokenize import sent_tokenize
CogPath = "./FixedCog/"
NotCogPath = "./FixedNotCog/"
SamplePath ="./Sample/"
docs = []
tags = []
CogList = [p for p in os.listdir(CogPath) if p.endswith('.txt')]
NotCogList = [p for p in os.listdir(NotCogPath) if p.endswith('.txt')]
SampleList = [p for p in os.listdir(SamplePath) if p.endswith('.txt')]
for doc in CogList:
str = open(CogPath+doc,'r').read().decode("utf-8")
docs.append(str)
print docs
tags.append(doc)
print "###########"
print tags
print "!!!!!!!!!!!"
for doc in NotCogList:
str = open(NotCogPath+doc,'r').read().decode("utf-8")
docs.append(str)
tags.append(doc)
for doc in SampleList:
str = open(SamplePath + doc, 'r').read().decode("utf-8")
docs.append(str)
tags.append(doc)
T = TaggedDocument(docs,tags)
model = models.Doc2Vec(T,alpha=.025, min_alpha=.025, min_count=1,size=50)
这是我得到的错误:
Traceback (most recent call last):
File "/home/farhood/PycharmProjects/word2vec_prj/doc2vec.py", line 34, in <module>
model = models.Doc2Vec(T,alpha=.025, min_alpha=.025, min_count=1,size=50)
File "/home/farhood/anaconda2/lib/python2.7/site-packages/gensim/models/doc2vec.py", line 635, in __init__
self.build_vocab(documents, trim_rule=trim_rule)
File "/home/farhood/anaconda2/lib/python2.7/site-packages/gensim/models/word2vec.py", line 544, in build_vocab
self.scan_vocab(sentences, progress_per=progress_per, trim_rule=trim_rule) # initial survey
File "/home/farhood/anaconda2/lib/python2.7/site-packages/gensim/models/doc2vec.py", line 674, in scan_vocab
if isinstance(document.words, string_types):
AttributeError: 'list' object has no attribute 'words'
【问题讨论】:
-
与您的主要问题分开:使结尾
min_alpha与开头alpha具有相同的值意味着您的训练没有进行适当的随机梯度下降。此外,min_count=1很少对 Word2Vec/Doc2Vec 训练有帮助 - 保留这些稀有词只会使训练花费更长的时间并干扰剩余 word-vecs/doc-vecs 的质量。 -
关于
min_alpha,我从一个示例代码中复制了它,然后是这个代码:for epoch in range(10): model.train(docs) model.alpha -= 0.002 # decrease the learning rate model.min_alpha = model.alpha # fix the learning rate, no decay和关于min_count:我的数据集非常有限,有些词不是那么多频繁但意义重大,我也过滤了大多数停用词和日常常用词。 -
这是一个不好的样本。如果您在创建 Doc2Vec 实例时传入您的语料库,它将自动完成所有训练过程,并自动管理从
alpha到min_alpha的学习率,并且您不应该自己调用train()。 (如果你这样做了,就像你在没有任何其他细节的情况下展示的那样,最新的 gensim 版本会抛出一个错误,因为这是一个非常常见的错误。)你自己或默认调用train()是罕见的,专家级的事情alpha/min_alpha.
标签: python nltk gensim word2vec doc2vec