python - 关键字之间的余弦相似度
问题描述
我是在 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 对象传递给,我是否应该编写自己的使用权重的函数,或者什么。
任何帮助表示赞赏!
谢谢!
解决方案
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。
推荐阅读
- django - Apple使用allauth和rest-auth登录django rest框架
- react-native - Expo react-native:.png 图像未显示在 testflight 应用程序上(在开发中工作正常)
- java - Hashset contains with exact character placement and incorrect character placement
- django - Postgres 语法到 DJANGO ORM 语法
- python - Python boto3 检查区域内的有效存储桶
- python - 如何编写一个函数来计算 5 个不对称和传递的元素的可能二元关系的数量
- c++ - gltf,矩阵是否要转置?
- r - 使用 R ggplot 控制条形图中的条形顺序
- npm - npm 不工作 - 安装 hdwallet-provider 时“读取 ECONNRESET”
- asp.net-web-api - 向经典 ASP.NET Web 窗体应用和 Web API 应用添加共享身份验证