机器学习:向量空间模型的余弦相似性(下)

*我写tf-idf教程已经很久了(第一部分第二部分)正如我所说,以下是本教程的继续部分。不幸的是,我没有时间为更新版本的Scikit学习(sklearn)也不能回答所有问题,但我希望在不久的将来能做到这一点。

所以,在之前的教程中,我们学习了如何在向量空间中建模文档,tf-idf转换如何工作以及tf-idf如何计算,现在我们要学习的是如何使用众所周知的相似性度量(余弦相似性)来计算不同文档之间的相似性。

点积

让我们从两个向量的点积定义开始:\VEC{a}=(a1),AA2AA3\LDOTS)\VEC{B}=(BY1),BY2BY3\LDOTS),哪里阿昂BYN是矢量的组成部分(文档的特征,或者在我们的示例中,文档中每个字的tf-idf值)和MathIT {N}是向量的维数:

\vec a \cdot\vec b=\sum i=1 ^n a i b_i=a 1b_1+a 2b_2+\cdots+a n b_n

正如你所看到的,点积的定义是将两个向量相加后的每个分量简单地相乘。两个向量各有两个维度(2d),见点积示例:

\VEC{a}=(0)3)vec b=(4,0)\\\vec a \cdot\vec b=0*4+3*0=0

你可能注意到的第一件事是两个向量之间的点积不是另一个向量而是一个值,标量

这一切都很简单,很容易理bepaly亚洲解,但是什么是点产品?它背后的直觉是什么?点积为零意味着什么?为了理解它,我们需要了解点积的几何定义是什么:

\vec a \cdot\vec b=\vec a \124; \vec b \cos \theta

重新排列方程,以便更好地利用交换性质来理解它,我们有:

\vec a \cdot\vec b=\ \vec b \vec a \cos \theta

所以,这个术语是什么显示样式\ \vec a \cos \theta?这个术语是向量的投影\VEC{a}进入向量\VEC{B}如下图所示:

向量A到向量B的投影。由维基百科。

现在,当矢量\VEC{a}与向量正交(角度为90度)\VEC{B}如下图所示?

两个正交向量(90度角)。

三角形上没有相邻边,等于零,术语显示样式\ \vec a \cos \theta将为零,并与向量的大小相乘\VEC{B}也将为零。现在你知道了,当两个不同矢量之间的点积为零时,它们是互相正交的(它们有90度角)。这是一种检查不同向量bepaly亚洲正交性的非常好的方法。还需要注意的是,我们使用的是二维示例,但最令人惊奇的是,我们也可以计算出高维空间中向量之间的角度和相似性,这就是为什么数学让我们看到的远比显而易见的,即使我们不能想象或想象,例如,有十二个维度的两个向量之间的角度是什么。

余弦相似性

两个向量(或向量空间上的两个文档)之间的余弦相似性是计算它们之间角度的余弦的度量。这个度量是方向的度量,而不是大小的度量,它可以被看作是规范化空间上文档之间的比较,因为我们不只考虑每个文档的每个字数(tf idf)的大小,但文件之间的角度。要建立余弦相似方程,我们需要做的是求解COS{\theta }

\displaystyle \vec a \cdot \vec b 125;=\124; \ \vec 123\ 125\124\124; \ \ \vec 125\\ \ \ \ \cos \ \ \theta  125  \ \ \ \frc \ \ \ \vec 123 123 \\\123; \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ vec 123\\123;A \ Vec B

就是这样,这是余弦相似公式。余弦相似性将生成一个度量,通过观察角度而不是幅度来说明两个文档之间的关系。如以下示例所示:

不同文档的余弦相似性值,1(相同方向)0(90度),-1(相反方向)。

注意,即使我们有一个向量指向远离另一个向量的点,它们仍然可以有一个小角度,这是使用余弦相似性的中心点,度量往往忽略了文档中较高的术语计数。假设我们有一个文档,其中“sky”出现200次,另一个文档中“sky”出现50次,它们之间的欧几里得距离会更大,但角度仍然很小,因为它们指向同一个方向,当我们比较文件时,这才是最重要的。

现在我们有了一个文档的向量空间模型(如下图所示),它被建模为向量(带有tf-idf计数),并且有了一个公式来计算这个空间中不同文档之间的相似性,让我们看看我们在实践中是如何使用Scikit学习(sklearn).

矢量空间模型

使用SciKit学习进行练习(SkLearn)

*在本教程中,我将使用python 2.7.5和scikit学习0.14.1。

我们需要做的第一件事是定义示例文档集:

文件=(天空是蓝色的,太阳是明亮的,天空中的太阳是明亮的,我们可以看到灿烂的太阳,明亮的太阳)

