Gensim:训练时失去单词/代币

时间:2017-07-07 06:56:09

标签: python gensim word2vec

我有一个由维基媒体转储文件构建的语料库,存储在 sentences.txt 我有句话说'नीरजःहाँमाताजी! स्कूलख़त्महोतेसीधाघरआऊँगा'

现在当我尝试提取单词向量时,总会有一两个单词在训练时被遗漏(尽管被列入要训练的列表中)并且我得到了KeyError。 有没有办法改进训练,以便它不会经常错过任何单词?

这是证明它确实发生的证据。 tok.wordtokenize是一个单词标记器。 sent.drawlist()以及sents.drawlist()会返回 sentences.txt 中存储的语料库中的句子列表。

>>> sentence = 'नीरजः हाँ माता जी! स्कूल ख़त्म होते सीधा घर आऊँगा'
>>> sentence = tok.wordtokenize(sentence) #tok.wordtokenize() is simply a word tokenizer.
>>> sentences = sent.drawlist()
>>> sentences = [tok.wordtokenize(i) for i in sentences]
>>> sentences2 = sents.drawlist()
>>> sentences2 = [tok.wordtokenize(i) for i in sentences2]
>>> sentences = sentences2 + sentences + sentence
>>> "नीरजः" in sentences #proof that the word is present inside sentences
True
>>> sentences[0:10] #list of tokenized sentences.
[['विश्व', 'भर', 'में', 'करोड़ों', 'टीवी', 'दर्शकों', 'की', 'उत्सुकता', 'भरी', 'निगाह', 'के', 'बीच', 'मिस', 'ऑस्ट्रेलिया', 'जेनिफर', 'हॉकिंस', 'को', 'मिस', 'यूनिवर्स-२००४', 'का', 'ताज', 'पहनाया', 'गया'], ['करीब', 'दो', 'घंटे', 'चले', 'कार्यक्रम', 'में', 'विभिन्न', 'देशों', 'की', '८०', 'सुंदरियों', 'के', 'बीच', '२०', 'वर्षीय', 'हॉकिंस', 'को', 'सर्वश्रेष्ठ', 'आंका', 'गया'], ['मिस', 'अमेरिका', 'शैंडी', 'फिनेजी', 'को', 'प्रथम', 'उप', 'विजेता', 'और', 'मिस', 'प्यूरेटो', 'रिको', 'अल्बा', 'रेइज', 'द्वितीय', 'उप', 'विजेता', 'चुनी', 'गई'], ['भारत', 'की', 'तनुश्री', 'दत्ता', 'अंतिम', '१०', 'प्रतिभागियों', 'में', 'ही', 'स्थान', 'बना', 'पाई'], ['हॉकिंस', 'ने', 'कहा', 'कि', 'जीत', 'के', 'बारे', 'में', 'उसने', 'सपने', 'में', 'भी', 'नहीं', 'सोचा', 'था'], ['सौंदर्य', 'की', 'यह', 'शीर्ष', 'प्रतियोगिता', 'क्विटो', 'के', 'कन्वेंशन', 'सेंटर', 'में', 'मंगलवार', 'देर', 'रात', 'शुरू', 'हुई'], ['करीब', '७५००', 'विशिष्ट', 'दर्शकों', 'की', 'मौजूदगी', 'में', 'विश्व', 'की', 'सर्वश्रेष्ठ', 'सुंदरी', 'के', 'चयन', 'की', 'कवायद', 'शुरू', 'हुई'], ['हर', 'चरण', 'के', 'बाद', 'लोगों', 'की', 'सांसे', 'थमने', 'लगतीं'], ['टीवी', 'पर', 'लुत्फ', 'उठा', 'रहे', 'दर्शक', 'अपने', 'देश', 'व', 'क्षेत्र', 'की', 'सुंदरी', 'की', 'प्रतियोगिता', 'में', 'स्थिति', 'के', 'बारे', 'में', 'व्यग्र', 'रहे'], ['फाइनल', 'में', 'पहुंचने', 'वाली', 'पांच', 'प्रतिभागियों', 'में', 'मिस', 'पेराग्वे', 'यानिना', 'गोंजालेज', 'और', 'मिस', 'त्रिनिदाद', 'व', 'टोबैगो', 'डेनियल', 'जोंस', 'भी', 'शामिल', 'थीं']]
>>> model = gensim.models.Word2Vec(sentences, size =10,  min_count=1) 
>>> pred = []
>>> for word in sentence:
...         pred.append(model.wv[word].tolist())
... 
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
  File "/home/djokester/anaconda3/lib/python3.5/site-packages/gensim/models/keyedvectors.py", line 574, in __getitem__
    return self.word_vec(words)
  File "/home/djokester/anaconda3/lib/python3.5/site-packages/gensim/models/keyedvectors.py", line 273, in word_vec
    raise KeyError("word '%s' not in vocabulary" % word)
KeyError: "word 'नीरजः' not in vocabulary"

正如你所看到的,我检查了这个词&#34;नीरजः&#34;在标记化句子列表中。它存在于我提供给Word2Vec培训师的列表中,但在培训之后它不在词汇表中。

1 个答案:

答案 0 :(得分:1)

它绝不会“遗漏”包含在标记化语料库中的单词,并且至少出现min_count次。因此,如果您获得KeyError,您可以确信在培训期间从未提供相关的字令牌。

在要重现的示例代码中,仔细查看:

sentence = "Jack and Jill went up the Hill"
sentence = [word_tokenize(i) for i in sentence]

i in sentence将是字符串的每个字符。您未示出的word_tokenize()函数不太可能对单个字符['J', 'a', 'c', 'k', ' ', ...]执行任何有用的操作 - 可能只是将它们保留为字母列表。然后+ - 将其附加到您的其他sentences会使sentences 30个项目更长,而不是您期望的单个额外标记化示例。

我怀疑你的真正问题是不同的但是相关:标记化和构图有问题。因此,请分别检查每个步骤的预期结果和嵌套类型。 (每个步骤使用唯一变量,例如sentences_tokenizedsentence_tokenized,而不是使用重复使用的变量,如sentencessentence,可以帮助调试。)

按照您的建议更新修改:您最新代码的问题在于+ - 追加的行仍然是错误的;它将每个单词附加在句子中,好像它是自己的新句子一样。查看每个步骤的结果 - 在可变内容和长度 - 应该有助于明确这一点。另外,我再次建议在调试时不要重复使用变量。第"नीरजः" in sentences #proof that the word is present inside sentences行实际证明句子是错误的;该单个字不应该是sentences中的项目,而应该是其最后一个代码列表sentences[-1]

相关问题