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: ... 来捕获 &处理他们不存在的情况。