文档章节

推荐系统技术之文本相似性计算(二)

wyh817
 wyh817
发布于 2017/01/16 11:43
字数 3749
阅读 59
收藏 2

上一篇中我们的小明已经中学毕业了,今天这一篇继续文本相似性的计算。 首先前一篇不能解决的问题是因为我们只是机械的计算了词的向量,并没有任何上下文的关系,所以思想还停留在机器层面,还没有到更高的层次上来,正因为这样才有了自然语言处理这门课程了。

今天我们稍微说说这个吧,后台留言很多朋友对这方面感兴趣,因为自然语言处理实在不是一篇文章就能说清的,而且我水平也非常有限,我本身是个工程人员,比较在行的是系统设计和架构,我14年10月左右的时候我老大要我补一下这方面的理论才开始看这方面的东西,后来由于换工作的原因也断了一截,不是时时刻刻都在学这个,还有很多其他工作要做,但也还算比较连续吧,而且有一些朋友同事可以请教,不是一个人瞎搞,这已经比很多人好了。但即使是这样只能说还没有入门,或者说刚刚看到门,还没找到钥匙。

下面我说说我尝试过的模型吧,其他更高深的东西我也没用过,要写也能喷一下,但我觉得那就没意义了。

1. 主题模型(Topic Model)

主题模型是目前也比较流行的文本分类的方法了,他主要解决的是文章的分类问题,就是这篇文章属于哪个类别。

如何来对文章进行分类呢?如果按照之前的算法,我们可以把每篇文章的关键词都提取出来,然后按照关键词进行分类,把文章分到每个类别中,但是,那样显得不太高端,我们来想想这么一个情况,就是你是如何写这篇文章的?

比如我目前写的这篇文章文本相似性的计算,一般的思路是这样的。

  • 首先,你想好题目以后会想一些提纲,比如我想我会写一下主题模型,然后写词向量,这两个就是我的主题了。
  • 然后,我开始写了,写主题模型的时候,我的一些词语都是和主题模型相关的,比如LDA分类主题概率啊等等,然后写词向量的时候也会有这么一些词,这些就是主题下的词语。
  • 最后,我就是按照上面的两条规则把文章写完了。

如何让以计算机的思维来按这个规则写作呢?

  • 首先,定两个主题,然后把每个词都分到某一个主题下
  • 开始写作的时候就是先找个主题,然后在主题下找个词,然后写出来
  • 循环到上一步,就是这样么一直写,然后一篇文章就写好了

这样每个词都属于两个主题中的一个。

这样当然写不出东西来,但是我们现在需要的分类,如果反过来想想,我已经有一篇文章了,如果我知道这篇文章的每个词都属于哪个分类,那么我其实就知道了这篇文章都属于哪些个主题了,那么有相似主题的文章,很可能是比较相似的。

于是,现在的关键问题就是找到主题主题下的词了,把这两个东西当成一个模型,新来一篇文章就在这个模型里面过一遍,然后就知道这篇文章的主题了。

主题主题下的词怎么找呢?最简单的就是靠人拍啊,人为的设定一些主题和这个主题下的词以及词出现的概率,那不就行了,人怎么拍呢?靠经验啊,我今年30多了,看了二十多年的书,少说有1000本吧,我知道哪些词应该在哪些分类下啊。OK,靠经验估计出来的,我靠,是不是有种似曾相识的赶脚啊?这不是机器学习最喜欢干的事情么?给一堆文章给他『看』,然后自己估算出一个主题模型出来。

好吧,其实主题模型就是这么干的。LDA模型的数学表达比较复杂,涉及到好几个分布函数,还有采样函数等,这篇文章必然讲不清楚,如果感兴趣的,我后面列了几篇文章,可以看看他的数学原理是什么。这个东西我理解了很久很久才算明白,我现在用说人话的方式来说说整个过程,作为一个抛砖引玉吧,当然,和实际的算法还是有比较大出入的,如果真感兴趣可以看后面的推荐文章。

我们先定义下一个场景,有3篇文档,每个文档有2个词,设定有2个主题,这三篇文档和词分别是:

1 :你好 世界 2 :你好 中国 3 :搜索 你好

那么词就是:你好,世界,中国,搜索 四个 主题定义为:T1,T2

下方这些人话是重点了。

因为我们认为写文章的时候是是按照两步来做的(先确定主题,然后确定词,最后把词写出来),那么在数学上可以变成两个概率的乘积了,所以,这个词为什么会出现在这篇文章呢?是因为

这个词在这篇文章出现的概率=这个主题在这篇文章的概率*这个词在这个主题下出现的概率,也就是 P(W(词)|D(文章))=P(W(词)|T(主题))*P(T(主题)|D(文章)),这个 公式非常重要。

P(W(词)|D(文章)) 这个其实是可以直接统计出来的。

P(W(词)|T(主题)) 这个是模型的一部分,是要求出来的。

P(T(主题)|D(文章)) 这个是最后分类的结果

