机器学习笔记-相似度

杰卡德系数

首先是最简单最粗暴的算法。为了对比两个东西的相似度,我们很容易就想到可以看他们有多少相似的内容,又有多少不同的内容,再进一步可以想到集合的交并集概年,因此引入了杰卡德系数这一概念。假设有两个集合A,B,如果我们想要知道这两个集合的相似度有多少,我们可以进行如下的计算:
(J(A,B)=frac{|A ∩ B|}{|A ∪ B|})
这个结果成为杰卡德距离,越大标明两个集合的相似度越小。

TF-IDF+余弦相似性

词频(TF):每个词在文本中出现的次数,出现的越频繁,那么就有可能是这个文章的关键词,但是实际上有一些无用的词如“是”、“的”、“在”这样的单词出现的频率也很高,我们需要过滤掉,这些词,我们称之为“停用词”;
逆文档频率(IDF):IDF是每一个词重要性的权重,一个词越少见,它的权重就越大(因为更有可能符合主题),反之,一个词越常见,它的IDF就越小。
于是,我们可以使用TF*IDF这个乘积来描述某个词对文章的“重要性”。
计算TF:
词频TF=某个词在文章中出现的次数/文章的总词数
词频TF=某个词在文章中出现的次数/文章中最多的词出现的次数
计算IDF:
首选需要有一个语料库,来模拟语言的使用环境
IDF=log(语料库的文档总数/包含该词的文档数+1)

余弦相似度

现在我们有了两个文本,也分别使用IF-IDF提取出了他们的关键词,那么如何判定他们是否相似呢?
首先,第一步是将关键词抽成向量,举个例子:
句子1:
我/喜欢/看/电视,不/喜欢/看/电影
句子2:
我/不/喜欢/看/电视,也/不/喜欢/看/电影
提取关键词后,我们可以计算每个句子中,每个词的词频:
句子1:
我 1,喜欢 2,看 2,电视 1,电影 1,不 1,也 0
对应的向量就是[1,2,2,1,1,1,0]
句子2:
我 1,喜欢 2,看 2,电视 1,电影 1,不 2,也 1
对应的向量就是[1,2,2,1,1,2,1]
有了向量,就可以使用数学知识来解决问题,我们可以把向量想象成多维空间里的两条直线,那么两个向量的相似度可以量化成为这两条直线的“夹角”,夹角越小,说明它们越接近,也就是越相似。
多维空间向量的余弦公式如下:
(cos heta=frac{(x_1 imes x_2+y_1 imes y_2)}{sqrt{x_1^2+y_1^2} imessqrt{x_2^2+y_2^2}})
用图来直观的理解就是:

因此,我们根据余弦公式算出角度大小,就能近似的判断两个文本的相似程度。基于相似度的算法,其实就是根据已有的用户行为去推断一个一个新的用户可能做出的下一个行为,比如网易云的电台推荐。

词袋模型和LSI模型

当然,将一个文本向量化的方式有很多,TF-IDF只是其中的一种。
下面再给出两种比较常见的向量化手段:
1.词袋模型
在NLP中比较常用的手段(如word2vc)。核心想法是把一篇文章想象成词组合,没有顺序和语义之分,文章就是一个装满了词的袋子。
根据语料集,把所有的词都提取出来,边上序号,假设我们的语料集里有100个词,那么每个文章就是一个100纬的向量,每个位置上的数字表示对应编号的词在该文章中出现的次数。
2.LSI模型
TF-IDF模型基本已经能够胜任绝大多数的文本分析任务了,但是存在一个问题:实际的文本,用TF-IDF的纬度太高,不易于计算,因此引入了LSI的概念,从语义和文本的潜在主题来分析。LSI是概率主题模型中的一种,基于统计学和概率论方法实现,类似的模型有LDA等,具体的理论学术性太强,需要专门的数学证明来说明,这里只展开一下核心思想:
每篇文本中有多个概率分布不同的主题,每个主题中都包含所有已知词,但是这些词在不同主题中的概率分布不同,LSI通过奇异值分解的方法,计算文本中的各个主题的概率分布,这样做的好处是我们的向量从词的纬度下降到文本主题的纬度,纬度更少,计算更快。

原文地址:https://www.cnblogs.com/krockey/p/14383904.html