当文档迭代添加到模型时,doc2vec模型中不存在单词dos

时间:2017-02-27 18:26:16

标签: gensim doc2vec

我编写了以下代码来迭代地构建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'

1 个答案:

答案 0 :(得分:0)

我通过将文档分成长度为10,000但具有相同文档标识符的文档来解决我的问题。因此,我不检查令牌的长度。