- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我正在学习 Part 1 上提供的教程& Part 2 .不幸的是,作者没有时间在最后一节中使用余弦相似度来实际找到两个文档之间的距离。在 stackoverflow 的以下链接的帮助下,我按照文章中的示例进行了操作。 ,包括上面链接中提到的代码(只是为了让生活更轻松)
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
from nltk.corpus import stopwords
import numpy as np
import numpy.linalg as LA
train_set = ["The sky is blue.", "The sun is bright."] # Documents
test_set = ["The sun in the sky is bright."] # Query
stopWords = stopwords.words('english')
vectorizer = CountVectorizer(stop_words = stopWords)
#print vectorizer
transformer = TfidfTransformer()
#print transformer
trainVectorizerArray = vectorizer.fit_transform(train_set).toarray()
testVectorizerArray = vectorizer.transform(test_set).toarray()
print 'Fit Vectorizer to train set', trainVectorizerArray
print 'Transform Vectorizer to test set', testVectorizerArray
transformer.fit(trainVectorizerArray)
print
print transformer.transform(trainVectorizerArray).toarray()
transformer.fit(testVectorizerArray)
print
tfidf = transformer.transform(testVectorizerArray)
print tfidf.todense()
由于上述代码,我有以下矩阵
Fit Vectorizer to train set [[1 0 1 0]
[0 1 0 1]]
Transform Vectorizer to test set [[0 1 1 1]]
[[ 0.70710678 0. 0.70710678 0. ]
[ 0. 0.70710678 0. 0.70710678]]
[[ 0. 0.57735027 0.57735027 0.57735027]]
我不确定如何使用此输出来计算余弦相似度,我知道如何针对两个长度相似的向量实现余弦相似度,但在这里我不确定如何识别这两个向量。
最佳答案
首先,如果您想提取计数特征并应用 TF-IDF 归一化和逐行欧几里得归一化,您可以使用 TfidfVectorizer
在一个操作中完成:
>>> from sklearn.feature_extraction.text import TfidfVectorizer
>>> from sklearn.datasets import fetch_20newsgroups
>>> twenty = fetch_20newsgroups()
>>> tfidf = TfidfVectorizer().fit_transform(twenty.data)
>>> tfidf
<11314x130088 sparse matrix of type '<type 'numpy.float64'>'
with 1787553 stored elements in Compressed Sparse Row format>
现在要找到一个文档(例如数据集中的第一个)和所有其他文档的余弦距离,您只需要计算第一个向量与所有其他向量的点积,因为 tfidf 向量已经是行-标准化。
正如 Chris Clark 在评论和 here 中所解释的那样余弦相似度不考虑向量的大小。行归一化的大小为 1,因此线性核足以计算相似度值。
scipy 稀疏矩阵 API 有点奇怪(不如密集的 N 维 numpy 数组灵活)。要获得第一个向量,您需要按行对矩阵进行切片以获得具有单行的子矩阵:
>>> tfidf[0:1]
<1x130088 sparse matrix of type '<type 'numpy.float64'>'
with 89 stored elements in Compressed Sparse Row format>
scikit-learn 已经提供了成对指标(机器学习术语中的内核),适用于向量集合的密集和稀疏表示。在这种情况下,我们需要一个点积,也称为线性核:
>>> from sklearn.metrics.pairwise import linear_kernel
>>> cosine_similarities = linear_kernel(tfidf[0:1], tfidf).flatten()
>>> cosine_similarities
array([ 1. , 0.04405952, 0.11016969, ..., 0.04433602,
0.04457106, 0.03293218])
因此要找到前 5 个相关文档,我们可以使用 argsort
和一些负数组切片(大多数相关文档具有最高的余弦相似度值,因此位于排序索引数组的末尾):
>>> related_docs_indices = cosine_similarities.argsort()[:-5:-1]
>>> related_docs_indices
array([ 0, 958, 10576, 3277])
>>> cosine_similarities[related_docs_indices]
array([ 1. , 0.54967926, 0.32902194, 0.2825788 ])
第一个结果是完整性检查:我们发现查询文档是最相似的文档,余弦相似度得分为 1,其文本如下:
>>> print twenty.data[0]
From: lerxst@wam.umd.edu (where's my thing)
Subject: WHAT car is this!?
Nntp-Posting-Host: rac3.wam.umd.edu
Organization: University of Maryland, College Park
Lines: 15
I was wondering if anyone out there could enlighten me on this car I saw
the other day. It was a 2-door sports car, looked to be from the late 60s/
early 70s. It was called a Bricklin. The doors were really small. In addition,
the front bumper was separate from the rest of the body. This is
all I know. If anyone can tellme a model name, engine specs, years
of production, where this car is made, history, or whatever info you
have on this funky looking car, please e-mail.
Thanks,
- IL
---- brought to you by your neighborhood Lerxst ----
第二个最相似的文档是引用原始消息的回复,因此有许多常用词:
>>> print twenty.data[958]
From: rseymour@reed.edu (Robert Seymour)
Subject: Re: WHAT car is this!?
Article-I.D.: reed.1993Apr21.032905.29286
Reply-To: rseymour@reed.edu
Organization: Reed College, Portland, OR
Lines: 26
In article <1993Apr20.174246.14375@wam.umd.edu> lerxst@wam.umd.edu (where's my
thing) writes:
>
> I was wondering if anyone out there could enlighten me on this car I saw
> the other day. It was a 2-door sports car, looked to be from the late 60s/
> early 70s. It was called a Bricklin. The doors were really small. In
addition,
> the front bumper was separate from the rest of the body. This is
> all I know. If anyone can tellme a model name, engine specs, years
> of production, where this car is made, history, or whatever info you
> have on this funky looking car, please e-mail.
Bricklins were manufactured in the 70s with engines from Ford. They are rather
odd looking with the encased front bumper. There aren't a lot of them around,
but Hemmings (Motor News) ususally has ten or so listed. Basically, they are a
performance Ford with new styling slapped on top.
> ---- brought to you by your neighborhood Lerxst ----
Rush fan?
--
Robert Seymour rseymour@reed.edu
Physics and Philosophy, Reed College (NeXTmail accepted)
Artificial Life Project Reed College
Reed Solar Energy Project (SolTrain) Portland, OR
关于Python:tf-idf-cosine:查找文档相似度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12118720/
我正在尝试用 Swift 编写一个算法来计算三角形的角度。引用检查 https://www.mathsisfun.com/algebra/trig-solving-sss-triangles.html
我正在使用word2vec来表示一个小词组(3至4个单词)作为唯一矢量,方法是将每个单词嵌入相加或计算单词嵌入的平均值。 通过实验,我总是得到相同的余弦相似度。我怀疑这与在训练后将word2vec生成
我实现了一种称为离散余弦变换的图像/视频变换技术。该技术用于 MPEG 视频编码。我的算法基于以下 URL 中提出的想法: http://vsr.informatik.tu-chemnitz.de/~
好的,首先,这不适用于类、测试或其他学生类型的事件。 我是游戏的脚本编写者,正在尝试实现供所有人使用的数学库,不幸的是,我所能使用的只是非常基本的 lua。实现的版本不能更改,并且不包含任何库。对于那
我是数字人文学科的博士生。我对编程语言还很陌生。 自上个月以来,我遇到了一个困扰我的问题。我正在尝试在 Tensorboard 的嵌入投影仪上可视化 doc2vec 模型(python,gensim
我正在学习 Part 1 上提供的教程& Part 2 .不幸的是,作者没有时间在最后一节中使用余弦相似度来实际找到两个文档之间的距离。在 stackoverflow 的以下链接的帮助下,我按照文章中
我正在用Python语言识别两个正弦信号之间的时移。这方面的一些研究表明,两个输入信号之间的相关性可以解决这个问题。但是,在处理关联时,我不理解np.correlate和scipy.signal.co
我正在用Python语言识别两个正弦信号之间的时移。这方面的一些研究表明,两个输入信号之间的相关性可以解决这个问题。但是,在处理关联时,我不理解np.correlate和scipy.signal.co
我有分类文本语料库。从这些我创建向量。每个向量对应一个文档。向量分量是本文档中计算为 TFIDF 值的单词权重。接下来,我构建一个模型,其中每个类都由单个向量表示。模型具有与语料库中的类一样多的向量。
我是新来的,我的问题是数学性质的,而不是编程性质的,我想就我的方法是否有意义获得第二意见。 我试图使用函数 findAssocs 在我的语料库中找到单词之间的关联。 ,来自 tm包裹。尽管它在通过软件
我正在尝试在一个简单的用例上比较 2 个不同的 DBSCAN 集群。 1/在一种情况下,我使用 DBSCAN 的余弦度量 2/在另一种情况下,我使用余弦相似度预先计算的距离矩阵 我的问题是这两种方法没
我在 L2 归一化特征矩阵上使用 Matlab 的常规 kmeans 算法和“Distance”、“cosine”、“EmptyAction”、“drop”,但遇到了问题。 Matlab 生成的输出只
代码可以编译,但输出错误。例如,当我输入值 45 时,我得到的输出为 1.0。我使用enthought canopy IDE,我哪里出了问题? import math x = int(raw_inpu
这个问题在这里已经有了答案: Why are some functions in not in the std namespace? (3 个答案) 关闭 8 年前。 我有一个相当大的应用程序,我
找到这个代码示例 void *handle; double (*cosine)(double); handle = dlopen("libm.so", RTLD_LAZY); *(void **) (
我正在计算两个 dfm 的余弦相似度对象。一个是我的引用对象,其尺寸为 5 x 4,728,而第二个 dfm是我的目标对象,尺寸为 2,325,329 x 40,595。 我不明白的是为什么texts
我想知道 Spark Cosine Similarity 是否可以处理稀疏输入数据?我见过一些例子,其中输入由以下形式的空格分隔的特征行组成: id feat1 feat2 feat3 ... 但我有
我正在做一个关于电影数据集余弦相似度的项目,我对计算余弦相似度的公式感到困惑。 但是我上网查了一下,有些文章显示分母是这样的: sqrt(A1^2+B1^2) * sqrt(A2^2+B2^2) *
从函数定义来看: https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.distance.cosine.html sci
假设我在 python pandas.DataFrame 中有两列: col1 col2 item_1 158 173 item_2 25 191 item_3
我是一名优秀的程序员,十分优秀!