我编写了以下代码来迭代地构建Doc2vec模型。当我在this page中读到时,如果文档中的令牌数量超过10000,那么我们需要拆分令牌并重复每个段的标签。
我的大多数文档的标记长度都超过10000.我尝试通过编写以下代码来分割我的标记。但是我得到的错误显示10000后的标记在我的模型中没有被考虑。
def iter_documents(top_directory):
mapDocName_Id=[]
label=1
for root, dirs, files in os.walk(top_directory):
for fname in files:
print fname
inputs=[]
tokens=[]
with open(os.path.join(root, fname)) as f:
for i, line in enumerate(f):
if line.startswith('clueweb09-en00'):
if tokens:
i=0
if len(tokens)<10000:
yield LabeledSentence(tokens[:],[label])
else:
tLen=len (tokens)
times= int(math.floor(tLen/10000))
for i in range(0,times):
s=i*10000
e=(i*10000)+9999
yield LabeledSentence(tokens[s:e],[label])
start=times*10000
yield LabeledSentence(tokens[start:tLen],[label])
label+=1
tokens=[]
else:
tokens=tokens+line.split()
yield LabeledSentence(tokens[:],[label])
class docIterator(object):
def __init__(self,top_directory):
self.top_directory = top_directory
def __iter__(self):
return iter_documents(self.top_directory)
allDocs = docIterator(inputPath)
model = Doc2Vec(allDocs, size = 300, window = 5, min_count = 2, workers = 4)
model.save('my_model.doc2vec')
我使用以下代码测试我的模型然后我收到了这个错误:
model= Doc2Vec.load('my_model.doc2vec')
#print model['school']
print model['philadelphia']
我得到了一个矢量作为学校的结果,但我得到了费城这个错误。费城是指数10000之后的代币。
2017-02-27 13:59:36,751 : INFO : loading Doc2Vec object from /home/fl/Desktop/newInput/tokens/my_model.doc2vec
2017-02-27 13:59:36,765 : INFO : loading docvecs recursively from /home/fl/Desktop/newInput/tokens/my_model.doc2vec.docvecs.* with mmap=None
2017-02-27 13:59:36,765 : INFO : setting ignored attribute syn0norm to None
2017-02-27 13:59:36,765 : INFO : setting ignored attribute cum_table to None
Traceback (most recent call last):
File "/home/fl/git/doc2vec_annoy/Doc2Vec_Annoy/KNN/CreateAnnoyIndex.py",
line 31, in <module>
print model['philadelphia'] File "/home/flashkar/anaconda/lib/python2.7/site-packages/gensim/models/word2vec.py",
line 1504, in __getitem__
return self.syn0[self.vocab[words].index]
KeyError: 'philadelphia'
答案 0 :(得分:0)
我通过将文档分成长度为10,000但具有相同文档标识符的文档来解决我的问题。因此,我不检查令牌的长度。