【问题标题】:Using Gensin Word2Vec to improve search使用 Gensim Word2Vec 改进搜索
【发布时间】:2021-10-28 11:29:02
【问题描述】:

我有一个来自数百万个数组的数据集,如下所示:

  sentences=[
    [
     'query_foo bar',
     'split_query_foo',
     'split_query_bar',
     'sku_qwre',
     'brand_A B C',
     'split_brand_A',
     'split_brand_B',
     'split_brand_C',
     'color_black',
     'category_C1',
     'product_group_clothing',
     'silhouette_t_shirt_top',
  ],
  [...]
  ]

您可以在哪里找到查询、执行查询的用户获得的 sku 以及 SKU 的一些属性。我的想法是做一个基于 word2vec 的非常基本的模型,我可以在其中找到相似的东西。

简单来说,如果我在模型上搜索 t-shirt,我希望在查询附近有 T 恤 SKU。

我尝试使用具有不同属性的 gensim(我是这个库的新手)来构建模型:

from gensim.models.callbacks import CallbackAny2Vec

class callback(CallbackAny2Vec):
    '''Callback to print loss after each epoch.'''

    def __init__(self):
        self.epoch = 0
        self.loss_to_be_subed = 0

    def on_epoch_end(self, model):
        loss = model.get_latest_training_loss()
        loss_now = loss - self.loss_to_be_subed
        self.loss_to_be_subed = loss
        print('Loss after epoch {}: {}'.format(self.epoch, loss_now))
        self.epoch += 1

model = Word2Vec(
  sentences=sentences, 
  vector_size=100, 
  window=1000, 
  min_count=2, 
  workers=-1,
  epochs=10,
#   negative=5,
  compute_loss=True,
  callbacks=[callback()]
)

我得到了这个输出:

Loss after epoch 0: 0.0
Loss after epoch 1: 0.0
Loss after epoch 2: 0.0
Loss after epoch 3: 0.0
Loss after epoch 4: 0.0
Loss after epoch 5: 0.0
Loss after epoch 6: 0.0
Loss after epoch 7: 0.0
Loss after epoch 8: 0.0
Loss after epoch 9: 0.0

全输0!!! 此时我开始变得非常怀疑。

注意:sentences 的每个元素都是独立的,我希望库不要尝试在不同的数组中混合不同的术语。

为了尝试测试模型,我尝试了一个非常频繁的查询,例如model.wv.most_similar('query_t-shirt', topn=100),结果完全荒谬。

是我的想法很疯狂还是我使用错误的库?

【问题讨论】:

    标签: python nlp gensim information-retrieval


    【解决方案1】:

    workers=-1 不是有效的参数值。如果有一个例子表明某处负数,这是一个坏例子。如果您认为 Gensim 官方文档中的某些内容可行,请将该文档报告为要修复的错误。

    更一般地说:在INFO 级别启用日志记录将显示有关正在发生的事情的更多详细信息,并且在使用此类日志记录时,诸如“阻止任何训练发生的错误参数”之类的内容可能会变得更加明显。

    分别:

    • Gensim 的Word2Vec 损失跟踪有很多未解决的问题(包括未能按纪元计算,您的Callback 试图纠正)。我建议不要使用 loss-display 除非/直到您已经在没有它的情况下取得了一些成功。

    • 如此低的min_count=2 通常对于 word2vec 算法来说是个坏主意,至少在正常的自然语言设置中是这样。出现次数如此之少的单词缺乏各种对比用法示例来实现可概括的词向量,或者单独地与更多的其他单词相比对模型的影响更大。但是,这些罕见的词总共相当多——本质上是作为“噪音”使其他词恶化。丢弃更多这样的稀有词通常会显着改善剩余的词和整体模型。因此,如果您有足够的原始训练数据来让 word2vec 值得应用,那么增加这个截止值应该比默认的min_count=5 更高而不是减少它。

    • 对于由不完全类似于自然语言的伪文本提供的类推荐系统,尝试使用ns_exponent 参数可能特别值得。根据the class docs 中链接的the research paper,原始的ns_exponent=0.75 值在早期的word2vec 实现中是一个不可更改的常量,可能不适用于推荐系统等其他应用程序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-16
      • 1970-01-01
      • 1970-01-01
      • 2014-04-02
      • 2017-03-28
      相关资源
      最近更新 更多