第一篇地址:http://www.javashuo.com/article/p-fhoglbad-ec.html
上一篇中咱们的小明已经中学毕业了,今天这一篇继续文本类似性的计算。
首先前一篇不能解决的问题是由于咱们只是机械的计算了词的向量,并无任何上下文的关系,因此思想还停留在机器层面,尚未到更高的层次上来,正由于这样才有了天然语言处理
这门课程了。算法
今天咱们稍微说说这个吧,后台留言不少朋友对这方面感兴趣,由于天然语言处理
实在不是一篇文章就能说清的,并且我水平也很是有限,我自己是个工程人员,比较在行的是系统设计和架构,我14年10月左右的时候我老大要我补一下这方面的理论才开始看这方面的东西,后来因为换工做的缘由也断了一截,不是时时刻刻都在学这个,还有不少其余工做要作,但也还算比较连续吧,并且有一些朋友同事能够请教,不是一我的瞎搞,这已经比不少人好了。但即便是这样只能说尚未入门,或者说刚刚看到门,还没找到钥匙。
segmentfault
下面我说说我尝试过的模型吧,其余更高深的东西我也没用过,要写也能喷一下,但我以为那就没意义了。微信
主题模型是目前也比较流行的文本分类的方法了,他主要解决的是文章的分类问题,就是这篇文章属于哪一个类别。网络
如何来对文章进行分类呢?若是按照以前的算法,咱们能够把每篇文章的关键词都提取出来,而后按照关键词进行分类,把文章分到每一个类别中,可是,那样显得不过高端,咱们来想一想这么一个状况,就是你是如何写这篇文章的?架构
好比我目前写的这篇文章文本类似性的计算
,通常的思路是这样的。机器学习
首先,你想好题目之后会想一些提纲,好比我想我会写一下主题模型
,而后写词向量
,这两个就是个人主题了。函数
而后,我开始写了,写主题模型
的时候,个人一些词语都是和主题模型相关的,好比LDA
,分类
,主题
,几率
啊等等,而后写词向量
的时候也会有这么一些词,这些就是主题下的词语。学习
最后,我就是按照上面的两条规则把文章写完了。测试
如何让以计算机的思惟来按这个规则写做呢?spa
首先,定两个主题,而后把每一个词都分到某一个主题下
开始写做的时候就是先找个主题,而后在主题下找个词,而后写出来
循环到上一步,就是这样么一直写,而后一篇文章就写好了
这样每一个词都属于两个主题中的一个。
这样固然写不出东西来,可是咱们如今须要的分类,若是反过来想一想,我已经有一篇文章了,若是我知道这篇文章的每一个词都属于哪一个分类,那么我其实就知道了这篇文章都属于哪些个主题了,那么有类似主题的文章,极可能是比较类似的。
因而,如今的关键问题就是找到主题
和主题下的词
了,把这两个东西当成一个模型,新来一篇文章就在这个模型里面过一遍,而后就知道这篇文章的主题了。
主题
和主题下的词
怎么找呢?最简单的就是靠人拍啊,人为的设定一些主题和这个主题下的词以及词出现的几率,那不就好了,人怎么拍呢?靠经验啊,我今年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)的矩阵就是
主题 | 你好 | 世界 | 中国 | 搜索 |
---|---|---|---|---|
T1 | 0.0 | 1.0 | 0.0 | 0.0 |
T2 | 0.33 | 0.0 | 0.33 | 0.33 |
而后随机的指定每一个主题对应的文档几率,P(T|D)的矩阵就是
文档 | 主题1几率 | 主题2几率 |
---|---|---|
文档1 | 0.5 | 0.5 |
文档2 | 0.5 | 0.5 |
文档3 | 0.5 | 0.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仍是有很是大的差距的,若是你们感兴趣,能够看看下面几篇文章:
http://www.52nlp.cn/%E8%BD%AC%E8%BD%BD-topic-modeling-made-just-simple-enough
http://emma.memect.com/t/9756da9a47744de993d8df13a26e04e38286c9bc1c5a0d2b259c4564c6613298/LDA 《LDA数学八卦》
http://yuedu.baidu.com/ebook/d0b441a8ccbff121dd36839a?pn=3&pa=3 《LDA漫游指南》
若是你看了仍是没有懂,或者你彻底看不懂上面的文章,那么回头去看看高数,几率论吧,我只能帮到这了,可是不懂不要紧,你也能够玩LDA,我后面的文章会有工程化的例子,不用懂也行。
主题模型除了LDA还有不少其余的,好比LSI,虽然最后结果也比较靠谱,可是他的可解释性就不强了,我也无法用说人话的方式描述出来了。
主题模型这种东西是基于大规模的语料的状况下才有效果,并且主题的设定个数也是个经验值,据传说300个主题是个比较合适的值,可是具体合适不合适须要根据你本身的状况是测试,而后找到一个你认为合适的主题数。
最后简单的说一下目前也用得比较多的词向量
,就是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或者搜索西加加语言就行