然后我们实例化sklearn tf-idf矢量器并将文档转换为tf-idf矩阵:

从sklearn.feature_extraction.text导入tfidf vectorizer tfidf_vectorizer=tfidf vectorizer()tfidf_matrix=tfidf_vectorizer.fit_transform(documents)打印tfidf_matrix.shape(4,11)

现在我们有了tf-idf矩阵(TFIDFX矩阵)对于每个包含11个tf idf项(矩阵中的列数)的文档(矩阵中的行数),我们可以计算第一个文档(“天空是蓝色的”)与集合中其他每个文档之间的余弦相似性:

从sklearn.metrics.pairwise import cosine_similarity cosine_相似度(tfidf_matrix[0:1],tfidf_矩阵)数组([[1.,0.36651513,0.52305744,0.13448867)])

这个tfidf_矩阵[0:1]是通过scipy操作得到稀疏矩阵的第一行,得到的数组是第一个文档与集合中所有文档之间的余弦相似性。请注意,数组的第一个值是1.0,因为它是第一个文档与其自身之间的余弦相似性。另请注意,由于第三份文件(“天空中的太阳是明亮的”)中存在类似的词语,它取得了更好的成绩。

如果你愿意,还可以解决向量之间角度的余弦相似性:

\cos \theta=\frac \vec \a \cdot \vec b \vec \vec \a \vec b \

