了解 word2vec gensim 寻找替代品的结果

Understanding results of word2vec gensim for finding substitutes

我已经在单个类别的交易数据 (link) 上实现了 word2vec 模型。
我的目标是从数据中找到可替代的项目。
该模型给出了结果,但我想确保我的模型给出的结果是基于客户历史数据(考虑上下文),而不仅仅是基于内容(语义数据)。 idea类似于推荐系统。
我已经使用 gensim 库实现了这个,我在其中以列表列表的形式传递了数据(产品)。

例如

[['BLUE BELL ICE CREAM GOLD RIM', 'TILLAMK CHOC CHIP CK DOUGH  IC'],
 ['TALENTI SICILIAN PISTACHIO GEL', 'TALENTI BLK RASP CHOC CHIP GEL'],
 ['BREYERS HOME MADE VAN ICE CREAM',
  'BREYERS HOME MADE VAN ICE CREAM',
  'BREYERS COFF ICE CREAM']]

在这里,每个子列表都是单个客户过去一年的购买历史记录。

# train word2vec model
model = Word2Vec(window = 5, sg = 0,
                 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)

# extract all vectors
X = []
words = list(model.wv.index_to_key)
for word in words:
    x = model.wv.get_vector(word)
    X.append(x)
Y = np.array(X)
Y.shape

def similar_products(v, n = 3):
    
    # extract most similar products for the input vector
    ms = model.wv.similar_by_vector(v, topn= n+1)[1:]
    
    # extract name and similarity score of the similar products
    new_ms = []
    for j in ms:
        pair = (products_dict[j[0]][0], j[1]) 
        new_ms.append(pair)
        
    return new_ms 

similar_products(model.wv['BLUE BELL ICE CREAM GOLD RIM'])

结果:

 [('BLUE BELL ICE CREAM BROWN RIM', 0.7322707772254944),
     ('BLUE BELL ICE CREAM LIGHT', 0.4575043022632599),
     ('BLUE BELL ICE CREAM NSA', 0.3731085956096649)]

为了直观地理解 word2vec 及其如何获得结果,我创建了一个虚拟 dataset,我想在其中找到 'FOODCLUB VAN IC PAIL' 的字幕。
如果两种产品多次出现在同一篮子中,则它们是替代品。
看数据先替换应该是'FOODCLUB CHOC CHIP IC PAIL' 但是我得到的结果是:

[('FOODCLUB NEAPOLITAN IC PAIL', 0.042492810636758804),
 ('FOODCLUB COOKIES CREAM ICE CREAM', -0.04012278839945793),
 ('FOODCLUB NEW YORK VAN IC PAIL', -0.040678512305021286)]
  1. 任何人都可以帮助我理解 word2vec 模型在 gensim 中的直观工作方式吗?是否会将每个产品视为单词,将客户列表视为句子?
  2. 为什么我的结果在虚拟数据集中如此荒谬?我该如何改进?
  3. 哪些超参数对该模型起着重要作用 w.r.t?是否需要负采样?

使用这些 product-baskets 作为训练数据,您可能无法很好地直观理解通常的 word2vec 行为。该算法最初是为 natural-language 文本开发的,其中文本是标记的运行,其频率 & co-occurrences 遵循特定的指示模式。

人们当然会在 runs-of-tokens 上使用 word2vec,这不是自然语言——比如产品篮,或 logs-of-actions 等——但在某种程度上,这些标记具有 very-different 模式,可能需要额外的预处理或调整,否则将很难获得有用的结果。

因为 customer-purchases 可能与真实语言有一些不同,这取决于您的“pseudo-texts”实际代表什么:

  • 文本中的排序可能是您创建 data-dump 的人工产物,而不是任何有意义的东西
  • window 中每个标记的 nearest-neighbors 与更远的标记相比可能重要也可能不重要
  • 客户订购模式通常可能不像 natural-language 文本
  • 中的文字那样反映 shades-of-relationships

所以 word2vec 不会自动在这里给出有趣的结果,以供推荐。

对于小型数据集或微型虚拟数据集尤其如此。 Word2vec 需要 lots 的不同数据来将元素打包到 high-dimensional space 中有趣的相对位置。即使是小型演示通常也有 tens-of-thousands 的词汇表(唯一标记的计数),训练文本数十次提供每个标记的各种用法示例。

否则,模型将永远学不到任何东西 interesing/generalizable。如果尝试创建一个 many-dimensions 模型(比如默认的 vector_size=100),并且每个示例的用法示例很少,那么这种情况尤其如此。如果标记出现的次数少于默认的 min_count=5 次——当它们被完全忽略时,情况只会变得更糟。所以不要指望从你的虚拟数据中得到任何有趣的东西。

如果你想培养直觉,我会尝试一些教程和其他目标,首先使用真实的自然语言文本,使用各种数据集和参数,以了解什么对结果有什么样的影响有用性——只有在那之后才尝试使 word2vec 适应其他数据。

Negative-sampling 是默认值,并且适用于典型的数据集,尤其是当它们变大时(其中 negative-sampling 比 hierarchical-softmax 对大词汇表的性能影响更小)。但是除非有其他问题,否则这两种模式之间的切换不太可能导致质量的巨大变化。

足够的数据,正确的类型,是关键 - 然后调整参数可能会推动 end-result 有用性朝着更好的方向发展,或者为了某些目的而变得更好。

但更具体的参数提示只有在更明确的目标下才有可能,一旦某些基线起作用。