有新来的文章我们要对这篇文章进行分类的话,先统计出P(W(词)|D(文章)),然后用P(W(词)|D(文章))去除以P(W(词)|T(主题)) ,就得到了这篇文章所属的每个主题的概率了。

人话说完了,我们看看机器怎么来求出这个P(W(词)|T(主题))

  • 首先随机指定每个词属于某个主题,那么假设设定完了以后P(W|T)的矩阵就是
主题你好世界中国搜索
T10.01.00.00.0
T20.330.00.330.33
  • 然后随机的指定每个主题对应的文档概率,P(T|D)的矩阵就是
文档主题1概率主题2概率
文档10.50.5
文档20.50.5
文档30.50.5
  • 然后拿第一篇文章的第一个词出来,统计出来他在这篇文章出现的概率,也就是0.5,再给他随机拍一个主题,比如T1

  • 用上述的计算出来的话0.0*0.5=0.0,而我们统计出来是0.5啊,这不对,我们再试试别的主题,比如T2,这么算出来0.33*0.5=0.165,也不对啊,但比T1好像要靠谱一点,那我们按照这个调整一下上面两个表格的数字吧,比如把那个0.0改成0.2之类的(具体怎么调?呵呵呵,靠说人话我说不出来了,看后面的链接吧)。

  • 这么一个一个词下来,上面两个表格就在不断更新,然后我们一遍一遍的循环迭代,直到上面两个表格能满足所有文档所有词要求了就结束了。放心,不会死循环的。 这么一轮下来,就得到了两个表格了。这两个表格就是我们的LDA模型了。

  • 新来的文章我们要对这篇文章进行分类的话,先统计出P(W(词)|D(文章)),然后用P(W(词)|D(文章))去除以P(W(词)|T(主题)) ,就得到了这篇文章所属的每个主题的概率了。

  • 然后我们还可以把新文章也放进模型中继续训练,然后又得到一个更新了的表格,这样不断有文章进来,表格就不断变化了。

好了,说完了,在没有一个公式的情况下我只能说到这了,实际的LDA还是有非常大的差距的,如果大家感兴趣,可以看看下面几篇文章:

如果你看了还是没有懂,或者你完全看不懂上面的文章,那么回头去看看高数,概率论吧,我只能帮到这了,但是不懂没关系,你也可以玩LDA,我后面的文章会有工程化的例子,不用懂也行。

主题模型除了LDA还有很多其他的,比如LSI,虽然最后结果也比较靠谱,但是他的可解释性就不强了,我也没法用说人话的方式描述出来了。

主题模型这种东西是基于大规模的语料的情况下才有效果,而且主题的设定个数也是个经验值,据传说300个主题是个比较合适的值,但是具体合适不合适需要根据你自己的情况是测试,然后找到一个你认为合适的主题数。

2. 词向量

最后简单的说一下目前也用得比较多的词向量,就是word2vector了,光有了主题模型很多人还是不满足,他们还想知道词与词之间的关系,人为的表示也就是近义词了,但是词向量能解决的可远远不是近义词同义词了,比如给一堆微博的语料丢给word2vec来训练,他可以找出来范冰冰李晨这两个词有关系,然后我们发挥一下,如果你有个推荐系统,按照文本相关性去推荐内容,发现没有太相关的推荐结果,这时候你就可以用word2vec扩展你的词了,然后用扩展的词去推荐东西了,比如用范冰冰的新闻推荐出李晨的新闻来,当然这只是举个例子啊,我暂时还没看到有地方这么来做推荐。

词向量也就是用一个向量来表示一个词,比如一个词北京,还有三个维度分别是大学,北方,首都,我们把北京用向量表示成[0,9,0.5,1],那么这个词有3个维度,这三个维度的意义是什么呢?可以解释成北京这个词啊是大学的概率是0.6,他在北方的概率是0.5,他是首都的概率是1,是不是和上面的分类很相似啊,如果每个词都可以这么表示的话,那么两个词之间的相似度就是这两个向量之间的距离了,和上一篇的向量空间一样,那么如何来求一个词的向量呢?其实也可以按照上面的LDA的方式分类来求,呵呵,但我们不这么来。

还是按照上面那个例子来看看,你看到范冰冰这个词,为什么你觉得他和李晨会相似呢?我们知道的是他们是夫妻所以才相似,为什么知道他们是夫妻呢?因为新闻的文章中这两个词老是出现在一起,要不就是在一句话中或者在一段话中,所以冥冥之中我们觉得他们是有相似性的,好吧,就是这个冥冥之中怎么让机器知道,有个东西叫神经网络,最会冥冥之中,因为他冥冥之中想出来的东西你解释不了,但又好像也能说得过去。好,那么我们来看看机器怎么弄的。

  • 假设有这么一句话我爱北京天安门,我们先给每个词编个号,我1,爱2,北京3,天安门4。
  • 然后,我们扫描这个句子的每个词,找和他相邻的两个词,分别是他前面一个和后面一个,那么一轮下来,我们得到一个这样的东西:1(2),2(1,3),3(2,4),4(3),这表示什么?表示每个词和他有两个相关的词,如果我们有大量的句子,那么可以得到非常多的上述关系表达式。
  • 然后呢?然后我们设定一个向量的维度,也就是每个词我们可以用几个维度来表示。
  • 再然后呢?再然后就上神经网络了,这东西啊,如果你知道逻辑回归这种机器学习的方法的话,再假设逻辑回归是物理电路中的一条回路的话,那神经网络就是把逻辑回归这种回路串联并联起来的东西。也就是逻辑回归的逻辑回归的逻辑回归【这句话不是我总结的,我忘了在哪看到过了,觉得挺形象】
  • 最后呢?最后每个词就成了一个向量了。

