【问题标题】:Why most_similar in word2vec doesn't consider the term itself?为什么 word2vec 中的 most_similar 不考虑该术语本身?
【发布时间】:2020-11-12 13:54:12
【问题描述】:

我正在从事一个实体相似性项目。 word2vec gensim 模型中的most_similar 在这方面工作得很好。但是,我也希望搜索词本身包含在结果中。应该是这样的:

>>> model = Word2Vec(sw_token, min_count=2)
>>> model = gensim.models.KeyedVectors.load("model.bin")
>>> model.wv.most_similar("melanoma", topn=5)

[('melanoma', 1.000000),
 ('cutaneous', 0.6512814164161682),
 ('uveal', 0.6295092701911926),
 ('gp100', 0.617050290107727),
 ('ligand-bearing', 0.614188551902771)]

官方文件没有显示任何可以帮助我的东西。另外,如果有诸如melanoma xyz 之类的术语,我们如何才能在 most_similar 中得到更接近的词?我知道它将考虑单词,因此两个单词算作 2 而不是一个,因此它们在这里并不相似。也许。谢谢。

【问题讨论】:

    标签: python nlp gensim word2vec similarity


    【解决方案1】:

    其行为方式的原因是您的首选行为不是常见的偏好:大多数提供单个单词作为起点的用户不需要重复相同的单词作为顶部结果。当然当然这个词本身最接近它自己,并且具有1.0 的余弦相似度。 (类似地,当在对类比求解有用的模式下使用此方法时 - model.most_similar(positive=['queen', 'man'], negative=['king']] - 候选答案中不需要提供的单词。)

    作为Itamar Trainnin's answer notes,如果您出于某种原因需要它,您可以自己添加该公理化结果。

    另请注意,如果您提供原始向量作为原点,而不是关键字来查找原点,则不会根据提供的关键字过滤结果。因此,以下结果将包括'melanoma'

    model.wv.most_similar(positive=[model.wv['melanoma']], topn=5)
    

    不清楚您所说的“如果有诸如melanoma xyz 之类的术语,我们如何才能在 most_similar 中得到更接近的词”。可以使用单词'melanoma xyz' 训练您的模型。 (如果在模型创建和训练期间提供了足够数量的词标记,则将为该标记学习一个词向量。当它位于 most_similar() 查询的最佳结果中时,将返回该标记。

    但如果模型没有使用这样的标记进行训练,则该字符串将没有任何向量,因此'melanoma xyz' 不能作为返回结果。 (并且,如果作为来源提供,将创建一个KeyError。)

    如果'melanoma xyz' 在您的领域中是一个独特的概念,您希望被视为它自己的单词(并获得它自己的单词向量),您可以考虑更改您的初始标记化以将其保留为一个单元,而不是将其分解为['melanoma', 'xyz']。这可以通过一些精心挑选的要组合的词组列表来完成,或者通过使用Gensim Phrases class 提供的统计分析来完成。 (为了清楚起见,最典型的做法是使用显式下划线 '_' 将此类标记重新组合为单个标记。)在对此类文本进行训练后,'melanoma_xyz' 将具有词向量并因此接收到学习向量。

    如果您一开始没有选择这种明确的多词组合,您也可以考虑:

    1. 当您有像 'melanoma xyz' 这样的字符串作为查询时,将其拆分为两个词 - ['melanoma', 'xyz'] - 并创建这两个词的平均值的单个向量(如果两者都独立存在于您的模型中)。这很粗糙,但总比没有好。

    2. 考虑使用像 FastText 这样的模型 - 它执行 (1) 的增强版本,其中任何单词的每个片段都对其单词向量有所贡献。因此,当提供一个完全未知的词时,仅仅与训练期间看到的词片段重叠——比如'mela''noma''xyz'——就可以创建一个粗略的词向量。 (这样的向量不是很好,但通常总比没有好,尽管结果集中的单词列表仍然只包括实际存在的训练期间的单词。)

    【讨论】:

    • 首先感谢您的回答。虽然,您提供的示例代码没有按您的预期工作。 model.wv.most_similar(model.wv['melanoma'], topn=5) 一旦我能够对此进行深入研究,我将接受答案。请接受我的道歉;
    • 抱歉,我已更改代码以将model.wv['melanoma'] 明确放置为作为参数positive 提供的列表的成员之一,这应该使其行为与最初描述的一样。
    【解决方案2】:

    至于将搜索词包含在最相似的列表中,您可以手动将其添加到输出列表的开头。由于令牌与自身的余弦相似度为1,因此它应该始终是返回列表中的第一个令牌。

    至于包含melanoma xyz 之类的术语,您可以在训练之前迭代您的语料库,并使用“_”将所有这些术语加入一个标记中 - 即melanoma_xyz。请注意,这样您将获得“黑色素瘤”和melanoma_xyz 的不同向量。希望它们在向量空间中彼此靠近。

    【讨论】:

      【解决方案3】:

      发生这种情况是因为一个词在一个词周围重复出现的概率几乎为零。您训练 word2vec 的语料库很可能在任何地方都没有字符串“melanoma melanoma”。在获得“melanoma”的嵌入词向量后,与“melanoma”的点积最大化的向量将是“melanoma”本身,但输入语料中不存在此类实例。

      【讨论】:

        猜你喜欢
        • 2023-04-03
        • 2020-06-15
        • 2019-07-01
        • 2018-05-14
        • 1970-01-01
        • 2021-07-09
        • 2021-10-11
        • 2016-10-13
        • 1970-01-01
        相关资源
        最近更新 更多