上次我使用TF-IDF算法网站标题进行优化编写。
为了找到类似的文章您需要使用“余弦相似度”。下面我将举例说明什么是“余弦相似度”。
为简单起见让我们从句子开始。
句子B:我不喜欢看电视或看电影。
如何计算上述两句之间的相似度?
基本思想是如果两个句子的单词更相似它们的内容应该更相似。因此您可以从单词频率开始并计算它们的相似性。
第一步是分词。
句子A:我/喜欢/看/电影不喜欢/看/电视。
句子B:我/不喜欢/看/电影还是/不喜欢/看/电视。
第二步是列出所有单词。
我喜欢看电视电影不。
第三步是计算单词频率。
句子A:我1像2看2电视1电影1没有1也是0.
句子B:我1像2看2电视1电影1没有2也是1.
第四步是写出频率向量一词。
句子A:[1,2,2,1,1,1,0]
句子B:[1,2,2,1,1,2,1]
此时问题变成了如何计算两个向量之间的相似性。
我们可以将它们视为空间中的两个线段从原点([0,0]开始)并指向不同的方向。在两个线段之间形成角度。如果角度为0度则表示方向相同且线段重叠。如果角度为90度则表示角度正确方向完全不同。如果角度是180度则意味着方向正好相反。因此我们可以通过角度的大小来判断矢量的相似性。角度越小它就越相似。
以二维空间为例上图中的a和b是两个向量我们想要计算它们的角度θ;余弦定理告诉我们它可以通过以下公式得到:
假设a向量为[x1y1]且b向量为[x2y2]则余弦定理可以重写为以下形式:
数学家已经证明对于n维向量这种余弦的计算也是如此。假设A和B是两个n维向量A是[A1A2An]B是[B1B2Bn]那么A和B之间的角度的余弦峰;等于:
使用这个公式我们可以得到句子A和句子B之间角度的余弦。
余弦值越接近1角度越接近0度也就是说两个矢量越相似这称为“余弦相似度”。因此上述句子A和句子B非常相似实际上它们的角度约为20.3度。
由此我们得到了一个“寻找类似文章”的算法:
(1)使用TF-IDF算法查找两篇文章的关键词;
(2)每篇文章取出一些关键词(如20)将它们合并成一个集合并计算每一篇文章中单词的频率(为了避免文章长度的不同) 可以使用相对字频率); Br />
(3)生成两篇文章中每一篇的词频矢量;
(4)计算两个向量的余弦相似度。值越大越相似。