有了向量了,那么就能比较了吧?

总结

好了,今天扯了这么多,我看下来有点耽误人的意思,因为用太通俗的话根本解释不了很多数学模型,而我数学也不好,要说清楚这些个数学模型我也很费劲,关键是一堆公式出来也没人看,自己心里默默的清楚就行了,大家也别想着通过一两篇文章能了解一个数学模型,自然语言处理这个本来就是个拼数学的领域,要深入还得自己去看书看论文,要了解这些数学模型也不是看一篇文章能了解的,真的感兴趣的,想做算法工程师的,自己专研吧。

下一篇我会把这两篇的东西实战一下,看看最终是不是有效果,估计下一篇能有意思一点。


欢迎关注我的公众号,主要聊聊搜索,推荐,广告技术,还有瞎扯。。文章会在这里首先发出来:)扫描或者搜索微信号XJJ267或者搜索西加加语言就行

© 著作权归作者所有

wyh817

wyh817

粉丝 13
博文 20
码字总数 63957
作品 1
海淀
其他
私信 提问
推荐算法概述:基于内容的推荐算法、协同过滤推荐算法和基于知识的推荐算法

所谓推荐算法就是利用用户的一些行为,通过一些数学算法,推测出用户可能喜欢的东西。推荐算法主要分为两种 1. 基于内容的推荐 基于内容的信息推荐方法的理论依据主要来自于信息检索和信息过...

xiaomin0322
2018/06/20
267
0
余弦定理的应用:基于文字的文本相似度计算

最近由于工作项目,需要判断两个txt文本是否相似,于是开始在网上找资料研究,因为在程序中会把文本转换成String再做比较,所以最开始找到了这篇关于 距离编辑算法 Blog写的非常好,受益匪浅...

大数据之路
2013/03/24
4K
5
Python文本挖掘-PDF和脚本见附件

课程要点 •分词以及词权重 •文本分类算法 •文本检索和LDA 常国珍《Python数据科学:全栈技术详解》 3 课程大纲 1)文本挖掘介绍 2)中文分词 3)文本特征提取与相关性的度量 4)文本分类 5)主...

Ben_Chang
2018/05/01
0
0
最小化局部边际的合并聚类算法(上篇)

作者:钱烽 摘要:提出最小化局部边际的合并聚类算法.现有的合并聚类算法主要包括经典合并聚类技术和聚类任意形状的合并聚类技术两种类型.其中,前者能够输出符合严格单调递减规律的完整系统树...

网易云
2018/09/17
0
0
工程实践也能拿KDD最佳论文?解读Embeddings at Airbnb

作者 | Mihajlo Grbovic,Airbnb 资深机器学习科学家 译者 | Lang Yang,Airbnb 工程经理 【导读】本文最早于 2018 年 5 月 13 日发表,主要介绍了机器学习的嵌入技术在 Airbnb 爱彼迎房源搜...

AI科技大本营
2018/11/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

CentOS7.6中安装使用fcitx框架

内容目录 一、为什么要使用fcitx?二、安装fcitx框架三、安装搜狗输入法 一、为什么要使用fcitx? Gnome3桌面自带的输入法框架为ibus,而在使用ibus时会时不时出现卡顿无法输入的现象。 搜狗和...

技术训练营
昨天
5
0
《Designing.Data-Intensive.Applications》笔记 四

第九章 一致性与共识 分布式系统最重要的的抽象之一是共识(consensus):让所有的节点对某件事达成一致。 最终一致性(eventual consistency)只提供较弱的保证,需要探索更高的一致性保证(stro...

丰田破产标志
昨天
8
0
docker 使用mysql

1, 进入容器 比如 myslq1 里面进行操作 docker exec -it mysql1 /bin/bash 2. 退出 容器 交互: exit 3. mysql 启动在容器里面,并且 可以本地连接mysql docker run --name mysql1 --env MY...

之渊
昨天
10
0
python数据结构

1、字符串及其方法(案例来自Python-100-Days) def main(): str1 = 'hello, world!' # 通过len函数计算字符串的长度 print(len(str1)) # 13 # 获得字符串首字母大写的...

huijue
昨天
6
0
PHP+Ajax微信手机端九宫格抽奖实例

PHP+Ajax结合lottery.js制作的一款微信手机端九宫格抽奖实例,抽奖完成后有收货地址添加表单出现。支持可以设置中奖概率等。 奖品列表 <div class="lottery_list clearfix" id="lottery"> ......

ymkjs1990
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部