我们只需要分离角度(θ然后移动COS方程式右边:

\theta=\arccos \frac \vec a \cdot\vec b \vec a \vec b

这个阿尔科斯与余弦(COS^—1

例如,检查第一个和第三个文档之间的角度:
导入数学这已经在上一步计算过了,因此,我们只使用值cos_sim=0.52305744角度_radians=math.acos(cos_sim)打印math.degrees(角度_radians)58.462437174332784

这个角度~58.5是文档集第一个和第三个文档之间的角度。

就是这样,希望你喜欢第三个教程!

相关材料

关于汗学院网络产品的视频

维基百科:dot产品

维基百科:余弦相似性

Scikit学习(sklearn)-事实上的python的机器学习包

克里斯蒂安S佩隆

80评论

  1. 很棒的教程,谢谢!一句话一个问题
    评论,如果它可以帮助其他人:可以将自定义标记器传递给tfidfvector,正如在http://blog.mafr.de/2012/04/15/scikit-learn-feature-extractio/i有一个关键字列表(例如,“蓝色汽车”)我不想分为“蓝色”和“汽车”,我花了一点时间才弄明白。
    问题:有没有办法得到按权重排序的功能列表?

  2. 我喜欢你的教程和测量文档之间相似性的方法。您是否也尝试使用相同的方法来查找链接数据云中数据集之间的相似性?例如。在http://dbpedia.org/http://www.geonames.org/.假设您在dbpedia中与zuerich有一个位置(城市),并且希望在地名中找到相同的(类似的)实体。

  3. print tfidf_matrix.shape返回的矩阵为(21488,12602)导致内存错误的大小。如何处理像我的数据不断增长那样大的矩阵。任何解决办法都会有很大帮助

    1. 矢量器采用了一个称为“最大特征”的术语。限制为一个值,比如5000或更低,尽管这会降低矢量唯一表示文档的能力。或者在您的机器上添加一些RAM:-)。

  4. 你好,我在寻找有关余弦相似性的简单解释时找到了你的文章,但当我发现它的“tf idf”时,我也读了前两篇文章。事实上,当我意识到你用简单的术语准确地描述了这两个概念后,我无法表达我的感受。你已经解释了每一个真正有用的数学符号。bepaly亚洲

    最后,我要感谢你的精彩教程。请以简单的方式发布其他机器学习算法。那会很有帮助的。

      1. 嗨,克里斯蒂安,

        这是一个很好的教程,我尝试复制您在教程中描述的内容。然而,我不断地得到一个不允许我计算余弦分数的连续误差…它有点像,

        来自sklearn.metrics.pairwise import cosine_相似性
        导入错误:无法导入名称余弦相似性

        tfidfvectorizer的错误相同。我觉得sklearn.metrics可能有问题?你能提供什么帮助吗?

          1. 谢谢你的解释。我在google上搜索如何消除文件之间的零点积结果时无意中看到了你的教程,但我不理解你的tfidf_矩阵[0:1]
            功能在哪里?
            谢谢你

  5. 非常感谢您的指导。
    拜托,此错误出现在终端上
    引发ValueError(“空词汇表;也许只有文件”
    值错误:词汇表为空;也许文档只包含停止词

    为什么?解决方案是什么?

  6. 我喜欢你的帖子,它非常清晰,以细节为导向,感谢您的辛勤工作和分享!

  7. 优秀的教程!bepaly亚洲非常清晰简洁,比我读过的任何关于这个话题的文章都更精彩。等你写更多关于这个话题的文章后再写!

  8. 感谢您提供其他信息丰富的网站。我还能从哪里得到用这种理想方法编写的那种信息呢?我有一个
    挑战我现在简单的操作,我一直在盯着你看,想知道一些新的信息。

  9. 一套很好的教程。感谢您抽出时间来发布。
    我真的很想知道如何在两个不同的数据集之间找到余弦。例如,您如何发现测试集中的文档与培训集中的文档的相似性?如果有人能给我指明正确的方向,我会非常感激的。

  10. 我已经阅读了所有的三个教程第一部分,二、现在III.它们真的很好,很容易理解。bepaly亚洲
    感谢您提供这些精彩的教程。我希望看到更多关于机器学习的类似教程,其中包括python和scikit-learn。

  11. a cos(th)不是向量a在向量b上的投影。它只是x轴上投影的大小。向量A到向量B的实际项目是a cos(th)*b,其中b是b方向上的单位向量。

  12. 你好,

    我也喜欢你的教程,但我想知道如何适应我自己的生字。我创建了一个分类器,基于一些语言学理论,我不得不修改英语的停止语。在评估我的分类器之前,我想进行一个余弦相似性测试,但不知道如何在我的停止词中偷偷地。.

    当做,

    古兹德

  13. Muito bom。Muito obrigado。
    简单的目标。科塞诺,一辆出租车。
    阿布拉,
    克里斯蒂亚诺。

  14. 嗨,克里斯蒂安,
    我发现你对余弦相似性的解释非常有帮助,尤其是对于一个非数学专家。bepaly亚洲我在上周在NPPSH(新视角:人文学科研究生研讨会)上的一次演讲中摘录了一段话(完全归因)。

    我想用你的图片来解释基于我的演讲的期刊论文中的余弦相似性,我想知道这是否可以?它会,当然,在图片下,在参考书目中有完整的细节。

    谢谢您。

  15. 我对这个句子有点困惑,“还请注意,由于第三份文件中出现了类似的词语(“天空中的太阳是明亮的”),它取得了更好的成绩。”

    语句:cosine_相似性(tfidf_矩阵[0:1],TFIDFX矩阵
    产生:数组([[1.,0.36651513,0.52305744,0.13448867)])

    我觉得你的句子可以解释为“太阳在天空中是明亮的”有“相似的存在”的第一个文件“天空是蓝色的”。但在我看到的比较中,“天空中的太阳是明亮的”与第二个文档(“太阳是明亮的”)比第一个文档(“天空是蓝色的”)更相似。

    我错过什么了吗?

    科林·古德伯格

    1. 嗨,柯林,

      我认为你提出了一个很好的问题,这也意味着您对代码输出非常小心。bepaly亚洲

      的确,你的话写得很好,但仍然可以遵从Cristian教程,因为上面写的是第一句话和其他句子的比较,你也可以对第二句话做同样的事情,得到它与另一句话的相似性,得到你想要的答案,如此实际,您可以使用此代码:

      来自sklearn.metrics.pairwise import cosine_相似性
      第二句话矢量=tfidf_矩阵[1:2]
      余弦相似性(第二句话矢量,TFIDFX矩阵

      打印输出,在第三坐标系中有一个分数更高的向量,这就解释了你的想法。

      希望我为你做的简单,

      问候语,
      阿迪尔

  16. 嘿,喜欢这个解释——非常清楚和有洞察力,尤其是向量空间图。这是我的问题,如果我有一个预先标记的文档列表(已经删除的停止字,使用NLTK等进行茎干,例如docs=[“sky”,“blue”],[“sun”,“bright”,“sky”],如何将此输入tfidfvector?函数似乎只能接受原始文档字符串,但是我已经处理了我的文档,除了将整个文档集转换为tfidf矩阵之外,我不需要tfidfvector来处理更多的文档。我不断得到错误,例如“typeerror:预期的字符串或像object这样的字节”。我想我需要在tfidfVectorizer中定义一些参数,比如设置小写=false……但是到目前为止还没有任何工作。非常感谢你的帮助,谢谢克里斯蒂安!

    1. 因为我不能删除我最初的评论(我仍然想称赞克里斯蒂安的出色工作)。我把这个答复留在这里。

      请忽略我原来的问题,我通过将列表转换成元组xd来解决这个问题。

      顺便说一句,我正在使用一个叫做df的熊猫数据帧,其中每行的第7列是标记列表。

      参考代码:

      TUP=()
      对于行,df.iterrows()中的索引:
      “温度=”
      对于df.iloc中的单词[第7行]:
      temp=temp+word+“”
      tup=tup+(温度,)

  17. 嗨,克里斯蒂安,谢谢你的指导。我有一个问题:

    我有一组文档,每个文档都分配了ID号。ID是键,文本是字典格式的值。一旦我用余弦相似度函数得到一组相似度分数,我怎么知道哪一个分数属于哪两个文件?您是否可以将文档名/ID及其余弦相似性得分放在一起?

  18. 有很多人知道一些事情。但只有少数人能解释他们所知道的,那么好…尊敬的Christian…我刚从谷歌搜索中偶然发现了这个,这太棒了…

  19. 谢谢你的帖子!这正是我想要的。这是奇怪的无关,但是你在夏尼亚拍了个人照吗?克里特岛?我问这个问题的原因是因为几年前我在那里拍了一张几乎完全一样的照片,我发誓那是香奈娅灯塔。也许我们可以用余弦相似度来观察像素和lmao有多相似。

    1. 哈哈嘿,Trent,我很高兴你喜欢这个职位!侧面照片正好在香奈娅身上,克里特岛和合真是巧合!顺便说一下,这地方真是太棒了,很喜欢那里,历史悠久。

  20. 谢谢你的表达。我们都可能在高中的高级数学中学习过这些概念,并且对这些概念感到兴奋——但是,嘿,在20多年的专业工作中,我们对这些概念的理解是多么的失败。阅读它是非常令人耳目一新的——看看基本的ML作为一门学科在学校里有多重要。

  21. 你好,先生,感谢这个精彩的教程(全部3部分)。我得到了大量关于向量的信息,相似性和更多的概念。你解释得很好,我在谷歌的任何教程中都找不到。我很感激我能登上这一页。我对机器学习很陌生。继续分享你的知识,让更多像我这样的人变得活跃起来。

  22. 亲爱的基督徒,

    你的三部分教程是一个容易理解的教训和灵感。感谢您的努力和时间来制作它们。

  23. 真的!伟大的学习。尤其是对于像我这样的初学者……谢谢你发这篇文章。

  24. 迄今为止,关于tf idf及其在python中的实现的最佳博客系列。我浏览了很多博客文章和文档,只是一次又一次地找到相同的内容。谢谢克里斯坦!干杯!

  25. 谢谢你的精彩文章。它对文本数据分析非常有帮助。
    我正在使用服务类型进行票据映射。
    我们有一个Excel表,其中列出了所有不同类型的服务和服务说明。
    我们每月收到数千张带有门票说明的门票。手动无法识别每个票据属于哪个服务。
    我尝试了向量方法,但得到的错误是BCO,两个数据库的形状都不一样。
    值错误:x和y矩阵的维度不兼容:x.shape[1]=52511,y.shape[1]=592

  26. 这篇文章绝对值得“谢谢”。感谢您的详细解释。也渴望深入其他文章!!

  27. 可以,因此可以利用余弦相似性来了解文献的相似性。但是我们怎么知道哪些术语对相似性贡献最大呢?

  28. Obrigada穆伊托干了蒂科!Al_m da dist_ncia do cosseno,voc_recomendaria qual outra m_trica para medir a similaridade enter documentos?

    谢谢您,神奇的解释!您建议哪些其他度量标准来度量文档之间的相似性?

    1. 奥拉,Obrigado Pelo反馈!existom v_rias dist_ncias que voc_pode usar,MAS没有职能指令手册都铎依赖做问题。一个叫Mais usada depois da dist_ncia do cosseno_a dist_ncia euclidiana的地方,MAS Vai Praticamente a Mesma Coisa que a dist_ncia de cosseno se voc_normaliar OS否决权。

  29. 我已经研究了几篇关于这个确切问题的文章,因为我的医生太急了,我跟不上他。没有一篇文章能像你那样解释tfidf和cosine的相似性。你甚至设法让我觉得这个话题很简单。非常感谢你,你帮了我bepaly亚洲很大的忙!

  30. 你好,首先感谢你的精彩指导。
    我们可以把它用于服装推荐系统吗?比如说,如果用户选择了一款标题为“Metronaut男式纯色休闲深蓝色衬衫”的产品,而我们对其他所有产品都有这种标题,那么,bepaly亚洲我想做的是向上面推荐类似的产品。
    或者有其他方法吗?

  31. 爱因斯坦曾经说过,如果你不能简化这个问题,你不明白这件事。你,先生。佩罗尼一定要理解这件事。

    非常感谢。

  32. 嘿,伙计,谢谢你写这个模块对我的测试和我的项目也有很大帮助。干得好,再次感谢。

留下评论

您的电子邮件地址将不会发布。

此网站使用Akismet来减少垃圾邮件。了解如何处理评论数据.