代码在包含500000+实例的数据集上运行得非常好,但是每当我把数据集减少到50001000015000的时候,它就会抛出一个关键错误:单词 "***"不在词汇表中。 [1]: https:/i.stack.imgur.comYCBiQ.png我不知道如何解决这个问题,因为我对这个问题的了解很少,我还在学习中。
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'
在案文中至少出现5次以上(见附件一)。purchases_train
)提供给 Word2Vec
. 你应该做其中之一或两者。
确保所有你要查找的词出现足够的次数,要么用更多的训练数据,要么用更低的数据。min_count
. (然而,只有一个或几个出现的词往往是 不 来获得好的向量&而只需将包围词的向量的quaality拖低--所以保持这个值高于 1
,甚至将其提高到高于默认的 5
摈弃 更多 罕见的单词,只要你有足够的数据,都是一个比较好的路径)。)
如果你后面的代码要查找可能不存在的词,要么先检查它们是否存在(word in model.wv.vocab
)或建立一个 try: ... except: ...
来抓&;处理他们不在场的情况。