word2vec recommendation system KeyError: "word '21883' not in vocabulary"
word2vec recommendation system KeyError: "word '21883' not in vocabulary"
对于包含 500000+ 个实例的数据集,该代码绝对可以正常工作,但是每当我将数据集减少到 5000/10000/15000 时,它都会抛出一个关键错误:单词“***”不在 vocabulary.Not对于每个数据点,但对于大多数数据点,它都会抛出 error.The 数据集采用 excel 格式。 [1]: https://i.stack.imgur.com/YCBiQ.png
我不知道如何解决这个问题,因为我对此知之甚少,我仍然learning.Please帮助我解决这个问题!
purchases_train = []
for i in tqdm(customers_train):
temp = train_df[train_df["CustomerID"] == i]["StockCode"].tolist()
purchases_train.append(temp)
purchases_val = []
for i in tqdm(validation_df['CustomerID'].unique()):
temp = validation_df[validation_df["CustomerID"] == i]["StockCode"].tolist()
purchases_val.append(temp)
model = Word2Vec(window = 10, sg = 1, hs = 0,
negative = 10, # for negative sampling
alpha=0.03, min_alpha=0.0007,
seed = 14)
model.build_vocab(purchases_train, progress_per=200)
model.train(purchases_train, total_examples = model.corpus_count,
epochs=10, report_delay=1)
model.save("word2vec_2.model")
model.init_sims(replace=True)
# extract all vectors
X = model[model.wv.vocab]
X.shape
products = train_df[["StockCode", "Description"]]
products.drop_duplicates(inplace=True, subset='StockCode', keep="last")
products_dict=products.groupby('StockCode'['Description'].apply(list).to_dict()
def similar_products(v, n = 6):
ms = model.similar_by_vector(v, topn= n+1)[1:]
new_ms = []
for j in ms:
pair = (products_dict[j[0]][0], j[1])
new_ms.append(pair)
return new_ms
similar_products(model['21883'])
如果你 KeyError
说某个词不在词汇表中,这是一个可靠的指标,表明你正在查找的词不在提供给 Word2Vec
的训练数据中,或者没有出现足够(默认 min_count=5
)次。
因此,您的错误表明单词标记 '21883'
在提供给 Word2Vec
的文本 (purchases_train
) 中未出现至少 5 次。您应该执行其中一项或两项:
确保您要查找的所有单词出现足够的次数,训练数据更多或更少min_count
。 (然而,只出现一次或几次的单词往往 不会 获得好的向量,而只是降低周围单词向量的质量 - 所以保持这个值高于 1
,甚至将其提高到 5
的默认值以上以丢弃 more 个稀有词,只要你有足够的数据,这是一个更好的路径。)
如果您以后的代码将查找可能不存在的单词,请先检查它们是否存在 (word in model.wv.vocab
) 或设置一个 try: ... except: ...
来捕获 &处理他们不存在的情况。
对于包含 500000+ 个实例的数据集,该代码绝对可以正常工作,但是每当我将数据集减少到 5000/10000/15000 时,它都会抛出一个关键错误:单词“***”不在 vocabulary.Not对于每个数据点,但对于大多数数据点,它都会抛出 error.The 数据集采用 excel 格式。 [1]: https://i.stack.imgur.com/YCBiQ.png 我不知道如何解决这个问题,因为我对此知之甚少,我仍然learning.Please帮助我解决这个问题!
purchases_train = []
for i in tqdm(customers_train):
temp = train_df[train_df["CustomerID"] == i]["StockCode"].tolist()
purchases_train.append(temp)
purchases_val = []
for i in tqdm(validation_df['CustomerID'].unique()):
temp = validation_df[validation_df["CustomerID"] == i]["StockCode"].tolist()
purchases_val.append(temp)
model = Word2Vec(window = 10, sg = 1, hs = 0,
negative = 10, # for negative sampling
alpha=0.03, min_alpha=0.0007,
seed = 14)
model.build_vocab(purchases_train, progress_per=200)
model.train(purchases_train, total_examples = model.corpus_count,
epochs=10, report_delay=1)
model.save("word2vec_2.model")
model.init_sims(replace=True)
# extract all vectors
X = model[model.wv.vocab]
X.shape
products = train_df[["StockCode", "Description"]]
products.drop_duplicates(inplace=True, subset='StockCode', keep="last")
products_dict=products.groupby('StockCode'['Description'].apply(list).to_dict()
def similar_products(v, n = 6):
ms = model.similar_by_vector(v, topn= n+1)[1:]
new_ms = []
for j in ms:
pair = (products_dict[j[0]][0], j[1])
new_ms.append(pair)
return new_ms
similar_products(model['21883'])
如果你 KeyError
说某个词不在词汇表中,这是一个可靠的指标,表明你正在查找的词不在提供给 Word2Vec
的训练数据中,或者没有出现足够(默认 min_count=5
)次。
因此,您的错误表明单词标记 '21883'
在提供给 Word2Vec
的文本 (purchases_train
) 中未出现至少 5 次。您应该执行其中一项或两项:
确保您要查找的所有单词出现足够的次数,训练数据更多或更少
min_count
。 (然而,只出现一次或几次的单词往往 不会 获得好的向量,而只是降低周围单词向量的质量 - 所以保持这个值高于1
,甚至将其提高到5
的默认值以上以丢弃 more 个稀有词,只要你有足够的数据,这是一个更好的路径。)如果您以后的代码将查找可能不存在的单词,请先检查它们是否存在 (
word in model.wv.vocab
) 或设置一个try: ... except: ...
来捕获 &处理他们不存在的情况。