【问题标题】:Cosine Similarity between keywords关键字之间的余弦相似度
【发布时间】:2019-05-14 04:23:59
【问题描述】:

我是在 python 中记录相似性的新手,我对如何处理一些数据感到困惑。基本上,我想获得包含关键字的字典之间的余弦相似度。

我有这样的字典,我是直接从数据库中获取的:

{'hat': 0.12, 'cat': 0.33, 'sat': 0.45}
{'rat': 0.22, 'bat':0.98, 'cat': 0.01}

我查询数据库并以这种格式取回数据。这些是每个关键字列表及其各自的 tf-idf 分数/权重。

{'keyword': tfidf_score}

我想要做的就是得到这两个字典之间的余弦相似度,由 tfidf 分数加权。在网上看,当涉及到文档相似性时,我对所有不同的 python 库/模块感到不知所措。我不知道是否有一些内置函数可以将这些类型的 json 对象传递给,我是否应该编写自己的使用权重的函数,或者什么。

感谢任何帮助!

谢谢!

【问题讨论】:

  • 我建议您阅读有关 TF-IDF 的更多信息。显示为每个单词/键值的数字实际上是频率而不是向量。一个向量会像这样{"hat" : [0.12, 0.2,0.98,....]}
  • 如果你想得到这些词的向量,我建议看看 Word2Vec

标签: python nlp keyword tf-idf cosine-similarity


【解决方案1】:

SciKit Learn 库有一个相当简单的余弦度量。虽然我同意这个库很大而且看起来让人不知所措,但您可以深入研究一些小部分。

我不完全确定您通过按照您建议的方式比较事物来达到什么目的,但如果您想获得语料库中由关键字表示的文档之间的余弦相似度,您首先需要(正如 Marmikshah 指出的那样)在关键字词(维度)中对文档进行矢量表示。

例如

import logging
import numpy
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity

logging.basicConfig(level=logging.DEBUG,
                    filename='test.log', filemode='w')

dataset = ['the cat sat on the mat',
          'the rat sat in the hat',
          'the hat sat on the bat']


vectorizer = TfidfVectorizer()
X_tfidf = vectorizer.fit_transform(dataset)

# ...you say you are already at this point here...

sims = cosine_similarity(X_tfidf, X_tfidf)
rank = list(reversed(numpy.argsort(sims[0])))

logging.debug("\nTdidf: \n%s" % X_tfidf.toarray())
logging.debug("\nSims: \n%s", sims)
logging.debug("\nRank: \n%s", rank)

通常例如在搜索中,您首先要预先对语料库进行矢量化,然后对搜索查询进行矢量化并获取其表示的模拟:

Y_tfidf = vectorizer.fit_transform(search_query)
sims = cosine_similarity(Y_tfidf, X_tfidf)

然后对排名靠前的文档进行排序并挑选/呈现。

我修改了这个 X,Y 以交叉引用语料库中的文档,而不是上面的 X,X。

【讨论】:

    猜你喜欢
    • 2017-04-04
    • 2020-02-11
    • 2018-09-27
    • 1970-01-01
    • 2020-08-12
    • 2011-02-21
    • 2014-02-25
    • 1970-01-01
    • 2017-03-19
    相关资源
    最近更新 更多