机器学习:向量空间模型的余弦相似性(第三部分)

*我写TF-IDF教程已经很久了(第一部分第二部分)正如我承诺的,这里是教程的继续。不幸的是,我没有时间修复以前的教程,为新版本的scikit学习(sklearn)包也不能回答所有的问题,但我希望在不久的将来这样做。

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

点积

让我们从定义两个向量的点积开始:\vec{a}=(a_1,a_2,a_3,多个)\vec{b}=(b_1、b_2、b_3、\ldots),其中阿云布恩是矢量的(TF-IDF值在我们的例子中的文件的每个字的文档的特征,或)部件和\数学{n}是向量的维数:

\ {VEC一个} \ CDOT \ VEC {B} = \ sum_ {I = 1} ^ N a_ib_i = a_1b_1 + a_2b_2 + \ cdots + a_nb_n

正如可以看到,点积的定义是从两种载体一起加入各组分的简单乘法。看到用于与2个维度的每个(2D)的两个向量的点积的例子:

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

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

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

\vec{a}\cdot\vec{b}=\|\vec{a}\|\vec{b}\|\cos{\theta}

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

\vec{a}\cdot\vec{b}=\|\vec{b}\|\vec{a}\|\cos{\theta}

那么,什么是术语\显示样式{\vec{a}\cos{\theta}?该术语是向量的投影\ VEC {A}到载体中\矢量{b}如下图上显示:

维基百科将向量A投影到向量B中。

现在,当向量\ VEC {A}是正交(以90度的角度)的矢量\矢量{b}比如下面的图片?

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

会有在三角形没有相邻侧,这将是等同于零的,术语\显示样式{\vec{a}\cos{\theta}将为零,结果与向量的大小相乘\矢量{b}也将是零。现在你知道了,当两个不同向量之间的点积为零时,它们是相互正交的(它们的角度为90度),这是检查不同向量正交性的一个非常简洁的方法。同样重要的是,我们使用的是二维的例子,但最令人惊奇的事实是,我们还可以计算出高维空间中向量之间的角度和相似性,这就是为什么数学让我们看到的远比显而易见的要多,即使我们无法想象或想象12维空间中两个向量之间的角度是什么亚洲金博宝例如。

余弦相似性

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

\displaystyle  \vec{a} \cdot \vec{b} = \|\vec{a}\|\|\vec{b}\|\cos{\theta} \\ \\  \cos{\theta} = \frac{\vec{a} \cdot \vec{b}}{\|\vec{a}\|\|\vec{b}\|}

就是这样,这是余弦相似公式。余弦相似性将生成一个度量,该度量通过查看角度而不是大小来表示两个文档的关联程度,如下例所示:

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

注意,即使我们有一个向量指向一个远离另一个向量的点,它们仍然可以有一个小角度,这是使用余弦相似度的中心点,测量结果往往忽略了文档上较高的项数。假设一个文档中“天空”这个词出现了200次,另一个文档中“天空”这个词出现了50次,它们之间的欧几里德距离会更大,但是角度仍然很小,因为它们指向同一个方向,这就是我们比较文档时要考虑的问题。

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

向量空间模型

练习使用Scikit学习(sklearn)

*在本教程中我使用了Python 2.7.5和Scikit学习0.14.1。

我们首先需要定义一组示例文档:

文件=(“天空是蓝色的”,“阳光灿烂”,“天空阳光灿烂”,“我们可以看到闪亮的阳光,灿烂的阳光”)

然后我们实例化Sklearn TF-IDF矢量器和我们的文件转换为TF-IDF矩阵:

从进口sklearn.feature_extraction.text TfidfVectorizer tfidf_vectorizer = TfidfVectorizer()tfidf_matrix = tfidf_vectorizer.fit_transform(文档)打印tfidf_matrix.shape(4,11)

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

从进口sklearn.metrics.pairwise cosine_similarity cosine_similarity(tfidf_matrix [0:1],tfidf_matrix)阵列([[1,0.36651513,0.52305744,0.13448867]])

这个tfidf_矩阵[0:1]是获取稀疏矩阵第一行的Scipy操作,结果数组是第一个文档与集合中所有文档之间的余弦相似性。注意,数组的第一个值是1.0,因为它是第一个文档与其自身之间的余弦相似性。还要注意的是,由于第三份文件上出现了类似的文字(“天空中的太阳是明亮的”),因此获得了较好的分数。

如果需要,还可以求解向量之间角度的余弦相似度:

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

我们只需要隔离的角度(\西塔)然后移动\cos公司等式的右边:

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

这个\阿克科斯与余弦的倒数相同(\因为^-1)。

例如,让我们检查第一个和第三个文档之间的角度:
进口数学#这是已经计算上一步,所以我们只使用值cos_sim = 0.52305744 angle_in_radians = math.acos(cos_sim)打印math.degrees(angle_in_radians)58.462437107432784

和〜58.5的那个角是第一,我们的文档集的第三个文档之间的角度。

这就是它,我希望你喜欢这个第三教程!
引用本文为:基督教S. Perone,“机器学习::余弦相似度的向量空间模型(第三部分),”中亚洲金博宝隐姓埋名地2013年9月12日,188betcom网页版.

相关材料

关于可汗学院Dot产品的视频

维基百科:点产品

维基百科:余弦相似性

Scikit学习(sklearn)–的事实上Python机器学习包

89对“机器学习:向量空间模型的余弦相似性(第三部分)”的思考

  1. 伟大的教程,谢谢!一个意见和一个问题
    注释,以防帮助其他人:可以将自定义标记赋予器传递给TfidfVectorizer,如中所述http://blog.mafr.de/2012/04/15/scikit-learn-feature-extractio/I有一个关键字列表(例如,“蓝色汽车”)我不想分为“蓝色”和“汽车”,我花了一点时间才弄明白。
    问:是否有一种方式来获得的重量排名功能列表?

  2. 我喜欢你的教程和衡量文档之间相似性的方法。您是否也尝试过应用相同的方法来查找链接数据云中的数据集之间的相似性?E、 g.在http://dbpedia.org/http://www.geonames.org/.假设你有苏黎世在DBpedia中的位置(市),喜欢里面找GEONAMES相同(相似)的实体。

  3. 打印tfidf_矩阵.shape返回一个(2148812602)大小的矩阵,这导致了内存错误。如何处理如此庞大的矩阵,使我的数据不断增长。任何解决办法都会有很大帮助

    1. 矢量器采用一个称为max_features的术语。将其限制为一个值,比如5000或更低,尽管这会降低向量唯一表示文档的能力。或者在你的机器上增加一些内存:-)。

  4. 嗨,我在寻找余弦相似性的简单解释时找到了你的文章,但当我发现它的“tf-idf”时,我也读了前两篇文章。事实上,我无法表达我的感觉,因为我意识到你是多么精确地用简单的数学术语描述了这两个概念。你已经解释了每一个非常有用的数学符号。亚洲金博宝

    最后,我必须感谢你的精彩教程。请张贴其他机器学习算法也在您的简单表达方式。那会很有帮助的。

      1. 嗨,克里斯蒂安,

        这是一个伟大的教程,我试图复制您在本教程中所描述的事情。不过,我不断收到一个错误一致不允许我计算余弦得分...它类似,

        从sklearn.metrics.pairwise进口cosine_similarity
        importorror:无法导入名称余弦相似性

        TfidfVectorizer的错误相同。我想可能有什么问题sklearn.metrics标准也许?你能在这方面提供什么帮助吗?

          1. 谢谢你的解释。我刚在你的教程中偶然发现,当我在谷歌上搜索如何消除零点产品的结果,以获得文档之间的距离,但我不明白你的tfidf_矩阵[0:1]
            此外哪里都是功能。
            谢谢你

  5. 十分感谢您的教程。
    请在终端出现此错误
    raise ValueError(“空词汇表;可能仅限文档”
    ValueError异常:空的词汇;也许这些文件只包含停用词

    为什么呢?解决办法是什么?

  6. 我喜欢你的帖子,很清晰,很注重细节,谢谢你的努力和分享!

  7. 优秀的教程!亚洲金博宝非常简洁明了,击败了地狱,别的我的主题阅读。不能等到你写更多关于这个话题!

  8. 感谢您的任何其他信息的网站。还有什么地方可能只是我得到这种类型的写在这样一种理想的方法的信息?我有一个
    挑战,我只是现在操作,我一直在你扫视的sudh信息。

  9. 大套教程。感谢您抽出宝贵的时间来和张贴。
    我真的有兴趣知道如何找到两个不同的数据集之间的余弦值。举例来说,你怎么会发现在测试组在训练集文档的文档的相似性?它会很感激,如果有人能在正确的方向指向我。

  10. 我已经阅读了所有的三个教程第一部分,第二部分,现在第三部分。他们真的很好,很容易理解。亚洲金博宝
    谢谢这些很棒的教程。我希望看到更多关于机器学习的类似教程,包括python和scikit学习。

  11. 我在使用TfidVectorizer.please告诉我可能是什么原因让一个内存

  12. | A | COS(TH)不是一个矢量上的投影矢量b。这只不过是在x轴上的投影的大小。向量a的到矢量b的实际项目是| A | COS(TH)* B,其中,B是在B的方向的单位矢量

  13. 惊人的解释!先进的simplicity.You救了我大量的时间!我不知道怎么感谢你才好!

  14. 你好,

    我也喜欢你的教程,但我想知道如何适合我自己的停止语。我创建了一个量词,基于一些语言学理论,为此我不得不修改英语停止词。在评估我的分类器之前,我想做一个余弦相似性测试,但不知道如何潜入我的关键词。

    当做,

    古兹德

  15. 木伊托·博姆。木伊托·奥布里加多。
    Simplesêobjetivo。Estava一个迪亚斯quebrando一个cabeça对FAZERØcálculo做cosseno。
    Abraço,
    克里斯蒂亚诺。

  16. 嗨,克里斯蒂安,
    我发现你的余弦相似的解释非常有帮助 - 尤其是对非数学专业。亚洲金博宝上周(全属性):我在介绍我在NPPSH(研究生研讨会为人文学科的新视角)给使用的摘录。

    我想用你的形象基础上我的介绍说明在杂志纸余弦相似度,并想知道这是否是好的?它将,当然,可以在图像下,在书目全部细节归属。

    谢谢您。

  17. 我对“还要注意的是,由于第三份文件上出现了类似的词语(“天空中的太阳很亮”),所以它获得了更好的分数”这句话有点困惑

    语句:cosine_similarity(tfidf_matrix [0:1],tfidf_matrix)
    产生:数组([[1。,0.36651513、0.52305744、0.13448867]])

    我觉得你的句子可以解释为“在天空中,阳光灿烂”有“的类似的话存在”到第一个文件“天空是蓝色的”。但是,在比较中,我看到,“在天空中,阳光灿烂”更类似于第二个文档(“阳光灿烂”),而不是第一个文件(“天空是蓝色的”)。

    我错过了什么?

    科林·戈德伯格

    1. 嗨科林,

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

      的确,你的评论做得很好,但仍然可以遵循Cristian教程,因为上面写的是第一句话与其他句子的比较,你可以对第二句话做同样的操作,得到它与其他句子的相似性,并得到你要找的答案,所以实际上,你可以使用以下代码:

      从sklearn.metrics.pairwise进口cosine_similarity
      second_sentence_vector = tfidf_matrix [1:2]
      cosine_similarity(second_sentence_vector,tfidf_matrix)

      然后打印输出,你会得到一个在第三坐标中得分更高的向量,这解释了你的想法。

      希望我能为你简单点,

      问候,
      阿迪尔

  18. 请解释一下你是怎么得到11个tfidf条款的?文档中有12个独特的术语

  19. 嘿,喜欢这个解释-非常清楚和有见地,特别是矢量空间图。我的问题是,如果我有一个预标记文档列表(停止词已经删除,使用nltk等词干),例如docs=[[“sky”,“blue”],[“sun”,“bright”,“sky”]],我如何将其输入TfidfVectorizer?该函数似乎只能接受原始文档字符串,但我已经处理了我的文档,除了将整个文档集转换为tfidf矩阵之外,我不需要TfidfVectorizer来处理任何其他文档。我总是得到错误,比如“TypeError:expected string或bytes like object”。我想我需要在TfidfVectorizer中定义一些参数,比如设置lowercase=False…但是到目前为止一切都没有起作用。非常感谢你的帮助,谢谢克里斯蒂安!

    1. 既然我不能删除我最初的评论(我仍然想赞扬克里斯蒂安的出色工作),我将在这里留下这个回复。

      请忽略我原来的问题,我解决它通过将我的名单列表插入一个元组XD

      顺便说一下,我正在使用一个名为df的pandas数据帧,其中每行的第7列是一个令牌列表。

      参考代码:

      元组=()
      用于行,指数df.iterrows():
      temp:“”
      一言以蔽之测向仪[第7行]:
      temp=temp+word+“”
      TUP = TUP +(温度,)

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

    我有一组文件,每个文件都分配了身份证号码。ID是键,文本是字典格式的值。一旦我使用余弦相似度函数得到一组相似度得分,我如何知道哪一个得分属于哪两个文档?有什么东西可以放在一起把文档名/id和它们的余弦相似性分数一起拉出来吗?

    1. 嗨,玛纳萨,你找到名字的解决方案了吗?我也面临同样的问题。谢谢!

  21. 有很多谁知道东西的人。但只有谁可以解释他们所知道的,这么好..基督教的荣誉......我刚刚从谷歌搜索偶然发现这一点,这是真棒几...

  22. 谢谢你的来信!这正是我想要的。这是奇怪的无关,但你有没有在克里特岛的查尼亚拍下你的个人资料照片?我问的原因是因为几年前我在那里照了一张几乎完全一样的照片,我发誓那是夏尼亚灯塔。也许我们可以用余弦相似性来观察像素的lmao有多相似。

    1. 哈哈嘿嘿特伦特,我很高兴你喜欢的文章!资料图片正是在哈尼亚,克里特岛嘿嘿,真巧!顺便说一下神奇的地方,真的很喜欢那里,充满了历史。

  23. 谢谢你解释清楚。我们可能都在高中学习过,对高等数学中的这些概念感到兴奋,但嘿,在20多年的专业工作中,我们对这些概念的理解是多么的缺乏。阅读这篇文章让人耳目一新,看看基本的语言学习作为一门学科在学校里有多重要。

  24. 你好,先生,谢谢这个精彩的教程(全部3部分)。我得到了大量关于向量、相似性和更多概念的信息。你解释得太好了,我在谷歌的任何教程中都找不到。我很庆幸我不知何故登上了这一页。我是机器学习的新手。继续分享你的知识,照亮更多像我这样的人。

  25. 亲爱的克里斯蒂安,

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

  26. Wow ! Great learning. Especially for a beginner like me.. Thanks for this post.

  27. 如何测试一个新的字符串,它是不是在数据集数据集中最呈三角句子。

  28. 到目前为止关于tf-idf及其Python实现的最佳博客系列。我浏览了那么多博客文章和文档,却一次又一次地发现了相同的内容。谢谢克里斯坦!干杯!

  29. 亚洲金博宝非常清晰和余弦相似清晰的文章。亚洲金博宝非常有帮助。

  30. 谢谢你的精彩文章。它是文本数据分析非常有帮助。
    我正在使用服务类型进行票证映射。
    我们有一个excel表,其中列出了所有不同类型的服务和服务描述。
    我们每月收到上千张带票种的票。手动无法识别每个票证属于哪个服务。
    我试过向量法,但得到的错误是bcos两个数据库的形状是不同的
    值错误:X和Y矩阵的维数不兼容:X.shape[1]==52511而Y.shape[1]==592

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

  32. 好了,余弦相似度可以用来了解文件的相似性。但怎样才能知道哪些方面贡献最大朝相似?

  33. Obrigada,MUITOdidático!阿莱姆达DISTANCIA做cosseno,VOCE recomendaria QUAL outramétrica对medir一个similaridade恩特雷里奥斯documentos?

    谢谢,精彩的讲解!您建议使用哪些其他度量标准来度量文档之间的相似性?

    1. 奥拉,obrigado PELO反馈!Existemváriasdistâncias阙之声颇得城市搜救,MAS没有FIM TUDO depende做problema。一个MAIS USADA depois达DISTANCIA做cossenoé一个DISTANCIA euclidiana,MAS VAI praticamente一个MESMA coisa阙一DISTANCIA德cosseno SE VOCE normalizar OS vetores。

  34. 感谢您对这些概念进行了非常详细和亚洲金博宝清晰的解释。你帮了我大忙。

  35. 感谢余弦相似度的简单和清晰的解释...很好的例子!

  36. 谢谢你,这是非常清楚和可以理解的。感谢所有的例子以及。

  37. 我已经研究了几篇关于这个问题的文章,因为我的讲解员赶得太快,我无法跟上他。没有一篇文章像你一样,对TFIDF和cosine的相似性解释得如此透彻。你甚至设法让我觉得现在整个话题都很简单。非常感谢你帮了我很大的忙!亚洲金博宝

  38. 你好,首先感谢伟大的教程。
    我们可以用这个为服装推荐系统?如果用户选择了标题为“Metronaut男士固休闲深蓝衬衫”一个产品,我们有这种类型的题目每隔product.So的一样,我希望做的是推荐的同类产品上面。亚洲金博宝
    或者有没有其他的方法?

  39. 爱因斯坦曾经说过,如果你不能够简化事情,你不明白这件事。你,Perone先生,你了解此事。

    非常感谢。

  40. 嗨,哥们感谢写这个块帮助很多关于我的测试,以及为我的项目太多。良好的工作的人,再次感谢。

  41. 请举例说明余弦相似性。
    我认为任意向量的点积V=(v1,v2……)
    定义为
    dp=sqrt(总和(v1^2,v2^2,…);
    这是正确的???

  42. 谢谢你的解释。
    而当我有1万多功能vecotr(512长),如何加速比找到最大的COS相似?

  43. 嗨,克里斯汀,这个概念解释得很好!你的话很容易理解。亚洲金博宝
    你的文章帮助我建立了一个文本匹配函数,它是有效的。再次感谢!!

留下回信

您的电子邮件地址不会被公开。

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