基于机器学习的文档相似度算法来构建个性化智能文章推荐系统
推荐系统
以文章推荐为例,目前我们正在阅读自己喜欢的文章,那么推荐系统如何帮助我们找到和我们喜欢文章类似的文章,从而连续不断的推荐给用户呢?
推荐系统需要解决的两个问题
我们要想达到这样类似的任务,我们需要解决两个问题:问题一:就是我们如何测量不同文章之间的相似度?问题二:就是我们如何在所有文章中推荐用户感兴趣的文章?
词袋模型
我们可以使用词袋模型来表示文章,词袋模型忽略了文章中词汇的顺序信息,我们可以理解为,我们使用了一个口袋把文章中所有词汇放入到这个口袋中,这样所有的词汇就都打乱了顺序,我们只需要对文章中的每一个词汇计数。
举例,我们现在有一个这样的文章:
一篇文章
我们现在使用词袋模型来表示上面这篇文章,词袋模型会用一个向量来表示这个文章的信息,这个向量定义在我们词汇表中(词汇表中不是什么词汇都有,只有我们认为有用的词汇),这个词汇表中有的位置是the,有的位置是sport,这些位置都是固定的。我们只需把我们的文档中的词汇放在固定的位置上,并且统计出每个词汇出现的次数就可以了。
词汇表
问题一:如何测量不同文章之间的相似度
当我们将文章使用词袋模型表示出来之后,我们如何应该度量不同文章之间的测量相似度呢?
两篇文章的词袋模型表示
如上所示,我们使用词袋模型表示出来了两篇文章,其中一篇文章是梅西的,另外一篇文章是贝利的,那么我们可以将词袋模型对应位置词汇的次数相乘然后相加就可以得到不同文章之间的测量相似度了,本例中这两篇文章的相似度为13。
再来看一个例子:
两篇文章的词袋模型表示
上面还是两篇文章的词袋模型的表示,其中一篇是梅西的文章,另外一篇关于战争的文章,我们还是将将词袋模型对应位置词汇的次数相乘然后相加,最终我们可以看出这两篇文章之间的测量相似度为0。
所以我们使用这样的机器学习算法来计算文章的相似度,当我们看梅西的文章的时候,自然推荐系统会为我们推荐贝利的那篇文章而不是战争的文章,这就是推荐系统的智能性。
我们可以看出这样的测量相似度的方式是可以将相似的文章给度量出来的,但是使用这样的单词计数的问题,还是有一些问题的,我们先来看一下问题是什么?
将文章复制成两倍
如上图所示:绿色文章和蓝色文章的相似度为13,现在我们将蓝色的文章和绿色的文章复制成两倍,但是它们的相似度竟然变为了52,这就是问题所在,因为文章虽然复制成两倍,但是这两篇文章的内容没有变化,只不过把文章内容重复了两次,那么文章相似性应该和以前是一样的,但是我们用计算相似度的方式来度量,却发现文章变为二倍之后的相似度为52,比以前更加相似了。所以这种方法会有一定的问题,我们可以使用归一化的方式来解决这个问题。
归一化操作
我们先计算出sqrt(1^2+5^2+3^2+1^2)=6 ,然后让每一个单词的出现次数除以6,这样就将这篇文章进行了归一化的操作,我们归一化之后再来计算不同文档的相似性,使用这样的操作我们就可以解决上面的问题。
生僻词
常见词和生僻词
还有一个问题就是生僻词,假如有一篇关于足球的文章,这篇文章有许多常用的词语(语料库中出现频率高的词,语料库就是我们查看所有文档的总和),文章中还有偏僻的词,它们不是常用的词,它们在语料库中极小见,虽然它们极少见,但它们很有可能是最能代表一个文档的词语(真理掌握在少数人手里),我们应该增加这些词的权重,不能因为它们少就忽略它们,那么词袋模型就无法完成这个任务了。我们可以使用词频-逆向文档频率法。
词频-逆向文档频率法(TF-IDF)
一种表示局部常见并且全局罕见的词汇方法我们称之为TF-IDF方法,这个方法分为两个部分,一个部分是词频方法,另外一个部分是逆向文档频率法。
词频方法就是我们统计我们当前所看文章的每个词出现的频率(在当前文章的范围内)
统计我们当前所看文章的每个词出现的频率
逆向文档频率法是看我们统计每篇文章中的词,根据如下公式:
逆向文档频率法公式
该公式中分子是我们语料库中文章的总数,分母是包含这个单词的文档的数量,这样通过这个公式计算方法就是逆向文档频率法。
逆向文档频率
假如一共有64个文档,而the这个词汇出现了63次,那么根据公式the的逆向文档频率为:
示例:计算the的逆向文档频率
如果Messi这个词汇出现了3次,那么根据公式Messi的逆向文档频率为:
示例:计算Messi的逆向文档频率为
在我们常见的文章中,the是常用词,那么它的权重等于0,而Messi是生僻词,那么它的权重等于4,此时我们将词频文档表和逆向文档频率表对应相乘就可以构成最终的单词权重表:
单词权重表
我们可以看出最终的TF-IDF中the的权重为0,而Messi为20,这样我们就完成了提高生僻词Messi的权重,并且减少了常见词the的权重,这样我们就可以用TF-IDF来表示这个文档。
问题二:推荐用户感兴趣的文章
现在我们知道了如何使用向量表示一个文章,知道了如何计算衡量文档间的相似度,那么问题一就解决了,现在我们剩下第二个问题,当我们阅读一篇感兴趣的文章的时候,系统如何检索用户最感兴趣相似的文档呢?
其实很简单,我们只需要将我们当前读的文章和语料库中所有的文档都用我们刚才的TF-IDF向量表示出来,然后使用相似度量的方法,遍历语料库中所有文章中与我们阅读的文档中相似度最高的那篇文章,那么那篇文档就应该是推荐系统最应该推荐给用户的文章了。
推荐系统推荐的原理
以上会推荐给用户一篇最相近的文章,这类似于K紧邻算法,只不过K近邻算法会返回K个最相近的文章给用户。
k近邻算法
当推荐系统想要推荐给用户k篇用户最优可能感兴趣的文章的时候,我们可以使用k近邻算法,事实上推荐平台也是一下子推荐给用户很多篇最感兴趣的文章的。