Gensim:训练时丢失 Words/Tokens
Gensim: Loss of Words/Tokens while Training
我有一个由维基媒体转储文件构建的语料库存储在 sentences.txt
我有一句话说'नीरजःहाँमाताजी! स्कूलख़त्महोतेसीधाघरआऊँगा'
现在,当我尝试提取词向量时,总是会在训练时遗漏一两个词(尽管包含在要训练的列表中),我得到了 KeyError。
有什么方法可以改进训练,使其不会经常漏掉单词吗?
这是它确实发生的证据。 tok.wordtokenize
是一个分词器。 sent.drawlist()
以及 sents.drawlist()
returns 存储在 sentences.txt[=30 中的语料库中的句子列表=].
>>> 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"
如您所见,我检查了标记化句子列表中的单词“नीरजः”。它出现在我输入 Word2Vec 训练器的列表中,但在训练后它不在词汇表中。
它不应该 'miss' 包含在标记化语料库中的单词,并且至少出现 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_tokenized
或 sentence_tokenized
,而不是像 sentences
和 sentence
这样的重用变量,可以帮助调试。)
按照您的建议更新为编辑:您最新代码的问题是您 +
-append 所在的行仍然是错误的;它在句子中附加每个单词,就好像它是自己的新句子一样。查看每一步的结果——可变内容和长度——应该有助于弄清楚这一点。此外,我再次建议在调试时不要在多个步骤中重复使用变量。 "नीरजः" in sentences #proof that the word is present inside sentences
行实际上是在证明句子是错误的;那个单词不应该是 sentences
中的一个项目,而是在它的最后一个标记列表 sentences[-1]
.
中
我有一个由维基媒体转储文件构建的语料库存储在 sentences.txt 我有一句话说'नीरजःहाँमाताजी! स्कूलख़त्महोतेसीधाघरआऊँगा'
现在,当我尝试提取词向量时,总是会在训练时遗漏一两个词(尽管包含在要训练的列表中),我得到了 KeyError。 有什么方法可以改进训练,使其不会经常漏掉单词吗?
这是它确实发生的证据。 tok.wordtokenize
是一个分词器。 sent.drawlist()
以及 sents.drawlist()
returns 存储在 sentences.txt[=30 中的语料库中的句子列表=].
>>> 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"
如您所见,我检查了标记化句子列表中的单词“नीरजः”。它出现在我输入 Word2Vec 训练器的列表中,但在训练后它不在词汇表中。
它不应该 'miss' 包含在标记化语料库中的单词,并且至少出现 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_tokenized
或 sentence_tokenized
,而不是像 sentences
和 sentence
这样的重用变量,可以帮助调试。)
按照您的建议更新为编辑:您最新代码的问题是您 +
-append 所在的行仍然是错误的;它在句子中附加每个单词,就好像它是自己的新句子一样。查看每一步的结果——可变内容和长度——应该有助于弄清楚这一点。此外,我再次建议在调试时不要在多个步骤中重复使用变量。 "नीरजः" in sentences #proof that the word is present inside sentences
行实际上是在证明句子是错误的;那个单词不应该是 sentences
中的一个项目,而是在它的最后一个标记列表 sentences[-1]
.