训练自定义word2vec模型
training custom word2vec model
我有自己的数据集,我想在其中使用 gensim word2vec 进行训练,但我不确定该怎么做。
from google.colab import files
import io
uploaded = files.upload()
data_path = 'chatbot_dataset.txt'
with open(data_path, 'r') as f:
lines = f.read().split('\n')
for line in lines:
input_text = line.split('\t')[0]
if len(input_text.split()) > MAX_SENTENCE_LENGTH:
break
target_text = '<START> ' + line.split('\t')[1] + " <END>"
input_texts.append(input_text)
target_texts.append(target_text)
model = Word2Vec(lines, min_count=1,workers=3,size=100,window=3,sg=1)
model.wv.get_vector('hello')
但是我在执行此操作时遇到了这个错误,即使 'hello' 这个词已经在我的数据集中:
KeyError Traceback (most recent call last)
<ipython-input-15-b41c8cb17d3b> in <module>()
140 model.wv.vector_size
141 #check out how 'PEM' is represented in an array of 100 numbers
--> 142 model.wv.get_vector('hello')
143 #find words with similar meaning to 'PEN'
144 model.wv.most_similar('to')
1 frames
/usr/local/lib/python3.7/dist-packages/gensim/models/keyedvectors.py in word_vec(self, word, use_norm)
450 return result
451 else:
--> 452 raise KeyError("word '%s' not in vocabulary" % word)
453
454 def get_vector(self, word):
KeyError: "word 'hello' not in vocabulary"
您正在向 Word2Vec
.
提供似乎是纯字符串列表的 lines
Word2Vec
而是期待一个可重复的项目序列,其中每个项目都是一个预先标记化的字符串列表。通过向它传递一系列纯字符串,当 Word2Vec
将一个字符串解释为一个列表时,它将把它视为一个单字符列表——因此它学习的整个 'words' 集合将只是单字符。 (您的日志中可能有关于此的警告,或者如果您 运行 至少是 INFO 日志记录,进度报告显示发现的唯一单词的数量少得可疑。)
您可以通过检查 model.wv.index_to_key
来了解模型的词汇量 - 例如,查看 print(model.wv.index_to_key[:10]
找到的 10 个最常用的词。如果这看起来不正确,请确保你正确 preprocessing/tokenizing 你将交给 Word2Vec
.
的语料库
另外:min_count=1
永远不是 Word2Vec
的好主意。只有具有多个不同用法示例的词才能获得有用的词向量,并且通常会丢弃最稀有的词,如默认 min_count=5
,确保所有幸存词的最佳质量向量。 (如果有少于 5 个用法示例的单词需要向量,最好的方法是获取更多不同用法的训练数据。)
我有自己的数据集,我想在其中使用 gensim word2vec 进行训练,但我不确定该怎么做。
from google.colab import files
import io
uploaded = files.upload()
data_path = 'chatbot_dataset.txt'
with open(data_path, 'r') as f:
lines = f.read().split('\n')
for line in lines:
input_text = line.split('\t')[0]
if len(input_text.split()) > MAX_SENTENCE_LENGTH:
break
target_text = '<START> ' + line.split('\t')[1] + " <END>"
input_texts.append(input_text)
target_texts.append(target_text)
model = Word2Vec(lines, min_count=1,workers=3,size=100,window=3,sg=1)
model.wv.get_vector('hello')
但是我在执行此操作时遇到了这个错误,即使 'hello' 这个词已经在我的数据集中:
KeyError Traceback (most recent call last)
<ipython-input-15-b41c8cb17d3b> in <module>()
140 model.wv.vector_size
141 #check out how 'PEM' is represented in an array of 100 numbers
--> 142 model.wv.get_vector('hello')
143 #find words with similar meaning to 'PEN'
144 model.wv.most_similar('to')
1 frames
/usr/local/lib/python3.7/dist-packages/gensim/models/keyedvectors.py in word_vec(self, word, use_norm)
450 return result
451 else:
--> 452 raise KeyError("word '%s' not in vocabulary" % word)
453
454 def get_vector(self, word):
KeyError: "word 'hello' not in vocabulary"
您正在向 Word2Vec
.
lines
Word2Vec
而是期待一个可重复的项目序列,其中每个项目都是一个预先标记化的字符串列表。通过向它传递一系列纯字符串,当 Word2Vec
将一个字符串解释为一个列表时,它将把它视为一个单字符列表——因此它学习的整个 'words' 集合将只是单字符。 (您的日志中可能有关于此的警告,或者如果您 运行 至少是 INFO 日志记录,进度报告显示发现的唯一单词的数量少得可疑。)
您可以通过检查 model.wv.index_to_key
来了解模型的词汇量 - 例如,查看 print(model.wv.index_to_key[:10]
找到的 10 个最常用的词。如果这看起来不正确,请确保你正确 preprocessing/tokenizing 你将交给 Word2Vec
.
另外:min_count=1
永远不是 Word2Vec
的好主意。只有具有多个不同用法示例的词才能获得有用的词向量,并且通常会丢弃最稀有的词,如默认 min_count=5
,确保所有幸存词的最佳质量向量。 (如果有少于 5 个用法示例的单词需要向量,最好的方法是获取更多不同用法的训练数据。)