深度学习word2vec笔记之应用篇

safemens 贡献于2018-05-04

作者 zxw  创建于2015-09-03 14:03:00   修改者zxw  修改于2015-09-03 14:04:00字数69438

文档摘要:互联网广告的广告主其实往往有他们的困惑,他们不知道自己的目标人群在哪里。所谓目标人群,就是广告主想向他们投广告的那帮人。就像互联网广告的一个大牛的一句名言——我知道互联网广告有一半是浪费的,问题是我不知道是哪一半。
关键词:

深度学习word2vec笔记之应用篇 2014年8月17日Deep Learning, nlpword2vecsmallroof 声明: 1)该博文是Google专家以及多位博主所无私奉献的论文资料整理的。具体引用的资料请看参考文献。具体的版本声明也参考原文献 2)本文仅供学术交流,非商用。所以每一部分具体的参考资料并没有详细对应,更有些部分本来就是直接从其他博客复制过来的。如果某部分不小心侵犯了大家的利益,还望海涵,并联系老衲删除或修改,直到相关人士满意为止。 3)本人才疏学浅,整理总结的时候难免出错,还望各位前辈不吝指正,谢谢。 4)阅读本文需要机器学习、概率统计算法等等基础(如果没有也没关系了,没有就看看,当做跟同学们吹牛的本钱),基础篇url:http://blog.csdn.net/mytestmy/article/details/26961315 。 5)此属于第一版本,若有错误,还需继续修正与增删。还望大家多多指点。请直接回帖,本人来想办法处理。 6)本人手上有word版的和pdf版的,有必要的话可以上传到csdn供各位下载。       好不容易学了一个深度学习的算法,大家是否比较爽了?但是回头想想,学这个是为了什么?吹牛皮吗?写论文吗?参加竞赛拿奖吗? 不管哪个原因,都显得有点校园思维了。 站在企业的层面,这样的方式显然是不符合要求的,如果只是学会了,公式推通了,但是没有在工作中应用上,那会被老大认为这是没有产出的。没有产出就相当于没有干活,没有干活的话就……呃……不说了。 下面就给大家弄些例子,说说在互联网广告这一块的应用吧。   一.对广告主的辅助 1.1基本概念 互联网广告的广告主其实往往有他们的困惑,他们不知道自己的目标人群在哪里。所谓目标人群,就是广告主想向他们投广告的那帮人。就像互联网广告的一个大牛的一句名言——我知道互联网广告有一半是浪费的,问题是我不知道是哪一半。 这个困惑就给媒体带来一个义务——要帮助广告主定向他们的目标人群。 对于普通的广告主来说,比如说一个化妆品广告的广告主,它的目标人群很明显就是年轻的女性。注意关键词“年轻”和“女性”,这是决定媒体这边能否赚到钱的关键词。要知道对于媒体来说,广告主是它们的客户,满足客户的要求,客户就给它们钱,不满足客户的要求,就没有人为媒体买单;没有人为媒体买单,媒体就没有钱养它们的员工和机器,也弄不来新闻和互联网的其他内容,那样媒体公司就垮了…… 那么在媒体这边,需要做的的工作就很明确了——满足它们的客户(也就是广告主)的需求。怎么满足呢?这工作说容易也容易,说简单也简单,就是把喜欢这个广告主的广告的人找出来,然后帮这个广告主把他们的广告投放给这些人,让这些人看到这个广告主的广告。 这个工作带来的问题就真多了,媒体又不是什么神人,比如说一个新闻网站,浏览这个网站的每天有100万人,这个新闻网站的员工不可能一个个去访问他们的用户(浏览这个网站的人),整天问他们你喜不喜欢化妆品啊,喜不喜欢体育啊之类的问题。 那怎么办呢?媒体的员工只好猜了,但是哪怕是猜都很费劲,想想都头疼,一百万人啊,一个个猜也得吃力不讨好啊。这时候计算机的作用就来了,用计算机猜 嘛,而且不一定需要全部瞎猜的,因为用户如果注册了的话,还有一些用户的个人信息可以参考的。一般的网站注册的时候都要求提供年龄性别之类的个人信息,有时候要要求写一些个人的兴趣什么的标签。这个时候这些数据就用上大用处了。 网站可以把注册用户的个人信息保存下来,然后提供广告主选择。如上面的那个化妆品的广告主,它就可以跟媒体提它的要求——我要向年轻的女性投放广告。媒体这个时候就可以提供一些条件给这个广告主选择,如媒体说我有很多用户,18到80岁的都有,然后男性女性用户都有。广告主就可以根据这些条件选择自己的目标用户,如选择了18到30岁的女性用户作为目标人群。选中了目标人群后,广告主和媒体就可以谈价钱了,谈好了价钱广告主就下单,然后媒体就帮广告主投广告,然后媒体的钱就赚到了。   1.2兴趣挖掘的必要性 上面多次提到的“目标人群”,就是广告主最关心的事情。客户最关心的事情自然也是媒体最关心的事情。所以媒体会尽力帮助它们的客户去定向它们的目标人群。 一般所谓的定向也不是媒体亲自有一个人来跟广告主谈的,是媒体建立好一个页面,这个页面上有一些选项,比如年龄,性别,地域什么的,都是条件。广告主在上面把自己的目标人群符合的条件输入,然后下单购买向这些人投放广告的机会。 媒体为了更好地赚钱,肯定是愿意把这个页面上的条件做得更加丰富一点,让更多的广告主觉得这个网站的用户里面有它们的目标人群,从而让更多的广告主愿意过来下单。 广告主的定向其实有粗细之分的,有些广告主粗放点,它们有钱,选的定向条件比较宽,就说女性的用户,全部都投放;有些就定向得比较窄,比如说,北京的20到25岁的女性,并且要喜欢羽毛球的用户。对于定向宽的广告主好处理,问题就是这些定向窄的广告主,它们还希望知道用户的兴趣所在,这就麻烦了。 为啥麻烦呢?一个用户的兴趣鬼才知道呢。就算当面问,人家也不乐意回答,何况就凭借一点点东西瞎猜。但是为了赚钱,瞎猜也得上的了,工业界为了赚这个钱,诞生了整整一个行业——数据挖掘,甚至在学术界还有一个更加生猛的名字——机器学习。学术界的那个名字和解释都是相当大气的:让机器学会像人一样思考。工业界就务实一点,只是对数据内容本身做一个挖掘,获取到啥呢?一般 就是用户的兴趣啊,爱好啊什么的。这些东西供谁使用呢?暂时看来只有广告主愿意为这些掏钱,其他的就有些媒体做来让自己推荐的内容不至于让用户那么反感而已。 上面有个名词“数据”,没错了,这个词是互联网广告业,甚至是数据挖掘行业的核心的东西。所谓数据,这里简单点说就可以认为是用户的年龄、性别、地域等用户的基本属性;复杂点说可以说是用户兴趣、爱好,浏览记录等;更高级的有用户的交易数据(当然这个高级的数据很少媒体能搞得到)等。 解释完“数据”这个词,结合一下广告这个场景,就可以得到活在媒体公司里面的互联网广告行业数据挖掘工程师的工作是什么了。他们的工作就是:根据用户自身的基本属性和用户流量的网页记录以及内容,想方设法让计算机猜出用户的兴趣爱好。用户的兴趣爱好“挖掘”出来后,就可以作为定向条件放到上面说的那个网页上面供广告主选择了。这事情整好了,广告投了有人点击,公司的钱就赚到了;没整好,广告没人点击,广告主不乐意下单了,公司就赚不到钱……怎么着?炒这些工程师的鱿鱼去。 上面可以看到了,辅助广告主定位它们的目标人群是很重要的。 经过一番的探索,word2vec在互联网广告上面也是可以辅助广告主定向他们的目标人群的,下面就讲讲这个算法在互联网广告的应用吧。 1.3利用word2vec给广告主推荐用户 为了用上word2vec,把场景转换到一个新闻媒体如A公司。 在A公司的多个页面中,电商公司B有他们的一个主页,专门介绍他们公司一些产品促销,抢购和发布会什么的。 公司A目前有很多用户的浏览数据,如用户u浏览了公司A的页面a1,a2,a3等。 把这些数据处理一下,整合成word2vec能处理的数据,如下 U1  a1,a2,a3…… U2  a2,a3,a5,…… U3  a1,a3,a6,…… 其中u1,u2,u3表示不同的用户,后面的一串表示这些用户的浏览记录,如U1  a1,a2,a3表示用户u1先浏览了页面a1,再浏览a2,然后浏览了a3,…… 这些数据还不符合word2vec的输入数据格式,把第一列去掉,变成下面的样子 a1,a2,a3…… a2,a3,a5,…… a1,a3,a6,…… 这些数据就可以作为word2vec的输入数据了。 就把这些数据作为word2vec的训练数据,词向量维度为3,进行训练,完成后得到下面的输出 A1  (0.3,-0.5,0.1) A2  (0.1,0.4,0.2) A3  (-0.3,0.7,0.8) …… An  (0.7,-0.1,0.3) 就得到了每个页面的向量。 这些向量有啥意义呢?其实单个向量的意义不大,只是用这些向量可以计算一个东西——距离,这个距离是页面之间的距离,如页面a1和a2可以用欧式距离或者cos距离计算公式来计算一个距离,这个距离是有意义的,表示的是两个网页在用户浏览的过程中的相似程度(也可以认为是这两个页面的距离越近,被同一个人浏览的概率越大)。注意这个距离的绝对值本身也是没有意义的,但是这个距离的相对大小是有意义的,意思就是说,假设页面a1跟a2、a3、a4的距离分别是0.3、0.4、0.5,这0.3、0.4、0.5没啥意义,但是相对来说,页面a2与a1的相似程度就要比a3和a4要大。 那么这里就有玄机了,如果页面a1是电商公司B的主页,页面a2、a3、a4与a1的距离在所有页面里面是最小的,其他都比这三个距离要大,那么就可以认为同一个用户u浏览a1的同时,浏览a2、a3、a4的概率也比较大,那么反过来,一个用户经常浏览a2、a3、a4,那么浏览a1的概率是不是也比较大呢?从实验看来可以这么认为的。同时还可以得到一个推论,就是用户可能会喜欢a1这个页面对应的广告主的广告。 这个在实验中实际上也出现过的。这里模拟一个例子吧,如a1是匹克体育用品公司在媒体公司A上的官网,a2是湖人队比赛数据页,a3是热火队的灌水讨论区,a4是小牛队的球员讨论区。这个结果看起来是相当激动人心的。 根据这样的一个结果,就可以在广告主下单的那个页面上增加一个条件——经常浏览的相似页面推荐,功能就是——在广告主过来选条件的时候,可以选择那些经常浏览跟自己主页相似的页面的用户。举个例子就是,当匹克体育用品公司来下单的时候,页面上给它推荐了几个经常浏览页面的粉丝:湖人队比赛数据页,热火队的灌水讨论区,小牛队的球员讨论区。意思是说,目标人群中包括了经常浏览这三个页面的人。 这个功能上线后是获得过很多广告主的好评的。 这样word2vec这个算法在这里就有了第一种用途。   二. 对ctr预估模型的帮助 根据另一篇博文《互联网广告综述之点击率系统》,里面需要计算的用户对某广告的ctr。在实际操作的时候,这个事情也是困难重重的,其中有一个冷启动问题很难解决。冷启动问题就是一个广告是新上线的,之前没有任何的历史投放数据,这样的广告由于数据不足,点击率模型经常不怎么凑效。 但是这个问题可以使用同类型广告点击率来缓解,意思就是拿一个同行的广告的各种特征作为这个广告的特征,对这个新广告的点击率进行预估。 同行往往太粗糙,那么怎么办呢?可以就利用跟这个广告主比较相似的广告的点击率来预估一下这个广告的点击率。 上面说过,可以得到每个页面的词向量。这里的方法比较简单,如在媒体公司A上面有1000个广告主,它们的主页分别是a1、a2、……、a1000。 根据上面的方法,得到了这1000个词向量,然后运行kmean或者其他聚类算法,把这1000个广告主聚成100个簇,然后每个簇里面的广告主看成是一个。 这里可以模拟一个例子,聚类完成后,某个簇c里面包含了几个广告主的主页,分别是京东商城,天猫,唯品会,当当,聚美优品,1号店,蘑菇街,卓越,亚马逊,淘宝这10个,这10个的目标人群看起来基本是一致的。 这里的看成是一个簇是有意义的,比如说第一个簇c1,c1这个簇里面的所有历史投放数据和实时数据可以做特征,来预估这个流量对这个簇的ctr。得到这个ctr后,就很有用了,如果某广告投放数据比较充分,就直接预估这个广告的ctr;如果某广告的历史投放数据很少,就用这个广告主所在的簇的ctr来代替这个广告,认为对簇的ctr就是这个广告的ctr,这样能让一个新广告也能得到相对靠谱的预估ctr,保证不至于乱投一番。   三.一些总结 如何应用好一个算法,确实是很多算法工程师的一个重大课题。 数据挖掘算法工程师经常要面对的一个难题就是:这个算法怎么用到我们的数据上面来?有不少同学会认为是:我到了公司,就发明一个很牛逼的算法,把公司的原来的问题解决掉,然后大大增加了效果,获得了领导的好评。这个天真烂漫的想法就不评价了,免得被说打击人。互联网企业里面的真实情况是算法工程师面对那一团乱遭的数据,得想尽办法去把数据整合成能用的格式。 拿上面的(1.3)中的例子,那个把数据组合成a1,a2,a3……这样一行行的,然后进入word2vec去进行训练是最难想到的而且是最核心的东西,虽然明着说是word2vec这个算法厉害,实际上面是“把数据整合成合适的方式交给word2vec进行训练”这个想法重要,因为尝试了很多想法,做了很多实验才能想到这样的一招的。 还有数据的整合其实也费了很多功夫的,比如说媒体有些用户是一些机器的账号,人家乱搞的,要想办法排除掉的,而“想办法排除”这么简单一句话,真正要做的工作真是多多的有。 哪怕结果都训练出来了,怎么解释这个结果是好的?这个问题也是得想了一段时间的,后来是实验发现了利用词向量的距离来评价相似性这个东西最靠谱,然后才用上的。 一个数据挖掘的过程其实不简单,这个博客也没办法一一体现做的过程里面的那些各种折腾,各种不顺畅。 数据挖掘工程师经常要面对的另一个难题就是:明明理论上推得杠杠的,算法性能也是杠杠的,但是对于互联网广告的效果,怎么就那么不咸不淡的呢? 这个问题真没有什么统一的答案,这种现象多了去了。经常遇到的原因有:数据本身处理的方式不对和算法不合适。 所谓数据本身处理的方式,可以参看博文《互联网广告综述之点击率特征工程》,里面说的那些方法不是从哪本书上面看到的,是经过比较长时间实践,然后各种折腾,各种特征取舍,各种胡思乱想,各种坑踩出来的。可能志在学术的人看起来都简单,实际上课本那些东西,学生们吹起牛皮来不眨眼的那些东西,一跟真实应用场景结合起来就各种坑要踩的了。 拿上面的(二)中的例子来看。方法简单得不得了,但是可以想象一下,word2vec牛逼啊,kmeans牛逼啊,第一次聚类出来的结果也不过如此。后来又加入了每个广告主的行业和地域作为特征,而且这个加特征,就是直接把行业和地域处理一下,连接到广告主的词向量后面的。如a1的词向量是(0.3,-0.5,0.1),然后假设只有两个行业,体育和化妆品,处理成二值特征,占据第4和5两个index,第4个特征为1,第5个特征为0表示体育类广告主,反过来,第4个特征为0,第5个特征为1表示化妆品;再对地域的下标做了一下处理,成为二值特征,比如说占据了6到10这5个位置(假设第6个位置为1,其余7到10为0表示北京;第7个位置为1,其余为0表示广东,以此类推)。 经过了上面的处理,再用kmeans进行聚类,从聚类后一个个簇去看,结果看起来才顺眼了很多。上面的行业和地域特征的加入,也是用了比较多的经验的,不是凭空乱整出来的一个吹牛皮的东西,当然谁有更好的方法,也可以提出来试试看。另外还希望大家注意关键字“一个个簇去看”,这个工作真是费时费力,比较辛苦的。 以上举了一些例子,也把互联网广告的数据挖掘算法工程师的一些工作中的成功和不成功的地方都说出来了,基本上算是实话实说,希望对大家有点帮助吧。有过类似经历的人能看懂,没啥兴趣的就呵呵吧。     致谢 多位同事提供的建议与指导。 多位google研究员有关word2vec的资料。   本文转载自:mytestmy的专栏 Leave a comment 深度学习word2vec笔记之算法篇 2014年8月17日Deep Learning, nlpword2vecsmallroof 声明: 1)该博文是Google专家以及多位博主所无私奉献的论文资料整理的。具体引用的资料请看参考文献。具体的版本声明也参考原文献 2)本文仅供学术交流,非商用。所以每一部分具体的参考资料并没有详细对应,更有些部分本来就是直接从其他博客复制过来的。如果某部分不小心侵犯了大家的利益,还望海涵,并联系老衲删除或修改,直到相关人士满意为止。 3)本人才疏学浅,整理总结的时候难免出错,还望各位前辈不吝指正,谢谢。 4)阅读本文需要机器学习、概率统计算法等等基础(如果没有也没关系了,没有就看看,当做跟同学们吹牛的本钱),基础篇url:http://blog.csdn.net/mytestmy/article/details/26961315 。 5)此属于第一版本,若有错误,还需继续修正与增删。还望大家多多指点。请直接回帖,本人来想办法处理。 6)本人手上有word版的和pdf版的,有必要的话可以上传到csdn供各位下载     前言 在看word2vec的资料的时候,经常会被叫去看那几篇论文,而那几篇论文也没有系统地说明word2vec的具体原理和算法,所以老衲就斗胆整理了一个笔记,希望能帮助各位尽快理解word2vec的基本原理,避免浪费时间。   当然如果已经了解了,就随便看看得了。     一. CBOW加层次的网络结构与使用说明 Word2vec总共有两种类型,每种类型有两个策略,总共4种。这里先说最常用的一种。这种的网络结构如下图。 其中第一层,也就是最上面的那一层可以称为输入层。输入的是若干个词的词向量(词向量的意思就是把一个词表示成一个向量的形式表达,后面会介绍)。中间那个层可以成为隐层,是输入的若干个词向量的累加和,注意是向量的累加和,结果是一个向量。 第三层是方框里面的那个二叉树,可以称之为输出层,隐层的那个节点要跟输出层的那个二叉树的所有非叶节点链接的,线太多画不过来了。第三层的这个二叉树是一个霍夫曼树,每个非叶节点也是一个向量,但是这个向量不代表某个词,代表某一类别的词;每个叶子节点代表一个词向量,为了简单只用一个w表示,没有下标。另外要注意的是,输入的几个词向量其实跟这个霍夫曼树中的某几个叶子节点是一样的,当然输入的那几个词跟它们最终输出的到的那个词未必是同一个词,而且基本不会是同一个词,只是这几个词跟输出的那个词往往有语义上的关系。 还有要注意的是,这个霍夫曼树的所有叶子节点就代表了语料库里面的所有词,而且是每个叶子节点对应一个词,不重复。 这个网络结构的功能是为了完成一个的事情——判断一句话是否是自然语言。怎么判断呢?使用的是概率,就是计算一下这句话的“一列词的组合”的概率的连乘(联合概率)是多少,如果比较低,那么就可以认为不是一句自然语言,如果概率高,就是一句正常的话。这个其实也是语言模型的目标。前面说的“一列词的组合”其实包括了一个词跟它的上下文的联合起来的概率,一种普通的情况就是每一个词跟它前面所有的词的组合的概率的连乘,这个后面介绍。 对于上面的那个网络结构来说,网络训练完成后,假如给定一句话s,这句话由词w1,w2,w3,…,wT组成,就可以利用计算这句话是自然语言的概率了,计算的公式是下面的公式 其中的Context表示的是该词的上下文,也就是这个词的前面和后面各若干个词,这个“若干”(后面简称c)一般是随机的,也就是一般会从1到5之间的一个随机数;每个代表的意义是前后的c个词分别是那几个的情况下,出现该词的概率。举个例子就是:“大家 喜欢 吃 好吃 的 苹果”这句话总共6个词,假设对“吃”这个词来说c随机抽到2,则“吃”这个词的context是“大家”、“喜欢”、“好吃”和“的”,总共四个词,这四个词的顺序可以乱,这是word2vec的一个特点。 计算的时候都要用到上面的那个网络,具体计算的方法用例子说明,假设就是计算“吃”这个词的在“大家”、“喜欢”、“好吃”和“的”这四个词作为上下文的条件概率,又假设“吃”这个词在霍夫曼树中是的最右边那一个叶子节点,那么从根节点到到达它就有两个非叶节点,根节点对应的词向量命名为A,根节点的右孩子节点对应的词向量命名为B,另外再假设“大家”、“喜欢”、“好吃”和“的”这四个词的词向量的和为C,则 其中,是sigmoid公式。 要注意的是,如果“吃”这个词在非叶节点B的左孩子节点(假设称为E)的右边的那个叶子节点,也就是在图中右边的三个叶子的中间那个,则有 上面的那句话的每个词都计算后连乘起来得到联合概率,这个概率如果大于某个阈值,就认为是正常的话;否则就认为不是自然语言,要排除掉。 对于这个神经网络的描述索然无味,因为主角也不是这个概率,这个神经网络最重要的是输出层的那个霍夫曼树的叶子节点上的那些向量,那些向量被称为词向量,词向量就是另外一篇博文里面介绍的,是个好东西。 怎么得到这些词向量更加是一个重要的过程,也是word2vec这整个算法最重要的东西,后面会认真介绍。       二.优化目标与解问题 2.1从霍夫曼树到条件概率的计算 前面已经提过语言模型的目标就是判断一句话是否是正常的,至于怎么判断则需要计算很多条件概率如,然后还要把这些条件概率连乘起来得到联合概率。这样就带来了问题了——怎么去计算,有很多办法的,后面的章节会介绍。这里的word2vec的计算这个条件概率的方法是利用神经网络的能量函数,因为在能量模型中,能量函数的功能是把神经网络的状态转化为概率表示,这在另外一篇博文RBM里面有提到,具体要看hinton的论文来了解了。能量模型有个特别大的好处,就是能拟合所有的指数族的分布。那么,如果认为这些条件概率是符合某个指数族的分布的话,是可以用能量模型去拟合的。总之word2vec就认为这个条件概率可以用能量模型来表示了。 既然是能量模型,那么就需要能量函数,word2vec定义了一个非常简单的能量函数 E(A,C)=-(A∙C) 其中A可以认为是某个词的词向量,C是这个词的上下文的词向量的和(向量的和),基本上就可以认为 C代表Context;中间的点号表示两个向量的内积。 然后根据能量模型(这个模型假设了温度一直是1,所以能量函数没有分母了),就可以表示出词A的在上下文词向量C下的概率来了                 (2.1.2) 其中V表示语料库里面的的词的个数,这个定义的意思是在上下文C出现的情况下,中间这个词是A的概率,为了计算这个概率,肯定得把语料库里面所有的词的能量都算一次,然后再根据词A的能量,那个比值就是出现A的概率。这种计算概率的方式倒是能量模型里面特有的,这个定义在论文《Hierarchical Probabilistic Neural Network Language Model》里面,这里拿来改了个形式。 这个概率其实并不好统计,为了算一个词的的概率,得算上这种上下文的情况下所有词的能量,然后还计算指数值再加和。 这时候科学家们的作用又体现了,假如把语料库的所有词分成两类,分别称为G类和H类,每类一半,其中词A属于G类,那么下面的式子就可以成立了 p(A│C)=p(A|G,C)p(G|C)                        (2.1.3) 这个式子的的含义算明确的了,词A在上下文C的条件下出现的概率,与后面的这个概率相等——在上下文C的条件下出现了G类词,同时在上下文为C,并且应该出现的词是G类词的条件下,词A出现的概率。 列出这么一个式子在论文《Hierarchical Probabilistic Neural Network Language Model》里面也有个证明的,看原始的情况 P(Y=y│X=x)=P(Y=y|D=d(y),X)P(D=d(y)|X=x) 其中d是一个映射函数,把Y里面的元素映射到词的类别D里面的元素。还有个证明 式子(2.1.3)说明了一个问题,计算一个词A在上下文C的情况下出现的概率,可以先对语料库中的词分成两簇,然后能节省计算。现在来展示一下怎么节省计算,假设G,H这两类的簇就用G和H表示(G和H也是一个词向量,意思就是G表示了其中一簇的词,H表示了另外一簇的词,G和H只是一个代表,也不是什么簇中心的说法。其实如果情况极端点,只有两个词,看下面的式子就完全没问题了。在多个词的情况下,就可以认为词被分成了两团,G和H个表示一团的词,计算概率什么的都以一整团为单位),那么式子(2.3)中的p(G|C)可以用下面的式子计算 也就是说,可以不用关系那个是簇中心,只要利用一个F=H-G的类词向量的一个向量就可以计算P(G|C)了,所以这一步是很节省时间的。再看另外一步 由于在G内的词数量只有V/2个,也就是说计算分母的时候只要计算V/2个词的能量就可以了。这已经省了一半的计算量了,可惜科学家们是贪得无厌的,所以还要继续省,怎么来呢?把G类词再分成两个簇GG,GH,A在GH里面,然后 p(A│G,C)=p(A|GH,G,C)p(GH|G,C) 同样有 和 同样可以把GG-GH用一个类词向量表达,这时候 p(A│C)=p(A|GH,G,C)p(GH|G,C)p(G|C) 继续下去假设继续分到GHG簇的时候只剩两个词了,再分两簇为GHGG和GHGH,其中的簇GHGG就只有一个词A,那么p(A│C)可以用下面的式子算 p(A│C)=p(A│GHGG,GHG,GH,G,C)p(GHGG|GHG,GH,G,C)p(GHG|GH,G,C)p(GH|G,C)p(G|C) 其中p(A|GHGG,GHG,GH,G)是1,因为只有一个单词,代到公式(2.2)就可以得到,那么就有 p(A│C)=p(GHGG|GHG,GH,G,C)p(GHG|GH,G,C)p(GH|G,C)p(G|C) 也就是 假设再令FFF=GHH-GHG,FF=GG-GH,F=H-G,那么p(A|C)只要算这三个词与上下文C的能量函数了,确实比原来的要节省很多计算的。 对于上面的霍夫曼树来说假设G表示向右,H表示向左,那么A就是从右边开始数的第二个叶子节点,就是图中右边的三个W的中间那个。那么F,FF,FFF就是这个叶子节点路径上的三个非叶节点。 但是一个词总是会一会向左,一会向右的,也就是在根节点那里,一会是p(G|C)那么F=H-G,一会又是p(H|C)那么F=G-H,如果F在每个节点都是唯一一个值,就可以直接用一次词向量表示这个非叶节点了。这下难不倒科学家的,令F一直是等于H-G,那么一直有 并且有p(G|C)=1-p(H|C)。 这样每个非叶节点就可以用唯一一个词向量表示了。 看到这里,总该明白为啥p(A|C)要这么算了吧。再换种情况,上面的概率这个概率的计算方法是不是也是同样的道理? 总结下来,可以用下面的公式计算了 其中C表示上下文的词向量累加后的向量,qk表示从根节点下来到叶子节点的路径上的那些非叶节点,dk就是编码了,也可以说是分类,因为在霍夫曼树的每个非叶节点都只有两个孩子节点,那可以认为当wi在这个节点的左子树的叶子节点上时dk=0,否则dk=1。这样的话每个词都可以用一组霍夫曼编码来表示,就有了上面的那个式子中间的那个dk,整个p(w│Context)就可以用霍夫曼树上的若干个非叶节点和词w的霍夫曼编码来计算了。 看到这务必想明白,因为开始要讨论怎么训练了。     2.2目标函数 假设语料库是有S个句子组成的一个句子序列(顺序不重要),整个语料库有V个词,似然函数就会构建成下面的样子                                                          (2.2.1) 其中T_j表示第j个句子的词个数,极大似然要对整个语料库去做的。对数似然就会是下面的样子                               (2.2.2) 如果前面有个1/V,对数似然还有些人称为交叉熵,这个具体也不了解,就不介绍了;不用1/V的话,就是正常的极大似然的样子。 有意向的同学可以扩展到有文档的样子,这里就不介绍了。 但是对于word2vec来说,上面的似然函数得改改,变成下面的样子 其中的Cij表示上下文相加的那个词向量。对数似然就是下面的 这里就不要1/V了。 这个看起来应该比较熟悉了,很像二分类的概率输出的逻辑回归——logistic regression模型。没错了,word2vec就是这么考虑的,把在霍夫曼树向左的情况,也就是dk=0的情况认为是正类,向右就认为是负类(这里的正负类只表示两种类别之一)。这样每当出现了一个上下文C和一个词在左子树的情况,就认为得到了一个正类样本,否则就是一个负类样本,每个样本的属于正类的概率都可以用上面的参数算出来,就是,如果是向右的话,就用计算其概率。注意每个词可以产生多个样本,因为从霍夫曼树的根节点开始,每个叶子节点都产生一个样本,这个样本的label(也就是属于正类或者负类标志)可以用霍夫曼编码来产生,前面说过了,向左的霍夫曼编码dk=0,所以很自然地可以用1-dk表示每个样本label。 在这里,霍夫曼编码也变成了一个重要的东西了。 这样就好多了,问题到这也该清楚了,上面那个l(θ)就是对数似然,然后负对数似然f=-l(θ)就是需要最小化的目标函数了。     2.3解法   解法选用的是SGD,博文《在线学习算法FTRL》中说过SGD算法的一些情况。具体说来就是对每一个样本都进行迭代,但是每个样本只影响其相关的参数,跟它无关的参数不影响。对于上面来说,第j个样本的第ij个词的负对数似然是 第j个样本的第ij个词的在遇到第kij个非叶节点时的负对数似然是 计算的梯度,注意参数包括和,其中的梯度是用来计算的时候用到。另外需要注意的是logσ(x)的梯度是1-σ(x),log(1-σ(x))的梯度是-σ(x), 和 上面的Fq和Fc只是简写,有了梯度就可以对每个参数进行迭代了 同时,每个词的词向量也可以进行迭代了 注意第二个迭代的wI是代表所有的输入词的,也就是假如输入了4个词,这四个词都要根据这个方式进行迭代。第二个迭代式确实不好理解,因为这里的意思所有非叶节点上的对上下文的梯度全部加和就得到了这个词的上下文的梯度,看起来这个就是BP神经网络的误差反向传播。 论文《Hierarchical Probabilistic Neural Network Language Model》和《Three New Graphical Models for Statistical Language Modelling》中看起来也是这么样的解释,人家都是Context的几个词首尾连接得到的一个向量,对这个长向量有一个梯度,或者一个超大的V*m矩阵(m是词向量的维度),对这个矩阵每个元素有一个梯度,这些梯度自然也包括了输入词的梯度。 如果有人发现了这个做法的解释请告知。   2.4代码中的trick 如前文,c表示左右各取多少个词,代码中c是一个从0到window-1的一个数,是对每个词都随机生成的,二这个window就是用户自己输入的一个变量,默认值是5。代码实际实现的时候是换了一种方法首先生成一个0到window-1的一个数b,然后训练的词(假设是第i个词)的窗口是从第i-window+b个词开始到第i-window+b个词结束。要注意的是每个词的c都不一样的,都是随机生成的。 如果有人看过代码,就会发现,其中的q_(k_ij )在代码中用矩阵syn1表示,C_(i_j )在代码中用neu1表示。叶子节点里面的每个词向量在代码中用syn0表示,利用下标移动去读取。 核心代码如下,其中的vocab[word].code[d]就表示d_(k_ij ),其他就是迭代过程,代码是写得相当简洁啊。 代码中的419行就是计算Cij,425-428行就是计算f,也就是σ(q_(k_ij )∙C_(i_j ) )的值,432行就是累积Cij的误差,434就是更新q_(k_ij)^(n+1)。 注意上面,对每个输入词都进行了更新,更新的幅度就是432行中误差累计的结果。     三. CBOW加抽样的网络结构与使用说明 3.1网络结构与使用说明 网络结构如下 如(二)中,中间的那个隐层是把上下文累加起来的一个词向量,然后有一个矩阵R,是在训练过程中用到的临时矩阵,这个矩阵连接隐层与所有输出节点,但是这个矩阵在使用这个网络的时候不怎么用得到,这里也是没弄清楚的一个地方。每个输出节点代表一个词向量。 同样如(二)中的例子,计算这么一个概率,这里的计算方法就简单多了,就是随机从语料库里面抽取c个词,这里假设c=3,抽中了D,E,F这三个词,又假设“吃”这个词的词向量是A,那么就计算“吃”这个词的概率就用下面的公式 同样如(二)中,那句话的每个词都计算后连乘起来得到联合概率,这个概率如果大于某个阈值,就认为是正常的话;否则就认为不是自然语言,要排除掉。 这里只是说明这个网络是怎么样的例子,真正重要的始终是那些词向量。     四.CBOW加抽样的优化目标与解问题 4.1抽样方法的意义与目标函数 为啥要抽样呢?目的跟(二)中的霍夫曼树其实是一样的,都是为了节省计算量,这个计算量就是式(2.1.2)中计算 p(A|C)的概率,因为这个概率实在不好算。论文《 Distributed Representations of Words and Phrases and their Compositionality》中提到有一个叫NCE的方法可以来代替上面的那个hierarchical softmax方法(就是使用霍夫曼树的方法),但是由于word2vec只关心怎么学到高质量的词向量,所以就用了一种简单的NCE方法,称为NEG,方法的本质就是在第j个句子的第ij个词wij处使用下面的式子代替。 其中E下面的那个下标的意思是wk是符合某个分布的,在这里p_V (w)表示词频的分布。 这个式子的第二项是求K个期望,这K个期望中的每一个期望,都是在该上下文的情况下不出现这个词的期望。这里出现一个特别大的偷懒,就是认为这个期望只要抽取一个样本就能计算出来,当然,如果说遍历完整个语料库,其实还可以认为是抽取了多次实验的,因为每次抽取词的时候,是按照词频的分布来抽样的,如果抽样的次数足够多,在总体的结果上,这里计算的期望还是接近这个期望的真实值的,这个可以参考博文中RBM中计算梯度的时候的那个蒙特卡洛抽样来理解。 在这里,从代码上体现来看,就只用一个样本来估算这个期望的,所有式子被简化成了下面的形式 用这个式子取代(2.2.2)中的,就能得到CBOW加抽样的目标函数(去掉1/V的),这个目标函数也是极其像logistic regression的目标函数,其中wij是正类样本,wk是负类样本。 为了统一表示,正类样本设置一个label为1,负类样本设置label为0,每个样本的负对数似然都变成下面的方式       4.2CBOW加抽样方法的解法 解法还是用SGD,所以对一个词wij来说,这个词本身是一个正类样本,同时对这个词,还随机抽取了k个负类样本,那么每个词在训练的时候都有k+1个样本,所以要做k+1次SGD。 对于每个样本求两个梯度 和 两个梯度都有这么相似的形式实在太好了,然后开始迭代,代码里面有个奇怪的地方,就是一开的网络结构中的那个V*m的矩阵,用来保存的是每次抽中的负类样本的词向量,每一行代表一个词向量,刚好是所有词的词向量。每次抽样抽中一个词后,拿去进行迭代的(就是计算梯度什么的),就是这个矩阵中对应的那个词向量,而且这个矩阵还参与更新,就是第一个梯度实际更新的是这个矩阵里面的词向量。但总的看来,这个矩阵在迭代计算完了就丢弃了,因为最终更新的词向量,每次只有一个,就是公式一直出现的那个词wij,最终输出的,也是输入里面的词向量(在图中是最下面的输出层的那些词向量),当然这个矩阵可以认为是隐藏层跟输出层的连接矩阵。 其中w代表每个样本对应的词向量,包括wij和抽中的词向量,注意更新的是R这个连接矩阵。词向量的更新公式如下 注意每个梯度的值的计算都是拿连接矩阵R中对应的那一行来算的,这样看起来可以避免每次都更新输出层的词向量,可能是怕搞乱了吧。 4.3CBOW加抽样方法代码中的trick 随机数是自己产生的,代码里面自己写了随机数程序。 每个词都要执行negative次抽样的,如果遇到了当前词(就是label为1的词)就提前退出抽样,这个步骤就提前完成了,这个也是一个比较费解的trick。 其中前面说的R矩阵在代码中用syn1neg表示,C_(i_j )在代码中用neu1表示,同样的,叶子节点里面的每个词向量在代码中用syn0表示,利用下标移动去读取。 其中442-446就是抽样的代码了,是作者自己写的模块,然后label这个变量跟上文的label意思是一样的,f就表示σ(w∙C_(i_j ) )的值,syn1neg就保存了矩阵R每一行的值,neu1e还是累积误差,直到一轮抽样完了后再更新输入层的词向量。。 对输入层的更新模块和上面的(二)中一样的,都是更新所有的输入词。     五.Skip-gram加层次的优化目标与解问题 5.1网络结构与使用说明 网络结构如下图 其中的Wi是相应的词,词Wi与huffman树直接连接,没有隐藏层的。使用方法依然与cbow加层次的相似。 在判断“大家 喜欢 吃 好吃 的 苹果”这句话是否自然语言的时候,是这么来的,同样比如计算到了“吃”这个词,同样随机抽到的c=2,对吃这个词需要计算的东西比较多,总共要计算的概率是p(大家|吃),p(喜欢|吃),p(好吃|吃)和p(的|吃)总共四个,在计算p(大家|吃)这个概率的时候,要用到上面图中的二叉树,假设“大家”这个词在huffman树根节点的右孩子的最左边的那个节点,就是图中右数第三个叶子节点。再假设从根节点开始到这个叶子节点的路径上的三个非叶节点分别为A,B,C(从高到低排列的),“吃”这个词的词向量设为D,那么p(大家|吃)这个概率可以用下面的公式算概率 p(大家│吃)=(1-σ(A∙D))∙σ(B∙D)∙σ(C∙D) 同样的方法计算p(喜欢|吃),p(好吃|吃)和p(的|吃),再把这四个概率连乘,得到了“吃”这个词的上下文概率,注意这只是一个词的概率。 把一整句话的所有词的概率都计算出来后进行连乘,得到的就是这句话是自然语言的概率。这个概率如果大于某个阈值,就认为是正常的话;否则就认为不是自然语言,要排除掉。 再声明一下,这里只是说明这个网络是怎么样的例子,真正重要的始终是那些词向量。 5.2目标函数 假设语料库是有S个句子组成的一个句子序列(顺序不重要),整个语料库有V个词,似然函数就会构建成下面的样子         (5.2.1) 其中T_j表示第j个句子的词个数,w_(u_ij+i_j )表示词w_(i_j )左右的各c_ij个词的其中一个,注意c_ij对每个w_(i_j )都不一样的。极大似然要对整个语料库去做的。对数似然就会是下面的样子       (5.2.2) 其中的V表示整个语料库的词没有去重的总个数,整个目标函数也可以叫交叉熵,但是这里对这也不感兴趣,一般去掉。 这就涉及到计算某个词的概率了,如,这个概率变了,条件变成输入中要考察的那个词,计算条件概率的词变成了上下文的词。当然,计算方法没有变,前面介绍的huffman树的计算方法到这里是一摸一样的。 其中I表示输入的那个词,也就是(5.1)的例子中的那个词“吃”,那么w就表示例子中的“大家”;qk表示从根节点下来到“大家”这个词所在的叶子节点的路径上的非叶节点,dk就是编码了,也可以说是分类,当w在某个节点如qk的左子树的叶子节点上时dk=0,否则dk=1。 用这个式子代替掉上面的(5.2.1)中的似然函数中的,当然每个变量都对号入座,就能得到总的似然函数了。 再对这个式子求个对数,得到   再利用这个式子替换掉(5.2.2)中的就能得到总的对数似然函数,也就是目标函数,剩下的就是怎么解了。 可以注意的是,计算每个词(例中的“吃”)上下文概率的时候都要计算好几个条件概率的(例子中 p(大家|吃),p(喜欢|吃),p(好吃|吃)和p(的|吃)),这每个条件概率又是需要在huffman树上走好几个非叶节点的,每走到一个非叶节点,都需要计算一个的。可以看到,走到每一个非叶节点,在总的对数似然函数中,都类似logistic regression的一个样本,为了方便描述,就用样本和label的方式在称呼这些东西。 跟一般的logistic regression一样,每走到一个非叶节点,如果是向左走的,就定义label为1,为正样本;否则label就是0,是负样本。这样label=1-dk,每一个非叶节点都为整个问题产生了一个样本。   5.3解法 解法选用的是SGD,在处理每个样本时,对总目标函数的贡献是 计算梯度 和 更新     5.4代码中的trick   对输入词I的更新是走完整个huffman树后对整个误差一起计算的,这个误差保存在neu1e这个数组里面。 其中480-483行是计算的值,保存在f中,vocab[word].code[d]表示的就是dk的值,neu1e就保存了从根节点到叶子节点的路径上的所有非叶节点的累积误差。 这个误差反向传播就简单多了,每次都是对一个词进行更新的,就是p(w|I)中的那个w。   六.Skip-gram加抽样的优化目标与解问题   这个就简单说说吧,不清楚的看上面的。   6.1网络结构与使用说明 网络结构如下 使用说明就不说的,同样是抽样的。 如(四)中,有一个矩阵R,是在训练过程中用到的临时矩阵,这个矩阵连接隐层与所有输出节点,但是这个矩阵在使用这个网络的时候不怎么用得到,这里也是没弄清楚的一个地方。每个输出节点代表一个词向量。 同样如(五)中的例子,计算p(大家│吃)这么一个概率,这里的计算方法就简单多了,就是随机从语料库里面抽取c个词,这里假设c=3,抽中了D,E,F这三个词,又假设“吃”这个词的词向量是A,那么就计算“吃”这个词的概率就用下面的公式 同样如(五)中,那句话的每个词都计算与上下文几个词的概率(p(大家|吃),p(喜欢|吃),p(好吃|吃)和p(的|吃))后连乘起来得到词“吃”的概率,所有词的概率计算出来再连乘就是整句话是自然语言的概率了。剩下的同上。     6.2目标函数与解法 似然函数跟(5.2.1)一样的,对数似然函数跟(5.2.2)是一样的,但是计算也就是logp(w|I)的的时候不一样,论文《Distributed Representations of Words and Phrases and their Compositionality》中认为logp(w|I)可以用下面的式子 代替。 同样可以和(四)中一样,设定正负样本的概念。为了统一表示,正类样本设置一个label为1,负类样本设置label为0,每个样本的负对数似然都变成下面的方式 梯度 和 更新     6.3代码 还是每个词都要执行negative次抽样的,如果遇到了当前词(就是label为1的词)就提前退出抽样。 其中493-502就是抽样的代码,505-508是计算σ(w∙I)的值,保存在f中,syn1neg就是保存了矩阵R中的每一行的值。而neu1e还是累积这误差,直到一轮抽样完了后再更新输入层的词向量。 更新输入层还是一样。     七.一些总结 从代码看来,word2vec的作者Mikolov是个比较实在的人,那种方法效果好就用哪种,也不纠结非常严格的理论证明,代码中的trick也是很实用的,可以参考到其他地方使用。       致谢 多位Google公司的研究员无私公开的资料。 多位博主的博客资料,包括@peghoty,就是deeplearning学习群里面的皮果提。       参考文献 [1] http://techblog.youdao.com/?p=915      Deep Learning实战之word2vec,网易有道的pdf [2] http://www.zhihu.com/question/21661274/answer/19331979                @杨超在知乎上的问答《Word2Vec的一些理解》 [3] http://xiaoquanzi.net/?p=156                  hisen博客的博文 [4] Hierarchical probabilistic neural network language model. Frederic Morin and Yoshua Bengio. [5] Distributed Representations of Words and Phrases and their Compositionality T. Mikolov, I. Sutskever, K. Chen, G. Corrado, and J. Dean. [6] A neural probabilistic language model Y. Bengio, R. Ducharme, P. Vincent. [7] Linguistic Regularities in Continuous Space Word Representations. Tomas Mikolov,Wen-tau Yih,Geoffrey Zweig [8] Efficient Estimation of Word Representations in Vector Space. Tomas Mikolov,Kai Chen,Greg Corrado,Jeffrey Dean.   本文转载自:mytestmy的专栏 Leave a comment 信息抽取的关键技术和挑战 2014年6月20日nlp, 搜索引擎信息抽取smallroof 信息抽取技术对于垂直搜索引擎、决策制定等方面的应用都非常重要,本文采访了中国科学院软件研究所基础软件国家工程研究中心/计算机科学国家重点实验室副研究员韩先培博士,重点介绍了信息抽取的关键技术和挑战。 InfoQ: 能否介绍一下您的研究方向,及其应用领域? 韩先培:我的主要研究方向是信息抽取和知识库构建,具体来说就是研究如何从文本中抽取结构化知识(例如从句子“苹果发布了新编程语言Swift”中抽取 IS-A(编程语言, Swift), 发布(苹果公司,Swift)等等语义关系),分析这些知识之间的结构,并将这些知识与现有的知识库进行集成。 信息抽取技术有许多不同的用途。一种典型的应用是使用信息抽取技术构建面向特定任务的知识库(如学术论文库、商品库、旅游景点库、电影库、音乐库等等),并在此基础上实现智能知识服务(如垂直搜索引擎)。另外一种典型应用是特定目标信息的发现和识别(如发现所有与“编程语言Swift”相关的新闻)。在现在的Web中,相关的信息往往被无关的信息淹没。而信息抽取技术可以发现并整合蕴含在海量信息中的特定目标信息,为正确决策提供大量的相关情报,大大降低其中需要的人工。 InfoQ: 目前这个领域最关键的技术是什么? 韩先培:目前信息抽取领域最核心的技术还是基于统计的结构化模型,如隐马尔科夫模型(HMM),条件随机场模型(CRF),马尔科夫逻辑网络(MLN)等等。 InfoQ: 研究过程中遇到了哪些技术挑战?有没有解决方案? 韩先培:主要的技术挑战来自于两方面:第一是自然语言本身的复杂性,第二是信息抽取任务的开放属性。 自然语言本身的复杂性主要指的是:1)自然语言的歧义性,也就是一个自然语言表达在不同的上下文中通常有不同的意义(例如“苹果”在“我买了一斤苹果”和“我买了一台苹果”中有不同的意义,前面的“苹果”指的是吃的苹果,而后面的“苹果”指的是苹果电脑);2)自然语言的多样性,也就是一个意思可以以不同的说法进行表达(例如“苹果发布了新编程语言Swift”和“苹果公开了其新语言Swift”表达的是同样的意思);3)自然语言句子具有内在的语法结构,而现有自然语言技术难于完美的发现自然语言句子的内在语法结构。 信息抽取任务本身的开放性指的是:1)信息抽取面向的任务是多种多样的。例如,我们抽取的可以是药名、电影名、导演和电影之间的关系等等不同的对象; 2)信息抽取使用的网页的开放性。例如,信息抽取可以从Amazon上利用后台数据库自动生成的页面上抽取知识,也可能从百度百科这样半结构化的页面上抽取知识,当然也经常从搜狐新闻这样完全非结构化的文章上抽取知识。对不同类别的网页,使用的信息抽取技术往往并不相同。 上述问题的解决是一个长期的研究问题。目前主要的解决方案是使用弱监督或无监督技术。其中的代表性工作包括Bootstrapping技术和Distant Supervision技术。Bootstrapping技术可以从很少的种子知识出发自动抽取目标知识,而Distant Supervision技术则可以充分利用大规模知识库(如Freebase,谷歌的知识图谱等等)中的非直接监督知识构建大规模信息抽取系统。 InfoQ:大数据对信息抽取有何影响? 韩先培:对信息抽取任务来说,大数据主要的影响是“冗余性”。冗余性可以带来有两方面的好处: 1) 首先,由于冗余性的存在,一条知识会以多种不同的方式表达。这样信息抽取技术就可以专注于抽取以简单方式表达的知识,而忽略掉那些以复杂方式表达的知识; 2) 其次,冗余性可以用来验证知识。一条正确的知识通常会比错误的知识出现更多次,因此知识出现的次数就可以用来作为知识准确性的一个度量。 InfoQ:实体链接系统的如何构建?当前有没有一些比较成熟的模型? 韩先培:实体链接系统主要包括三部分:1)从名字到候选实体的对照表;2)实体的上下文知识模型;3)基于上下文知识模型的链接推理算法。目前已经有一些比较成熟的模型。 名字到候选实体的对照表包含一个名字所有可能指向的实体,例如“苹果”这个名字可能指向水果苹果,苹果公司,苹果电脑,电影苹果等等不同的实体。 实体的上下文通常表示为一个词的分布,例如苹果公司的上下文知识可以被表示为{P(iPhone) = 0.1, P(iPad)=0.1, P(乔布斯)=0.05,…},其中P(iPhone) = 0.1表示iPhone这个词出现在苹果公司上下文中的概率为 10%,而P(乔布斯)=0.05表示乔布斯出现在苹果公司周围的概率是5%,等等。 最后,推理算法确定一段文本中的名字到底指向哪一个实体。通常推理算法使用上下文的匹配程度来做决定。例如“苹果发布了iPad mini”这句话与“苹果公司”的上下文比“水果苹果”的上下文匹配程度更高,那么推理算法就确定“苹果公司”是上述句子中苹果所表达的实体。 InfoQ:您下一步的研究重点是什么? 韩先培:下一步主要研究关系抽取技术和自然语言文本上的语义推理技术。 韩先培博士简介:中国科学院软件研究所基础软件国家工程研究中心/计算机科学国家重点实验室副研究员。韩先培的研究方向是信息抽取、知识库构建,以及知识集成。在ACL、SIGIR等重要国际会议发表论文20余篇。韩先培是中国中文信息学会会员及中国中文信息学会青年工作委员会委员。 韩先培博士6月28日在百度技术沙龙演讲:实体链接:从文本到概念   本文转载自:http://www.infoq.com/cn/news/2014/06/Information-extraction Leave a comment Free/open-source machine translation software 2014年6月5日nlp机器翻译smallroof Here’s a non-exhaustive list of links to existing free/open-source machine translation systems, which I will try to complete as I find about them. To the best of my knowledge, software listed here has: § either a free license as defined by the Free Software Foundation, § or an open-source license as defined by the Open Source Initiative. Rule-based systems § Apertium, a free/open-source rule-based machine translation platform. § Matxin, a free/open-source rule-based machine translation system for Basque. § OpenLogos, a free/open-source version of the historical Logos machine translation system. § Anusaaraka, English-Hindi machine translation system. Statistical machine translation systems Decoders § Moses, a statistical machine translation system. § Marie, an n-gram-based statistical machine translation decoder. § Joshua, an open source decoder for statistical translation models based on synchronous context free grammars § Phramer, an open-source statistical phrase-based machine translation decoder § GREAT, a decoder based on stochastic finite-state transducers, which includes a training toolkit. Training translation models § Giza++ is a tool to train translation models for statistical machine translation (see also the related mkcls tool to train word classes) § Thot is a toolkit to train phrase-based models for statistical machine translation. Language models § IRSTLM, free/open-source language modelling tool to be used with Moses instead of SRILM, which is not free. § RandLM, space-efficient ngram-based language models built using randomized representations (Bloom Filters etc). § Kenneth Heafield’s software for the fast filtering of ARPA format language models to multiple vocabularies. § Holger Schwenk’s Continuous Space Language Model toolkit (CSLM) works by projecting the word indices onto a continuous space and using a probability estimator operating on this space. Scoring § Kenneth Heafield’s scripts that make it easy to score machine translation output using NIST’s BLEU and NIST, TER, and METEOR. Other software § RIA is a tool for automatic induction of transfer rules for Transfer-Based Statistical Machine Translation using dependency structures. § Chaski: Distributed phrase-based machine translation training tool based on Hadoop. Example-based machine translation systems § The Cunei machine translation platform, an example-based machine translation system. § The CMU Example-Based Machine Translation System. § The Tilburg University Phrase-based memory-based machine translation system. § The DCU OpenMaTrEx marker-driven example-based machine translation system (partially released before as Marclator) . Multi-engine machine translation / system combination § MANY: Open Source Machine Translation System Combination. § Kenneth Heafield’s multi-engine machine translation system. Aligners and translation models § Giza++: training of statistical translation models. § Anymalign, a multilingual sub-sentential aligner. § Ventsislav Zhechev’s Sub-tree aligner which can be used for the automatic generation of parallel treebanks. Web services around machine translation § Tradubi is an open-source Ajax-based web application for social translation built upon Apertium (may be tested online). Distributed machine translation § ScaleMT (no release yet, browse at the Apertium Subversion repository) is a free/open-source framework for building scalable machine translation web services. Other useful tools … that may be used to build machine translation systems § Freeling, a free/open-source suite of language analyzers. § Bitextor, an automatic bitext harvester § Foma, a finite-state machine toolkit and library § HFST, Helsinki Finite State Technology for natural-language morphologies. § VISL CG-3, the constraint grammar parser at the Visual Interactive Syntax Learning project of Syddansk Universitet: browse Subversion repository,source snapshots. 原文:http://computing.dcu.ie/~mforcada/fosmt.html 同时推荐机器翻译的一个网站:http://www.statmt.org/ Leave a comment 网络挖掘技术——微博文本特征提取 2014年5月28日nlpsmallroof 文本特征向量 经典的向量空间模型(VSM: Vector Space Model)由Salton等人于60年代提出,并成功地应用于著名的SMART文本检索系统。VSM概念简单,把对文本内容的处理简化为向量空间中的向量运算,并且它以空间上的相似度表达语义的相似度,直观易懂。当文档被表示为文档空间的向量,就可以通过计算向量之间的相似性来度量文档间的相似性。文本处理中最常用的相似性度量方式是余弦距离。文本挖掘系统采用向量空间模型,用特征词条(T1 ,T2 ,…Tn) 及其权值Wi 代表目标信息,在进行信息匹配时,使用这些特征项评价未知文本与目标样本的相关程度。特征词条及其权值的选取称为目标样本的特征提取,特征提取算法的优劣将直接影响到系统的运行效果。 设D为一个包含m个文档的文档集合,Di为第i个文档的特征向量,则有 D={D1,D2,…,Dm}, Di=(di1,di2,…,din),i=1,2,…,m 其中dij(i=1,2,…,m;j=1,2,…,n)为文档Di中第j个词条tj的权值,它一般被定义为tj在Di中出现的频率tij的函数,例如采用TFIDF函数,即dij=tij*log(N/nj)其中,N是文档数据库中文档总数,nj是文档数据库含有词条tj的文档数目。假设用户给定的文档向量为Di,未知的文档向量为Dj,则两者的相似程度可用两向量的夹角余弦来度量,夹角越小说明相似度越高。相似度的计算公式如下: 通过上述的向量空间模型,文本数据就转换成了计算机可以处理的结构化数据,两个文档之间的相似性问题转变成了两个向量之间的相似性问题。 基于统计的特征提取方法(构造评估函数) 一、各种流行算法 这类型算法通过构造评估函数,对特征集合中的每个特征进行评估,并对每个特征打分,这样每个词语都获得一个评估值,又称为权值。然后将所有特征按权值大小排序,提取预定数目的最优特征作为提取结果的特征子集。显然,对于这类型算法,决定文本特征提取效果的主要因素是评估函数的质量。 1、TF-IDF: 单词权重最为有效的实现方法就是TF*IDF, 它是由Salton在1988 年提出的。其中TF 称为词频, 用于计算该词描述文档内容的能力; IDF 称为反文档频率, 用于计算该词区分文档的能力。TF*IDF 的指导思想建立在这样一条基本假设之上: 在一个文本中出现很多次的单词, 在另一个同类文本中出现次数也会很多, 反之亦然。所以如果特征空间坐标系取TF 词频作为测度, 就可以体现同类文本的特点。另外还要考虑单词区别不同类别的能力, TF*IDF 法认为一个单词出现的文本频率越小, 它区别不同类别的能力就越大, 所以引入了逆文本频度IDF 的概念, 以TF 和IDF 的乘积作为特征空间坐标系的取值测度。 TFIDF 法是以特征词在文档d中出现的次数与包含该特征词的文档数之比作为该词的权重,即 其中, Wi表示第i个特征词的权重,TFi(t,d)表示词t在文档d中的出现频率,N表示总的文档数,DF(t)表示包含t的文档数。用TFIDF算法来计算特征词的权重值是表示当一个词在这篇文档中出现的频率越高,同时在其他文档中出现的次数越少,则表明该词对于表示这篇文档的区分能力越强,所以其权重值就应该越大。将所有词的权值排序, 根据需要可以有两种选择方式:( 1) 选择权值最大的某一固定数n 个关键词;( 2) 选择权值大于某一阈值的关键词。一些实验表示,人工选择关键词 , 4∽7 个比较合适, 机选关键词10∽15 通常具有最好的覆盖度和专指度。 TFIDF算法是建立在这样一个假设之上的:对区别文档最有意义的词语应该是那些在文档中出现频率高,而在整个文档集合的其他文档中出现频率少的词语,所以如果特征空间坐标系取TF词频作为测度,就可以体现同类文本的特点。另外考虑到单词区别不同类别的能力,TFIDF法认为一个单词出现的文本频数越小,它区别不同类别文本的能力就越大。因此引入了逆文本频度IDF的概念,以TF和IDF的乘积作为特征空间坐标系的取值测度,并用它完成对权值TF的调整,调整权值的目的在于突出重要单词,抑制次要单词。但是在本质上IDF是一种试图抑制噪音的加权 ,并且单纯地认为文本频数小的单词就越重要,文本频数大的单词就越无用,显然这并不是完全正确的。IDF的简单结构并不能有效地反映单词的重要程度和特征词的分布情况,使其无法很好地完成对权值调整的功能,所以TFIDF法的精度并不是很高。 此外,在TFIDF算法中并没有体现出单词的位置信息,对于Web文档而言,权重的计算方法应该体现出HTML的结构特征。特征词在不同的标记符中对文章内容的反映程度不同,其权重的计算方法也应不同。因此应该对于处于网页不同位置的特征词分别赋予不同的系数,然后乘以特征词的词频,以提高文本表示的效果。 2、词频方法(Word Frequency): 词频是一个词在文档中出现的次数。通过词频进行特征选择就是将词频小于某一闭值的词删除,从而降低特征空间的维数。这个方法是基于这样一个假设,即出现频率小的词对过滤的影响也较小。但是在信息检索的研究中认为,有时频率小的词含有更多的信息。因此,在特征选择的过程中不宜简单地根据词频大幅度删词。 3、文档频次方法(Document Frequency): 文档频数(Document Frequency, DF)是最为简单的一种特征选择算法,它指的是在整个数据集中有多少个文本包含这个单词。在训练文本集中对每个特征计一算它的文档频次,并且根据预先设定的阑值去除那些文档频次特别低和特别高的特征。文档频次通过在训练文档数量中计算线性近似复杂度来衡量巨大的文档集,计算复杂度较低,能够适用于任何语料,因此是特征降维的常用方法。 在训练文本集中对每个特征计算它的文档频数,若该项的DF 值小于某个阈值则将其删除,若其DF 值大于某个阈值也将其去掉。因为他们分别代表了“没有代表性”和“没有区分度”2 种极端的情况。DF 特征选取使稀有词要么不含有用信息,要么太少而不足以对分类产生影响,要么是噪音,所以可以删去。DF 的优点在于计算量很小,而在实际运用中却有很好的效果。缺点是稀有词可能在某一类文本中并不稀有,也可能包含着重要的判断信息,简单舍弃,可能影响分类器的精度。 文档频数最大的优势就是速度快,它的时间复杂度和文本数量成线性关系,所以非常适合于超大规模文本数据集的特征选择。不仅如此,文档频数还非常地高效,在有监督的特征选择应用中当删除90%单词的时候其性能与信息增益和x2 统计的性能还不相上下。DF 是最简单的特征项选取方法, 而且该方法的计算复杂度低, 能够胜任大规模的分类任务。 但如果某一稀有词条主要出现在某类训练集中,却能很好地反映类别的特征,而因低于某个设定的阈值而滤除掉,这样就会对分类精度有一定的影响。 4、互信息(Mutual Information): 互信息衡量的是某个词和类别之间的统计独立关系,某个词t和某个类别Ci传统的互信息定义如下: 互信息是计算语言学模型分析的常用方法,它度量两个对象之间的相互性。在过滤问题中用于度量特征对于主题的区分度。互信息的定义与交叉嫡近似。互信息本来是信息论中的一个概念,用于表示信息之间的关系, 是两个随机变量统计相关性的测度,使用互信息理论进行特征抽取是基于如下假设:在某个特定类别出现频率高,但在其他类别出现频率比较低的词条与该类的互信息比较大。通常用互信息作为特征词和类别之问的测度,如果特征词属于该类的话,它们的互信息量最大。由于该方法不需要对特征词和类别之问关系的性质作任何假设,因此非常适合于文本分类的特征和类别的配准工作。 特征项和类别的互信息体现了特征项与类别的相关程度, 是一种广泛用于建立词关联统计模型的标准。互信息与期望交叉熵的不同在于没有考虑特征出现的频率, 这样导致互信息评估函数不选择高频的有用词而有可能选择稀有词作为文本的最佳特征。因为对于每一主题来讲,特征t的互信息越大,说明它与该主题的共现概率越大,因此,以互信息作为提取特征的评价时应选互信息最大的若干个特征。 互信息计算的时间复杂度类似于信息增益, 互信息的平均值就是信息增益。互信息的不足之处在于得分非常受词条边缘概率的影响。 实验数据显示,互信息分类效果最差,其次是文档频率、CC 统计,CHI 统计分类效果最好。 对互信息而言,提高分类精度的方法有:1) 可以增加特征空间的维数,以提取足够多的特征信息,这样就会带来了时间和空间上的额外开销;2) 根据互信息函数的定义,认为这些低频词携带着较为强烈的类别信息,从而对它们有不同程度的倚重. 当训练语料库没有达到一定规模的时候,特征空间中必然会存在大量的出现文档频率很低(比如低于3 次) 的词条,他们较低的文档频率导致了他们必然只属于少数类别. 但是从抽取出来的特征词观察发现,大多数为生僻词,很少一部分确实带有较强的类别信息,多数词携带少量的类别信息,甚至是噪音词. 5、期望交叉熵(Expected Cross Entropy): 交叉嫡与信息量的定义近似,其公式为: 交叉嫡 ,也称KL距离。它反映了文本主题类的概率分布和在出现了某特定词汇的条件下文本主题类的概率分布之间的距离,词汇w的交叉嫡越大,对文本主题类分布的影响也越大。它与信息增益唯一的不同之处在于没有考虑单词未发生的情况,只计算出现在文本中的特征项。如果特征项和类别强相关, P ( Ci | w )就大,若P( Ci) 又很小的话,则说明该特征对分类的影响大。 交叉熵反映了文本类别的概率分布和在出现了某个特定词的条件下文本类别的概率分布之间的距离, 特征词t 的交叉熵越大, 对文本类别分布的影响也越大。熵的特征选择效果都要优于信息增益。 6、二次信息熵(QEMI): 将二次熵函数应用于互信息评估方法中,取代互信息中的Shannon熵,就形成了基于二次熵的互信息评估函数。基于二次熵的互信息克服了互信息的随机性,是一个确定的量,因此可以作为信息的整体测度,另外它还比互信息最大化的计算复杂度要小,所以可以比较高效地用在基于分类的特征选取上。二次熵的概念是在广义信息论中提出的。 7、信息增益方法(Information Gain): 信息增益方法是机器学习的常用方法,在过滤问题中用于度量已知一个特征是否出现于某主题相关文本中对于该主题预测有多少信息。通过计算信息增益可以得到那些在正例样本中出现频率高而在反例样本中出现频率低的特征,以及那些在反例样本中出现频率高而在正例样本中出现频率低的特征。信息增益G(w)的训算公式如下: 其中P(w)是词w出现的概率,P(Ci)是取第i个目录时的概率,P(C,|w ) 是假定w出现时取第i个目录的概率。 信息增益是一种基于熵的评估方法,涉及较多的数学理论和复杂的熵理论公式,定义为某特征项为整个分类所能提供的信息量,不考虑任何特征的熵与考虑该特征后的熵的差值。他根据训练数据,计算出各个特征项的信息增益,删除信息增益很小的项,其余的按照信息增益从大到小排序。 信息增益是信息论中的一个重要概念, 它表示了某一个特征项的存在与否对类别预测的影响, 定义为考虑某一特征项在文本中出现前后的信息熵之差。某个特征项的信息增益值越大, 贡献越大, 对分类也越重要。信息增益方法的不足之处在于它考虑了特征未发生的情况。特别是在类分布和特征值分布高度不平衡的情况下, 绝大多数类都是负类, 绝大多数特征都不出现。此时的函数值由不出现的特征决定, 因此, 信息增益的效果就会大大降低。信息增益表现出的分类性能偏低。因为信息增益考虑了文本特征未发生的情况,虽然特征不出现的情况肿可能对文本类别具有贡献,但这种贡献往往小于考虑这种情况时对特征分值带来的干扰。 8、x2统计量方法: x2统计量用于度量特征w和主题类C之间的独立性。而表示除w以外的其他特征,C表示除C以外的其他主题类,那么特征w和主题类C的关系有以下四种 情况: ,用A, B, C, D表示这四种情况的文档频次,总的文档数N=A+B+C+D,扩统计量的计算公式如下: 当特征w和主题类C之间完全独立的时候,x2统计量为0。x2统计量和互信息的差别在于它是归一化的统计量,但是它对低频特征的区分效果也不好。X2 统计得分的计算有二次复杂度, 相似于互信息和信息增益。在 X2 统计和互信息之间主要的不同在于 X2 是规格化评价, 因而 X2 评估分值对在同类中的词是可比的, 但是 X2 统计对于低频词来说是不可靠的。 利用x2 统计方法来进行特征抽取是基于如下假设:在指定类别文本中出现频率高的词条与在其他类别文本中出现频率比较高的词条,对判定文档是否属于该类别都是很有帮助的. 采用x2估计特征选择算法的准确率在实验中最高,其分类效果受训练集影响较小,比较稳定。而且在对文教类和政治类存在类别交叉现象的文本进行分类时,采用x2估计的分类系统表现出了优于其它方法的分类性能。X2估计的可靠性较好,便于对程序的控制,无需因训练集的改变而人为的调节特征阀值的大小。 9、文本证据权(The Weight of Evidence forText): 文本证据权衡量类的概率和给定特征时类的条件概率之间的差别。 10、优势率(Odds Ratio): 优势率只适用于二元分类的情况,其特点是只关心文本特征对于目标类的分值。Pos表示目标类,neg表示非目标类。 11、遗传算法(Genetic Algorithm, GA): 文本实际上可以看作是由众多的特征词条构成的多维空间,而特征向量的选择就是多维空间中的寻优过程,因此在文本特征提取研究中可以使用高效寻优算法。遗传算法(Genetic Algorithm, GA)是一种通用型的优化搜索方法,它利用结构化的随机信息交换技术组合群体中各个结构中最好的生存因素,复制出最佳代码串,并使之一代一代地进化,最终获得满意的优化结果。在将文本特征提取问题转化为文本空间的寻优过程中,首先对Web文本空间进行遗传编码,以文本向量构成染色体,通过选择、交叉、变异等遗传操作,不断搜索问题域空间,使其不断得到进化,逐步得到Web文本的最优特征向量。 基于协同演化的遗传算法不是使用固定的环境来评价个体,而是使用其他的个体来评价特定个体。个体优劣的标准不是其生存环境以外的事物,而是由在同一生存竞争环境中的其他个体来决定。协同演化的思想非常适合处理同类文本的特征提取问题。由于同一类别文本相互之间存在一定相关性,因而各自所代表的那组个体在进化过程中存在着同类之间的相互评价和竞争。因此,每个文本的特征向量,即该问题中的个体,在不断的进化过程中,不仅受到其母体(文本)的评价和制约,而且还受到种族中其他同类个体的指导。所以,基于协同演化的遗传算法不仅能反映其母体的特征,还能反映其他同类文本的共性,这样可以有效地解决同一主题 众多文本的集体特征向量的提取问题,获得反映整个文本集合某些特征的最佳个体。 12、主成分分析法(Principal Component Analysis,PCA): 它不是通过特征选取的方式降维的,而是通过搜索最能代表原数据的正交向量,创立一个替换的、较小的变量集来组合属性的精华,原数据可以投影到这个较小的集合。PCA由于其处理方式的不同又分为数据方法和矩阵方法。矩阵方法中,所有的数据通过计算方差一协方差结构在矩阵中表示出来,矩阵的实现目标是确定协方差矩阵的特征向量,它们和原始数据的主要成分相对应。在主成分方法中,由于矩阵方法的复杂度在n很大的情况 以二次方增长,因此人们又开发使用了主要使用Hebbian学习规则的PCA神经网络方法。 主成分分析法是特征选取常用的方法之一,它能够揭示更多有关变量_丰要方向的信息。但它的问题在于矩阵方法中要使用奇异值分解对角化矩阵求解方差一协方差。 13、模拟退火算法(Simulating Anneal,SA): 特征选取可以看成是一个组合优化问题,因而可以使用解决优化问题的方法来解决特征选取的问题。模拟退火算法(Simulating Anneal,SA)就是其中一种方法。 模拟退火算法是一个很好的解决优化问题的方法,将这个方法运用到特征选取中,理论上能够找到全局最优解,但在初始温度的选取和邻域的选取t要恰当,必须要找到一个比较折中的办法,综合考虑解的性能和算法的速度。 14、N—Gram算法 它的基本思想是将文本内容按字节流进行大小为N的滑动窗口操作,形成长度为N的字节片段序列。每个字节片段称为gram,对全部gram的出现频度进行统计,并按照事先设定的阈值进行过滤,形成关键gram列表,即为该文本的特征向量空间,每一种gram则为特征向量维度。由于N—Gram算法可以避免汉语分词的障碍,所以在中文文本处理中具有较高的实用性。中文文本处理大多采用双字节进行分解,称之为bi-gram。但是bigram切分方法在处理20%左右的中文多字词时,往往产生语义和语序方面的偏差。而对于专业研究领域,多字词常常是文本的核心特征,处理错误会导致较大的负面影响。基于N—Gram改进的文本特征提取算法[2],在进行bigram切分时,不仅统计gram的出现频度,而且还统计某个gram与其前邻gram的情况,并将其记录在gram关联矩阵中。对于那些连续出现频率大 于事先设定阈值的,就将其合并成为多字特征词。这样通过统计与合并双字特征词,自动产生多字特征词,可以较好地弥补N—Gram算法在处理多字词方面的缺陷。 15、各种方法的综合评价 上述几种评价函数都是试图通过概率找出特征与主题类之间的联系,信息增益的定义过于复杂,因此应用较多的是交叉嫡和互信息。其中互信息的效果要好于交又嫡,这是因为互信息是对不同的主题类分别抽取特征词,而交叉嫡跟特征在全部主题类内的分布有关,是对全部主题类来抽取特征词。这些方法,在英文特征提取方面都有各自的优势,但用于中文文本,并没有很高的效率。主要有2 个方面的原因:1) 特征提取的计算量太大,特征提取效率太低,而特征提取的效率直接影响到整个文本分类系统的效率。2) 经过特征提取后生成的特征向量维数太高,而且不能直接计算出特征向量中各个特征词的权重。 目前使用评估函数进行特征选取越来越普遍,特征选取算法通过构造一个评估函数的方法,选取预定数目的最佳特征作为特征子集的结果。在几种评估方法中,每一种方法都有一个选词标准,遵从这个标准,从文本集的所有词汇中选取出有某个限定范围的特征词集。因为评估函数的构造不是特别复杂,适用范围又很广泛,所以越来越多的人们喜欢使用构造评估函数来进行特征的选取。 这些评估函数在Web文本挖掘中被广泛使用,特征选择精度普遍达到70%~80%,但也各自存在缺点和不足。例如,“信息增益”考虑了单词未发生的情况,对判断文本类别贡献不大,而且引入不必要的干扰,特别是在处理类分布和特征值分布高度不平衡的数据时选择精度下降。“期望交叉熵”与“信息增益”的唯一不同就是没有考虑单词未发生的情况,因此不论处理哪种数据集,它的特征选择精度都优于“信息增益”。与“期望交叉熵”相比,“互信息”没有考虑单词发生的频度,这是一个很大的缺点,造成“互信息”评估函数经常倾向于选择稀有单词。“文本证据权”是一种构造比较新颖的评估函数,它衡量一般类的概率和给定特征类的条件概率之间的差别,这样在文本处理中,就不需要计算W的所有可能值,而仅考虑W在文本中出现的情况。“优势率”不像前面所述的其他评估函数将所有类同等对待,它只关心目标类值,所以特别适用于二元分类器,可以尽可能多地识别正类,而不关心识别出负类。 从考虑文本类间相关性的角度,可以把常用的评估函数分为两类,即类间不相关的和类间相关的。“文档频数”(DF)是典型的类间不相关评估函数, DF的排序标准是依据特征词在文档中出现篇数的百分比,或称为篇章覆盖率。这种类型的评估函数,为了提高区分度,要尽量寻找篇章覆盖率较高的特征词,但又要避免选择在各类文本中都多次出现的无意义高频词,因此类间不相关评估函数对停用词表的要求很高。但是 ,很难建立适用于多个类的停用词表,停用词不能选择太多,也不能选择太少,否则都将会影响特征词的选择。同时,类间不相关评估函数还存在一个明显的缺点,就是对于特征词有交叉的类别或特征相近的类别,选择的特征词会出现很多相似或相同的词条,造成在特定类别间的区分度下降。类间相关的评估函数,例如期望交叉熵、互信息、文本证据权等,综合考虑了词条在已定义的所有类别中的出现情况,可以通过调整特征词的权重,选择出区分度更好的特征,在一定程度上提高了相近类别的区分度。但是,该区分度的提高仅体现在已定义的类别间,而对于尚未定义的域外类别,类间相关评估函数的选择效果也不理想。因此,在评估函数选择问题上,提高对域外类别文本的区分度是十分重要的研究课题。 传统的特征选择方法大多采用以上各评估函数进行特征权重的计算,由于这些评估函数是基于统计学的,其中一个主要缺陷就是需要用一个很庞大的训练集才能获得几乎所有的对分类起关键作用的特征.这需要消耗大量的时间和空间资源,况且,构建这样一个庞大的训练集也是一项十分艰巨的工作。然而,在现实应用中,考虑到工作效率,不会也没有足够的资源去构建一个庞大的训练集,这样的结果就是:被选中的甚至是权重比较高的特征,可能对分类没有什么用处,反而会干涉到正确的分类;而真正有用的特征却因为出现的频率低而获得 较低的权重,甚至在降低特征空间维数的时候被删除掉了。 基于评估函数的特征提取方法是建立在特征独立的假设基础上,但在实际中这个假设是很难成立的,因此需要考虑特征相关条件下的文本特征提取方法。 二、影响特征词权值的因素分析 1、词频 文本内空中的中频词往往具有代表性,高频词区分能力较小,而低频词或者示出现词也常常可以做为关键特征词。所以词频是特征提取中必须考虑的重要因素,并且在不同方法中有不同的应用公式。 2、词性 汉语言中,能标识文本特性的往往是文本中的实词,如名词、动词、形容词等。而文本中的一些虚词,如感叹词、介词、连词等,对于标识文本的类别特性并没有贡献,也就是对确定文本类别没有意义的词。如果把这些对文本分类没有意思的虚词作为文本特征词,将会带来很大噪音,从而直接降低文本分类的效率和准确率。因此,在提取文本特征时,应首先考虑剔除这些对文本分类没有用处的虚 词,而在实词中,又以名词和动词对于文本的类别特性的表现力最强,所以可以只提取文本中的名词和动词作为文本的一级特征词。 2、文档频次 出现文档多的特征词,分类区分能力较差,出现文档少的特征词更能代表文本的不同主题。 2、标题 标题是作者给出的提示文章内容的短语,特别在新闻领域,新闻报道的标题一般都要求要简练、醒目,有不少缩略语,与报道的主要内容有着重要的联系,对摘要内容的影响不可忽视。统计分析表明,小标题的识别有助于准确地把握文章的主题。主要体现在两个方面:正确识别小标题可以很好地把握文章的整体框架,理清文章的结构层次;同时,小标题本身是文章中心内容的高度概括。因此,小标题的正确识别能在一定程度上提高文摘的质量。 3、位置 美国的EE.Baxendale的调查结果显示:段落的论题是段落首句的概率为85% , 是段落末句的概率为7% 。而且新闻报道性文章的形式特征决定了第一段一般是揭示文章主要内容的。因此,有必要提高处于特殊位置的句子权重,特别是报道的首旬和末句。但是这种现象又不是绝对的,所以,我们不能认为首句和末句就一定是所要摘要的内容,因此可以考虑一个折衷的办法,即首句和末句的权重上可通过统计数字扩大一个常数倍。首段、末段、段首、段尾、标题和副标题、子标题等处的句子往往在较大程度上概述了文章的内容。对于出现在这些位置的句子应该加大权重。 Internet上的文本信息大多是HTML结构的,对于处于Web文本结构中不同位置的单词,其相应的表示文本内容或区别文本类别的能力是不同的,所以在单词权值中应该体现出该词的位置信息。 4、句法结构 句式与句子的重要性之间存在着某种联系,比如摘要中的句子大多是陈述句,而疑问句、感叹句等则不具内容代表性。而通常“总之”、“综上所述”等一些概括性语义后的句子,包含了文本的中心内容。 5、专业词库 通用词库包含了大量不会成为特征项的常用词汇,为了提高系统运行效率,系统根据挖掘目标建立专业的分词表,这样可以在保证特征提取准确性的前提下,显著提高系统的运行效率。 用户并不在乎具体的哪一个词出现得多,而在乎泛化的哪一类词出现得多。真正起决定作用的是某一类词出现的总频率。基于这一原理,我们可以先将词通过一些方法依主题领域划分为多个类,然后为文本提取各个词类的词频特征,以完成对文本的分类。 可以通过人工确定领域内的关键词集。 6、信息熵 熵(Entropy)在信息论中是一个非常重要的概念 ‘ ,它是不确定性的一种度量。信息熵方法的基本目的是找出某种符号系统的信息量和多余度之间的关系,以便能用最小的成本和消耗来实现最高效率的数据储存、管理和传递。信息熵是数学方法和语言文字学的结合,其定义为:设x是取有限个值的随机变量,各个取值出现的概率为 则 的熵为 其中,底数n可以为任意正数,并规定当 时, =0。在式(3)中,对数底a决定了熵的单位,如a=2、e、10,熵的单位分别为Bit,nat,Hartley。在我们的研究论文中,均取a=2。熵具有最大值和最小值 ,由熵的定义公式可以看出,当每个值出现的概率相等时,即当 时 这时熵函数达到最大值 ,记为最大熵 。其中Pt ≥0,并且 。而当 n)时,熵值最小,Entropy(X)=0。 我们将可以将信息论中的熵原理引入到特征词权重的计算中。 7、文档、词语长度 一般情况下,词的长度越短,其语义越泛。一般来说, 中文中词长较长的词往往反映比较具体、下位的概念, 而短的词常常表示相对抽象、上位的概念一般说来, 短词具有较高的频率和更多的含义, 是面向功能的;而长词的频率较低, 是面向内容的, 增加长词的权重, 有利于词汇进行分割, 从而更准确地反映出特征词在文章中的重要程度。词语长度通常不被研究者重视。但是本文在实际应用中发现,关键词通常是一些专业学术组合词汇,长度较一般词汇长。考虑候选词的长度,会突出长词的作用。长度项也可以使用对数函数来平滑词汇间长度的剧烈差异。通常来说,长词汇含义更明确,更能反映文本主题,适合作为关键词,因此将包含在长词汇中低于一定过滤阈值的短词汇进行了过滤。所谓过滤阈值 ,就是指进行过滤短词汇的后处理时,短词汇的权重和长词汇的权重的比的最大值。如果低于过滤阈值,则过滤短词汇,否则保留短词汇。 根据统计,二字词汇多是常用词,不适合作为关键词,因此对实际得到的二字关键词可以做出限制。比如,抽取5 个关键词,本文最多允许3 个二字关键词存在。这样的后处理无疑会降低关键词抽取的准确度和召回率,但是同候选词长度项的运用一样,人工评价效果将会提高。 8、词语间关联 9、单词的区分能力 在TF*IDF 公式的基础上, 又扩展了一项单词的类区分能力。新扩展的项用于描述单词与各个类别之间的相关程度。 10、词语直径(Diameter ( t) ) 词语直径是指词语在文本中首次出现的位置和末次出现的位置之间的距离。词语直径是根据实践提出的一种统计特征。根据经验,如果某个词汇在文本开头处提到,结尾又提到,那么它对该文本来说,是个很重要的词汇。不过统计结果显示,关键词的直径分布出现了两极分化的趋势,在文本中仅仅出现了1 次的关键词占全部关键词的14.184 %。所以词语直径是比较粗糙的度量特征。 11、首次出现位置(FirstLoc ( t) ) Frank 在Kea 算法中使用候选词首次出现位置作为Bayes 概率计算的一个主要特征,他称之为距离(Distance)。简单的统计可以发现,关键词一般在文章中较早出现,因此出现位置靠前的候选词应该加大权重。实验数据表明,首次出现位置和词语直径两个特征只选择一个使用就可以了。由于文献数据加工问题导致中国学术期刊全文数据库的全文数据不仅包含文章本身,还包含了作者、作者机构以及引文信息,针对这个特点,使用首次出现位置这个特征,可以尽可能减少全文数据的附加信息造成的不良影响。 12、词语分布偏差(Deviation ( t) ) 词语分布偏差所考虑的是词语在文章中的统计分布。在整篇文章中分布均匀的词语通常是重要的词汇。词语的分布偏差计算公式如下: 其中,CurLoc ( tj ) 是词汇 t 在文章中第j 次出现的位置;MeanLoc ( t ) 是词汇t 在文章中出现的平均位置。 13、特征提取的一般步骤 一、 候选词的确定 (1) 分词(词库的扩充) 尽管现在分词软件的准确率已经比较高了,但是,它对专业术语的识别率还是很好,所以,为了进一步提高关键词抽取的准确率,我们有必要在词库中添加了一个专业词库以保证分词的质量。 (2) 停用词的过滤 停用词是指那些不能反映主题的功能词。例如:“的”、“地”、“得”之类的助词,以及像“然而”、“因此”等只能反映句子语法结构的词语,它们不但不能反映文献的主题,而且还会对关键词的抽取造成干扰,有必要将其滤除。停用词确定为所有虚词以及标点符号。 (3) 记录候选词在文献中的位置 为了获取每个词的位置信息,需要确定记录位置信息的方式以及各个位置的词在反映主题时的相对重要性。根据以往的研究结果,初步设定标题的位置权重为5,摘要和结论部分为3,正文为1,同时,把标题、摘要和结论、正文分别称为5 区、3 区和1 区。确定了文章各个部分的位置权重之后,就可以用数字标签对每个位置做一个标记。做法是:在标题的开头标上数字5,在摘要和结论部分的段首标上数字3,在正文的段首标上数字1,这样,当软件逐词扫描统计词频时,就可以记录每个词的位置信息。 二、词语权重计算 (1) 词语权值函数的构造(见各不同算法) (2) 关键词抽取 候选词的权值确定以后,将权值排序,取前n个词作为最后的抽取结果。   本文转载自:所以燃 One comment so far Query意图分析:记一次完整的机器学习过程(scikit learn library学习笔记) 2014年5月25日nlp, 搜索引擎, 机器学习Python, Scikit Learnsmallroof 所谓学习问题,是指观察由n个样本组成的集合,并根据这些数据来预测未知数据的性质。 学习任务(一个二分类问题): 区分一个普通的互联网检索Query是否具有某个垂直领域的意图。假设现在有一个O2O领域的垂直搜索引擎,专门为用户提供团购、优惠券的检索;同时存在一个通用的搜索引擎,比如百度,通用搜索引擎希望能够识别出一个Query是否具有O2O检索意图,如果有则调用O2O垂直搜索引擎,获取结果作为通用搜索引擎的结果补充。 我们的目的是学习出一个分类器(classifier),分类器可以理解为一个函数,其输入为一个Query,输出为0(表示该Query不具有o2o意图)或1(表示该Query具有o2o意图)。 特征提取: 要完成这样一个学习任务,首先我们必须找出决定一个Query是否具有O2O意图的影响因素,这些影响因素称之为特征(feature)。特征的好坏很大程度上决定了分类器的效果。在机器学习领域我们都知道特征比模型(学习算法)更重要。(顺便说一下,工业界的人都是这么认为的,学术界的人可能不以为然,他们整天捣鼓算法,发出来的文章大部分都没法在实际中应用。)举个例子,如果我们的特征选得很好,可能我们用简单的规则就能判断出最终的结果,甚至不需要模型。比如,要判断一个人是男还是女(人类当然很好判断,一看就知道,这里我们假设由计算机来完成这个任务,计算机有很多传感器(摄像头、体重器等等)可以采集到各种数据),我们可以找到很多特征:身高、体重、皮肤颜色、头发长度等等。因为根据统计我们知道男人一般比女人重,比女人高,皮肤比女人黑,头发比女人短;所以这些特征都有一定的区分度,但是总有反例存在。我 们用最好的算法可能准确率也达不到100%。假设计算机还能够读取人的身份证号码,那么我们可能获得一个更强的特征:身份证号码的倒数第二位是否是偶数。根据身份证编码规则,我们知道男性的身份证号码的倒数第二位是奇数,女生是偶数。因此,有了这个特征其他的特征都不需要了,而且我们的分类器也很简单,不需要复杂的算法。 言归正传,对于O2O Query意图识别这一学习任务,我们可以用的特征可能有:Query在垂直引擎里能够检索到的结果数量、Query在垂直引擎里能够检索到的结果的类目困惑度(perplexity)(检索结果的类目越集中说明其意图越强)、Query能否预测到特征的O2O商品类目、Query是否包含O2O产品词或品牌词、Query在垂直引擎的历史展现次数(PV)和点击率(ctr)、Query在垂直引擎的检索结果相关性等等。 特征表示: 特征表示是对特征提取结果的再加工,目的是增强特征的表示能力,防止模型(分类器)过于复杂和学习困难。比如对连续的特征值进行离散化,就是一种常用的方法。这里我们以“Query在垂直引擎里能够检索到的结果数量”这一特征为例,简要介绍一下特征值分段的过程。首先,分析一下这一维特征的分布情况,我们对这一维特征值的最小值、最大值、平均值、方差、中位数、三分位数、四分位数、某些特定值(比如零值)所占比例等等都要有一个大致的了解。获取这些值,python编程语言的numpy模块有很多现成的函数可以调用。最好的办法就是可视化,借助python的matplotlib工具我们可以很容易地划出数据分布的直方图,从而判断出我们应该对特征值划多少个区间,每个区间的范围是怎样的。比如说我们要对“结果数量”这一维特征值除了“0”以为的其他值均匀地分为10个区间,即每个区间内的样本数大致相同。“0”是一个特殊的值,因此我们想把它分到一个单独的区间,这样我们一共有11个区间。python代码实现如下: import numpy as np def bin(bins): assert isinstance(bins, (list, tuple)) def scatter(x): if x == 0: return 0 for i in range(len(bins)): if x <= bins[i]: return i + 1 return len(bins) return np.frompyfunc(scatter, 1, 1) data = np.loadtxt("D:\query_features.xls", dtype='int') # descrete o2o_result_num = data[:,0] o2o_has_result = o2o_result_num[o2o_result_num > 0] bins = [ np.percentile(o2o_has_result, x) for x in range(10, 101, 10) ] data[:,0] = bin(bins)(o2o_result_num) 我们首先获取每个区间的起止范围,即分别算法特征向量的10个百分位数,并依此为基础算出新的特征值(通过bin函数,一个numpy的universal function)。 训练数据: 这里我们通过有监督学习的方法来拟合分类器模型。所谓有监督学习是指通过提供一批带有标注(学习的目标)的数据(称之为训练样本),学习器通过分析数据的规律尝试拟合出这些数据和学习目标间的函数,使得定义在训练集上的总体误差尽可能的小,从而利用学得的函数来预测未知数据的学习方法。注意这不是一个严格的定义,而是我根据自己的理解简化出来的。 一批带有标注的训练数据从何而来,一般而言都需要人工标注。我们从搜索引擎的日志里随机采集一批Query,并且保证这批Query能够覆盖到每维特征的每个取值(从这里也可以看出为什么要做特征分区间或离散化了,因为如不这样做我们就不能保证能够覆盖到每维特征的每个取值)。然后,通过人肉的方法给这边 Query打上是否具有O2O意图的标签。数据标注是一个痛苦而漫长的过程,需要具有一定领域知识的人来干这样的活。标注质量的好坏很有可能会影响到学习到的模型(这里指分类器)在未知Query上判别效果的好坏。即正确的老师更可能教出正确的学生,反之,错误的老师教坏学生的可能性越大。在我自己标注数据的过程中,发现有一些Query的O2O意图比较模棱两可,导致我后来回头看的时候总觉得自己标得不对,反反复复修改了好几次。 选择模型: 在我们的问题中,模型就是要学习的分类器。有监督学习的分类器有很多,比如决策树、随机森林、逻辑回归、梯度提升、SVM等等。如何为我们的分类问题选择合适的机器学习算法呢?当然,如果我们真正关心准确率,那么最佳方法是测试各种不同的算法(同时还要确保对每个算法测试不同参数),然后通过交叉验证选择最好的一个。但是,如果你只是为你的问题寻找一个“足够好”的算法,或者一个起点,也是有一些还不错的一般准则的,比如如果训练集很小,那么高偏差/低方差分类器(如朴素贝叶斯分类器)要优于低偏差/高方差分类器(如k近邻分类器),因为后者容易过拟合。然而,随着训练集的增大,低偏差/高方差分类器将开始胜出(它们具有较低的渐近误差),因为高偏差分类器不足以提供准确的模型。 这里我们重点介绍一次完整的机器学习全过程,所以不花大篇幅在模型选择的问题上,推荐大家读一些这篇文章:《如何选择机器学习分类器?》。 通过交叉验证拟合模型: 机器学习会学习数据集的某些属性,并运用于新数据。这就是为什么习惯上会把数据分为两个集合,由此来评价算法的优劣。这两个集合,一个叫做训练集(train data),我们从中获得数据的性质;一个叫做测试集(test data),我们在此测试这些性质,即模型的准确率。将一个算法作用于一个原始数据,我们不可能只做出随机的划分一次train和test data,然后得到一个准确率,就作为衡量这个算法好坏的标准。因为这样存在偶然性。我们必须好多次的随机的划分train data和test data,分别在其上面算出各自的准确率。这样就有一组准确率数据,根据这一组数据,就可以较好的准确的衡量算法的好坏。交叉验证就是一种在数据量有限的情况下的非常好evaluate performance的方法。 1 from sklearn import cross_validation 2 from sklearn import tree 3 from sklearn import ensemble 4 from sklearn import linear_model 5 from sklearn import svm 6 7 lr = linear_model.LogisticRegression() 8 lr_scores = cross_validation.cross_val_score(lr, train_data, train_target, cv=5) 9 print("logistic regression accuracy:") 10 print(lr_scores) 11 12 clf = tree.DecisionTreeClassifier(criterion='entropy', max_depth=8, min_samples_split=5) 13 clf_scores = cross_validation.cross_val_score(clf, train_data, train_target, cv=5) 14 print("decision tree accuracy:") 15 print(clf_scores) 16 17 rfc = ensemble.RandomForestClassifier(criterion='entropy', n_estimators=3, max_features=0.5, min_samples_split=5) 18 rfc_scores = cross_validation.cross_val_score(rfc, train_data, train_target, cv=5) 19 print("random forest accuracy:") 20 print(rfc_scores) 21 22 etc = ensemble.ExtraTreesClassifier(criterion='entropy', n_estimators=3, max_features=0.6, min_samples_split=5) 23 etc_scores = cross_validation.cross_val_score(etc, train_data, train_target, cv=5) 24 print("extra trees accuracy:") 25 print(etc_scores) 26 27 gbc = ensemble.GradientBoostingClassifier() 28 gbc_scores = cross_validation.cross_val_score(gbc, train_data, train_target, cv=5) 29 print("gradient boosting accuracy:") 30 print(gbc_scores) 31 32 svc = svm.SVC() 33 svc_scores = cross_validation.cross_val_score(svc, train_data, train_target, cv=5) 34 print("svm classifier accuracy:") 35 print(svc_scores) 上面的代码我们尝试同交叉验证的方法对比五种不同模型的准确率,结果如下: 1 logistic regression accuracy: 2 [ 0.76953125 0.83921569 0.85433071 0.81102362 0.83858268] 3 decision tree accuracy: 4 [ 0.73828125 0.8 0.77559055 0.71653543 0.83464567] 5 random forest accuracy: 6 [ 0.75 0.76862745 0.76377953 0.77165354 0.80314961] 7 extra trees accuracy: 8 [ 0.734375 0.78039216 0.7992126 0.76377953 0.79527559] 9 gradient boosting accuracy: 10 [ 0.7578125 0.81960784 0.83464567 0.80708661 0.84251969] 11 svm classifier accuracy: 12 [ 0.703125 0.78431373 0.77952756 0.77952756 0.80708661] 在O2O意图识别这个学习问题上,逻辑回归分类器具有最好的准确率,其次是梯度提升分类器;决策树和随机森林在我们的测试结果中并没有体现出明显的差异,可能是我们的特殊数量太少并且样本数也较少的原因;另外大名典典的SVM的表现却比较让人失望。总体而言,准确率只有82%左右,分析其原因,一方面我们实现的特征数量较少;另一方面暂时未能实现区分能力强的特征。后续会对此持续优化。 由于逻辑回归分类器具有最好的性能,我们决定用全部是可能训练数据来拟合之。 lr = lr.fit(train_data, train_target) 模型数据持久化: 学到的模型要能够在将来利用起来,就必须把模型保存下来,以便下次使用。同时,数据离散化或数据分区的范围数据也要保存下来,在预测的时候同样也需要对特征进行区间划分。python提供了pickle模块用来序列号对象,并保存到硬盘上。同时,scikit-learn库也提供了更加高效的模型持久化模块,可以直接使用。 1 from sklearn.externals import joblib 2 joblib.dump(lr, 'D:\lr.model') 3 import pickle 4 bin_file = open(r'D:\result_bin.data', 'wb') 5 pickle.dump(bins, bin_file) 6 bin_file.close() 分类器的使用: 现在大功告成了,我们需要做的就是用学习到的分类器来判断一个新的Query到底是否具有O2O意图。因为我们分类器的输入是Query的特征向量,而不是Query本身,因此我们需要实现提取好Query的特征。假设我们已经离线算好了每个Query的特征,现在使用的时候只需要将其加载进内场即可。分类器使用的过程首先是从硬盘读取模型数据和Query特征,然后调用模型对Query进行预测,输出结果。 1 # load result bin data and model 2 bin_file = open(r'D:\result_bin.data', 'rb') 3 bins = pickle.load(bin_file) 4 bin_file.close() 5 6 lr = joblib.load('D:\lr.model') 7 8 # load data 9 query = np.genfromtxt(r'D:\o2o_query_rec\all_query', dtype='U2', comments=None, converters={0: lambda x: str(x, 'utf-8')}) 10 feature = np.loadtxt(r'D:\o2o_query_rec\all_features', dtype='int', delimiter='\001') 11 12 # descrite 13 feature[:,0] = bin(bins)(feature[:,0]) 14 feature[:,1] = ufunc_segment(feature[:,1]) 15 16 # predict 17 result = lr.predict(feature) 18 19 # save result 20 #np.savetxt(r'D:\o2o_query_rec\classify_result.txt', np.c_[query, result], fmt=u"%s", delimiter="\t") 21 result_file = open(r'D:\o2o_query_rec\classify_result.txt', 'w') 22 i = 0 23 for q in query: 24 result_file.write('%s\t%d\n' % (q, result[i])) 25 i += 1 26 result_file.close() 需要注意的是我们Query的编码是UTF-8,load的时候需要做相应的转换。另外,在python 3.3版本,numpy的savetxt函数并不能正确保持UTF-8格式的中文Query(第20行注释掉的代码输出的Query都变成了bytes格式的),如果小伙伴们有更好的办法能够解决这个问题,请告诉我,谢谢!   原文:zero_learner Leave a comment 中文分词器性能比较 2014年5月24日nlp, 搜索引擎分词smallroof 摘要:本篇是本人在Solr的基础上,配置了中文分词器,并对其进行的性能测试总结,具体包括使用mmseg4j、IKAnalyzer、Ansj,分别从创建索引效果、创建索引性能、数据搜索效率等方面进行衡量。具体的Solr使用方法假设读者已有了基础,关于Solr的性能指标见前期的Solr博文。 前提: Solr提供了一整套的数据检索方案,一台四核CPU、16G内存的机器,千兆网络。 需求: 1、对Solr创建索引的效率有一定的要求。 2、中文分词速度要快,搜索速度也要快。 3、中文分词准确率有一定的要求。 说明: 以下是在Solr上分别配置不同的中文分词器,它们之间的比较。 1.      中文分词 1.1  中文分词器概述 名称 最近更新 速度(网上情报) 扩展性支持、其它 mmseg4j 2013 complex 60W字/s (1200 KB/s) simple 100W字/s (1900 KB/s) 使用sougou词库,也可自定义 (complex\simple\MaxWord) IKAnalyzer 2012 IK2012 160W字/s (3000KB/s) 支持用户词典扩展定义、支持自定义停止词 (智能\细粒度) Ansj 2014 BaseAnalysis 300W字/s hlAnalysis 40W字/s 支持用户自定义词典,可以分析出词性,有新词发现功能 paoding 2008 100W字/s 支持不限制个数的用户自定义词库 l 注意: 中文分词器可能与最新版本Lucene不兼容,配置好运行时出现TokenStream contractviolation错误,对于mmseg4j需要更改com.chenlb.mmseg4j.analysis.MMSegTokenizer源码,添加super.reset()在reset()内,重新编译后替换原jar。 1.2  mmseg4j l 创建索引效果: FieldValue内容: 京華时报ぼおえ2009年1月23日报道,뭄내ㅠㅛㅜ치ㅗ受一股来自中西伯利亚的强冷空气影响,本市出现大风降温天气,白天最高气温只有零下7摄氏度celsius degree,同时伴有6到7级的偏北风。 在词库中补充: 京華、뭄내、ぼおえ、受一股来   类型 结果 textMaxWord 京華|时报|ぼ|お|え|2009|年|1|月|23|日|报道|뭄|내|ㅠ|ㅛ|ㅜ|치|ㅗ|受|一股|来|自|中|西|伯|利|亚|的|强|冷|空气|影响|本市|出现|大风|降温|天气|白天|最高|气温|只有|零下|7|摄氏|度|celsius|degree|同时|伴有|6|到|7|级|的|偏|北风 textComplex 京華|时报|ぼおえ|2009|年|1|月|23|日|报道|뭄내ㅠㅛ|ㅜ|치|ㅗ|受一股来|自|中|西伯利亚|的|强|冷空气|影响|本市|出现|大风|降温|天气|白天|最高气温|只有|零下|7|摄氏度|celsius|degree|同时|伴有|6|到|7|级|的|偏|北风 textSimple 京華|时报|ぼおえ|2009|年|1|月|23|日|报道|뭄내ㅠㅛ|ㅜ|치|ㅗ|受一股来|自|中西|伯|利|亚|的|强|冷空气|影响|本市|出现|大风|降温|天气|白天|最高气温|只有|零下|7|摄氏度|celsius|degree|同时|伴有|6|到|7|级|的|偏|北风 l 创建索引效率: 17个各种类型字段,在solr博文中字段基础上,选一空string类型字段改为新类型,并写入文本内容(原纯文本Size约为400B,SolrInputDocument对象Size约为1130B)。 文本内容以词库中任选20词拼成的句子,每词大约3字,一句大约60字。 总数据量为2000W条数据,与2.2节相同配置。 字段类型 创建时间(s) 索引大小(GB) 网络(MB/s) 速率(W条/s) textMaxWord 3115 4.95 6.0 0.64 (38W字/s) textComplex 4860 4.3 5.0 0.41 (25W字/s) textSimple 3027 4.32 6.5 0.66 (40W字/s) string 2350 9.08 8.0 0.85 (57W字/s) 速度:在与“solr博文”中1.2节相同配置的情况下,分词索引创建速度要差于不使用分词的。 大小:分词索引大小要小于不使用分词的,经测试分词字段配置成autoGeneratePhraseQueries=”false”对索引大小几乎没有影响。 l 数据搜索效率: 文本内容以词库中任选20词拼成的句子,每词大约3字,一句大约60字,总数据量为2000W条数据。 字段类型 关键词 搜索时间(ms) 结果(条) textMaxWord 一不做二不休 180 2556 textComplex 一不做二不休 59 2648 textSimple 一不做二不休 62 2622 string *一不做二不休* 20000 2689 textMaxWord 一个国家两种制度 22 2620 textComplex 一个国家两种制度 12 2687 textSimple 一个国家两种制度 10 2670 string *一个国家两种制度* 15500 2657 textMaxWord 一些 24 15999 textComplex 一些 11 2687 textSimple 一些 9 2665 string *一些* 14200 15758 textMaxWord 转辗反侧 15 2622 textComplex 转辗反侧 5 2632 textSimple 转辗反侧 9 2676 string *转辗反侧* 15600 2665 l 补充: 对于非中文、数字、英文词汇,包括繁体字,在词典中加入新词汇即可。 mmseg4j对于“都是先从容易的做起”,不能把“容易”分出来,分词结果为“都是|先|从容|易|的|做起”。 网上推荐使用textMaxWord类型分词。 1.3  IKAnalyzer l 创建索引效果: FieldValue内容、在词库中补充均同1.2。 分词字段配置autoGeneratePhraseQueries=”false” 类型 结果 细粒度 京華|时报|ぼおえ|2009|年|1|月|23|日报|日|报道|뭄내ㅠㅛ|ㅜ|치|ㅗ|受一股来|一股|一|股|来自|中西|西伯利亚|西伯|伯利|亚|的|强冷空气|冷空气|空气|影响|本市|出现|大风|降温|天气|白天|最高|高气|气温|只有|有|零下|零|下|7|摄氏度|摄氏|度|celsius|degree|同时|伴有|有|6|到|7|级|的|偏北风|偏北|北风 l  创建索引效率: 字段类型 创建时间(s) 索引大小(GB) 网络(MB/s) 速率(W条/s) 细粒度 3584 5.06 6.0 0.56 (33W字/s) 速度:与1.2比较,分词索引创建速度要略差于使用mmseg4j分词的。 大小:分词索引大小要略大于使用mmseg4j分词的。 l 数据搜索效率: 字段类型 关键词 搜索时间(ms) 结果(条) 细粒度 一不做二不休 400 5949255 细粒度 一个国家两种制度 500 6558449 细粒度 一些 300 5312103 细粒度 转辗反侧 15 10588 l 补充: mmseg4j中textMaxWord,“一不做二不休”被分为:一|不做|二不|不休; IKAnalyzer中细粒度,“一不做二不休”被分为:一不做二不休|一|不做|二不休|二|不休; 因此同样使用autoGeneratePhraseQueries=”false”,“一不做二不休”搜索,IKAnalyzer搜索出来的结果要远多于mmseg4j。 1.4  Ansj l 创建索引效果: FieldValue内容同1.2,没有补充词库。 结果 京华|时报|ぼ|お|え|2009年|1月|23日|报道|,|뭄|내|ㅠ|ㅛ|ㅜ|치|ㅗ|受|一股|来自|中|西伯利亚|的|强|强冷空气|冷空气|影响|,|本市|出现|大风|降温|天气|,|白天|最高|气温|只|只有|有|零下|7摄氏度|摄氏|摄氏度|celsius||degree|,|同时|伴|伴有|有|6|到|7级|的|偏|偏北风|北风|。     “京華”二字被分词后变成了“京华”,据朋友介绍,它有将生僻字改字的Bug。 l  创建索引效率: 字段类型 创建时间(s) 索引大小(GB) 网络(MB/s) 速率(W条/s) 细粒度 3815 5.76 5.2 0.52 (31W字/s) 速度:与1.2、1.3比较,分词索引创建速度要略差于使用mmseg4j、IKAnalyzer分词的。 大小:分词索引大小要略大于使用mmseg4j、IKAnalyzer分词的。 l 数据搜索效率: 关键词 搜索时间(ms) 结果(条) 一不做二不休 200 2478 一个国家两种制度 15 0 一些 25 15665 转辗反侧 6 2655   1.5  总结 按分词后的结果进行搜索,若在分词字段配置autoGeneratePhraseQueries=”false”,则是搜索条件先分词,再使用分词在结果中搜索,默认的是true。autoGeneratePhraseQueries=”false”对创建索引速度没影响,对搜索结果有影响。也可以修改Solr的QueryPasser,对于输入的一个字符串,先进行相应分词,再使用分词结果在索引集中搜索。 精确或模糊*搜索,都是以词为单位搜索。精确搜索是指返回所有包含分词的结果。 分词器能对word、letter、digit等进行识别。 对于不使用分词的String类型进行搜索,只能通过模糊搜索*,搜到连字,以字为单位搜索。 在分词索引内搜索,速度较快;不分词,需要遍历所有文档,速度较慢。 如果需要分词的话,那分词速度是主要瓶颈。 综合考虑,mmseg4j是首选的中文分词器。 如有需要具体的测试代码,可以跟本人联系。   作者:aitanjupt 出处:http://www.cnblogs.com/wgp13x/ Leave a comment Getting Started with TextBlob 2014年5月22日nlpsmallroof TextBlob is a new python natural language processing toolkit, which stands on the shoulders of giants likeNLTKand Pattern , providestext mining, text analysis and text processing modules for python developers. Here I will introduce the basics of TextBlob and show the text processing result with our demo website: Text Analysis Online . About TextBlob Following is the description from the TextBlob official website:   TextBlob is a Python (2 and 3) library for processing textual data. It provides a simple API for diving into common natural language processing (NLP) tasks such as part-of-speech tagging, noun phrase extraction, sentiment analysis, classification, translation, and more.   Installing TextBlob TextBlob reuses the NLTK corpora, and If youinstalled the NLTKbefore, everything seems simple, TextBlob will use your local version instead of the bundled version. The following TextBlob install steps are tested on my mac os and ubuntu 12.04 vps, not test on the windows system, with a python version 2.7, ant TextBlob support Python >= 2.6 or 3.3. The simplest way to install TextBlob is by PyPI: $ pip install -U textblob $ python -m textblob.download_corpora This will install TextBlob and download the necessary NLTK corpora, if you have installed NLTK before, you didn’t need to download the corpora. Another way to install TextBlob is from the open source code by Github: TextBlob is actively developed on Github . You can clone the public repo: $ git clone https://github.com/sloria/TextBlob.git Or download one of the following: Once you have the source, you can install it into your site-packages with $ python setup.py install Test TextBlob After installing TextBlob, you can test it by the Python interpreter:   >>> from textblob import TextBlob >>> text = “Natural language processing (NLP) deals with the application of computational models to text or speech data. Application areas within NLP include automatic (machine) translation between languages; dialogue systems, which allow a human to interact with a machine using natural language; and information extraction, where the goal is to transform unstructured text into structured (database) representations that can be searched and browsed in flexible ways. NLP technologies are having a dramatic impact on the way people interact with computers, on the way people interact with each other through the use of language, and on the way people access the vast amount of linguistic data now in electronic form. From a scientific viewpoint, NLP involves fundamental questions of how to structure formal models (for example statistical models) of natural language phenomena, and of how to design algorithms that implement these models.” >>> blob = TextBlob(text) >>> blob.tags [(u’Natural’, u’NNP’), (u’language’, u’NN’), (u’processing’, u’NN’), (u’NLP’, u’NN’), (u’deals’, u’NNS’), (u’with’, u’IN’), (u’the’, u’DT’), (u’application’, u’NN’), (u’of’, u’IN’), (u’computational’, u’JJ’), (u’models’, u’NNS’), (u’to’, u’TO’), (u’text’, u’NN’), (u’or’, u’CC’), (u’speech’, u’NN’), (u’data’, u’NNS’), (u’Application’, u’NNP’), (u’areas’, u’NNS’), (u’within’, u’IN’), (u’NLP’, u’NN’), (u’include’, u’VBP’), (u’automatic’, u’JJ’), (u’machine’, u’NN’), (u’translation’, u’NN’), (u’between’, u’IN’), (u’languages’, u’NNS’), (u’dialogue’, u’NN’), (u’systems’, u’NNS’), (u’which’, u’WDT’), (u’allow’, u’VB’), (u’a’, u’DT’), (u’human’, u’JJ’), (u’to’, u’TO’), (u’interact’, u’VBP’), (u’with’, u’IN’), (u’a’, u’DT’), (u’machine’, u’NN’), (u’using’, u’VBG’), (u’natural’, u’JJ’), (u’language’, u’NN’), (u’and’, u’CC’), (u’information’, u’NN’), (u’extraction’, u’NN’), (u’where’, u’WRB’), (u’the’, u’DT’), (u’goal’, u’NN’), (u’is’, u’VBZ’), (u’to’, u’TO’), (u’transform’, u’VB’), (u’unstructured’, u’JJ’), (u’text’, u’NN’), (u’into’, u’IN’), (u’structured’, u’VBN’), (u’database’, u’NN’), (u’representations’, u’NNS’), (u’that’, u’IN’), (u’can’, u’MD’), (u’be’, u’VB’), (u’searched’, u’VBD’), (u’and’, u’CC’), (u’browsed’, u’VBN’), (u’in’, u’IN’), (u’flexible’, u’JJ’), (u’ways’, u’NNS’), (u’NLP’, u’NN’), (u’technologies’, u’NNS’), (u’are’, u’VBP’), (u’having’, u’VBG’), (u’a’, u’DT’), (u’dramatic’, u’JJ’), (u’impact’, u’NN’), (u’on’, u’IN’), (u’the’, u’DT’), (u’way’, u’NN’), (u’people’, u’NNS’), (u’interact’, u’VBP’), (u’with’, u’IN’), (u’computers’, u’NNS’), (u’on’, u’IN’), (u’the’, u’DT’), (u’way’, u’NN’), (u’people’, u’NNS’), (u’interact’, u’VBP’), (u’with’, u’IN’), (u’each’, u’DT’), (u’other’, u’JJ’), (u’through’, u’IN’), (u’the’, u’DT’), (u’use’, u’NN’), (u’of’, u’IN’), (u’language’, u’NN’), (u’and’, u’CC’), (u’on’, u’IN’), (u’the’, u’DT’), (u’way’, u’NN’), (u’people’, u’NNS’), (u’access’, u’NN’), (u’the’, u’DT’), (u’vast’, u’JJ’), (u’amount’, u’NN’), (u’of’, u’IN’), (u’linguistic’, u’JJ’), (u’data’, u’NNS’), (u’now’, u’RB’), (u’in’, u’IN’), (u’electronic’, u’JJ’), (u’form’, u’NN’), (u’From’, u’IN’), (u’a’, u’DT’), (u’scientific’, u’JJ’), (u’viewpoint’, u’NN’), (u’NLP’, u’NN’), (u’involves’, u’VBZ’), (u’fundamental’, u’JJ’), (u’questions’, u’NNS’), (u’of’, u’IN’), (u’how’, u’WRB’), (u’to’, u’TO’), (u’structure’, u’NN’), (u’formal’, u’JJ’), (u’models’, u’NNS’), (u’for’, u’IN’), (u’example’, u’NN’), (u’statistical’, u’JJ’), (u’models’, u’NNS’), (u’of’, u’IN’), (u’natural’, u’JJ’), (u’language’, u’NN’), (u’phenomena’, u’NNS’), (u’and’, u’CC’), (u’of’, u’IN’), (u’how’, u’WRB’), (u’to’, u’TO’), (u’design’, u’NN’), (u’algorithms’, u’NNS’), (u’that’, u’IN’), (u’implement’, u’VB’), (u’these’, u’DT’), (u’models’, u’NNS’)] >>> blob.noun_phrases WordList([u’natural language processing’, ‘nlp’, u’computational models’, u’speech data.’, ‘application’, ‘nlp’, u’dialogue systems’, u’natural language’, u’information extraction’, ‘nlp’, u’dramatic impact’, u’way people interact’, u’way people interact’, u’way people access’, u’vast amount’, u’linguistic data’, u’electronic form.’, u’scientific viewpoint’, ‘nlp’, u’fundamental questions’, u’formal models’, u’statistical models’, u’natural language phenomena’, u’design algorithms’]) >>> blob.sentences [Sentence(“Natural language processing (NLP) deals with the application of computational models to text or speech data.”), Sentence(“Application areas within NLP include automatic (machine) translation between languages; dialogue systems, which allow a human to interact with a machine using natural language; and information extraction, where the goal is to transform unstructured text into structured (database) representations that can be searched and browsed in flexible ways.”), Sentence(“NLP technologies are having a dramatic impact on the way people interact with computers, on the way people interact with each other through the use of language, and on the way people access the vast amount of linguistic data now in electronic form.”), Sentence(“From a scientific viewpoint, NLP involves fundamental questions of how to structure formal models (for example statistical models) of natural language phenomena, and of how to design algorithms that implement these models.”)] >>> len(blob.sentences) 4 >>> for sentence in blob.sentences: … print sentence.sentiment.polarity … 0.1 0.05 -0.114583333333 0.1 >>> blob.translate(to=”fr”) TextBlob(“Traitement du langage naturel (NLP ) traite de l’application de modèles de calcul au texte ou de la parole données . Les domaines d’application au sein de la PNL sont automatique (machine) traduction entre les langues ; les systèmes de dialogue , qui permettent à un être humain d’interagir avec un ordinateur en utilisant un langage naturel ; et l’extraction de l’information , dont l’objectif est de transformer un texte non structuré dans structurées ( bases de données) des représentations qui peuvent être recherchées et parcourues de manière flexible . Technologies PNL ont un impact dramatique sur la façon dont les gens interagissent avec les ordinateurs , sur la façon dont les gens interagissent les uns avec les autres grâce à l’utilisation de la langue , et sur la façon dont les gens accèdent à la grande quantité de données linguistiques maintenant sous forme électronique . D’un point de vue scientifique , la PNL soulève des questions fondamentales sur la façon de structurer les modèles formels (par exemple les modèles statistiques ) des phénomènes de langage naturel , et de la façon de concevoir des algorithmes qui implémentent ces modèles .”)   Dive into TextBlob Based on NLTK, Pattern and other NLP Tools, TextBlob support following text processing features, including:   Word Tokenization Sentence Tokenization Part-of-speech tagging Noun phrase extraction Sentiment analysis Word Pluralization Word Singularization Spelling correction Parsing Classification (Naive Bayes, Decision Tree) Language translation and detection powered by Google Translate Word and phrase frequencies n-grams Word inflection (pluralization and singularization) and lemmatization JSON serialization Add new models or languages through extensions WordNet integration   Now it’s time to introduce them one by one, first create a TextBlob: >>> from textblob import TextBlob >>> nlpblob = TextBlob(“Natural language processing (NLP) is a field of computer science, artificial intelligence, and linguistics concerned with the interactions between computers and human (natural) languages.”) 1) Word Tokenization You can tokenize TextBlobs into words: >>> nlpblob.words WordList([‘Natural’, ‘language’, ‘processing’, ‘NLP’, ‘is’, ‘a’, ‘field’, ‘of’, ‘computer’, ‘science’, ‘artificial’, ‘intelligence’, ‘and’, ‘linguistics’, ‘concerned’, ‘with’, ‘the’, ‘interactions’, ‘between’, ‘computers’, ‘and’, ‘human’, ‘natural’, ‘languages’]) 2) Sentence Tokenization TextBlob can be used to segment sentence from text paragraph: >>> nlpblob.sentences [Sentence(“Natural language processing (NLP) is a field of computer science, artificial intelligence, and linguistics concerned with the interactions between computers and human (natural) languages.”)] 3) Part-of-Speech Tagging You can use TextBlob to get POS Tagging result, which can be accessed through the tags property: >>> nlpblob.tags [(u’Natural’, u’NNP’), (u’language’, u’NN’), (u’processing’, u’NN’), (u’NLP’, u’NN’), (u’is’, u’VBZ’), (u’a’, u’DT’), (u’field’, u’NN’), (u’of’, u’IN’), (u’computer’, u’NN’), (u’science’, u’NN’), (u’artificial’, u’JJ’), (u’intelligence’, u’NN’), (u’and’, u’CC’), (u’linguistics’, u’NNS’), (u’concerned’, u’VBN’), (u’with’, u’IN’), (u’the’, u’DT’), (u’interactions’, u’NNS’), (u’between’, u’IN’), (u’computers’, u’NNS’), (u’and’, u’CC’), (u’human’, u’JJ’), (u’natural’, u’JJ’), (u’languages’, u’NNS’)] 4) Noun Phrase Extraction Furthermore, you can get noun phrases by accessing through the noun_phrases property in TextBlob: >>> nlpblob.noun_phrases WordList([u’natural language processing’, ‘nlp’, u’computer science’, u’artificial intelligence’]) 5) Sentiment Analysis Sentiment analysis (also known as opinion mining) refers to the use of natural language processing, text analysis and computational linguistics to identify and extract subjective information in source materials. You can get the sentiment analysis result by TextBlob: >>> nlpblob.sentiment Sentiment(polarity=-0.1, subjectivity=0.475) >>> nlpblob.sentiment.polarity -0.1 >>> nlpblob.sentiment.subjectivity 0.475 6) Word Singularize >>> nlpblob.words[19] ‘computers’ >>> nlpblob.words[19].singularize() ‘computer’ 7) Word Pluralize >>> nlpblob.words[21] ‘human’ >>> nlpblob.words[21].pluralize() ‘humen’ 8) Words Lemmatization Words can be lemmatized by the lemmatize method, but notice that the TextBlog lemmatize method is inherited from NLTK Word Lemmatizer , and the default POS Tag is “n”, if you want lemmatize other pos tag words, you need specify it: >> from textblob import Word >>> w = Word(“octopi”) >>> w.lemmatize() u’octopus’ >>> w = Word(“is”) >>> w.lemmatize() ‘is’ >>> w.lemmatize(“v”) u’be’ 9) Spelling Correction TextBlob Spelling correction is based on Peter Norvig’s “ How to Write a Spelling Corrector “, which is implemented in the pattern library: >>> b = TextBlob(“I havv good speling!”) >>> b.correct() TextBlob(“I have good spelling!”) Word objects also have a spellcheck() method that returns a list of (word, confidence) tuples with spelling suggestions: TextBlob(“I have good spelling!”) >>> from textblob import Word >>> w = Word(‘havv’) >>> w.spellcheck() [(u’have’, 1.0)] 9) Parsing TextBlob parse method is based on pattern parser: >>> nlpblob.parse() u’Natural/NNP/B-NP/O language/NN/I-NP/O processing/NN/I-NP/O (/(/O/O NLP/NN/B-NP/O )/)/O/O is/VBZ/B-VP/O a/DT/B-NP/O field/NN/I-NP/O of/IN/B-PP/B-PNP computer/NN/B-NP/I-PNP science/NN/I-NP/I-PNP ,/,/O/O artificial/JJ/B-NP/O intelligence/NN/I-NP/O ,/,/O/O and/CC/O/O linguistics/NNS/B-NP/O concerned/VBN/B-VP/O with/IN/B-PP/B-PNP the/DT/B-NP/I-PNP interactions/NNS/I-NP/I-PNP between/IN/B-PP/B-PNP computers/NNS/B-NP/I-PNP and/CC/O/O human/JJ/B-ADJP/O (/(/O/O natural/JJ/B-ADJP/O )/)/O/O languages/NNS/B-NP/O ././O/O’ 10) Translation and Language Detection TextBlob’s translation and language detection feature are based on Google’s API: >>> nlpblob.translate(to=”es”) TextBlob(“Procesamiento del lenguaje natural (NLP ) es un campo de la informática , la inteligencia artificial, y la lingüística que se ocupan de las interacciones entre las computadoras y los lenguajes humanos (naturales) .”) >>> nlpblob.translate(to=”zh”) TextBlob(“自然语言处理(NLP )是计算机科学,人工智能和语言学关注计算机和人类(自然)语言之间的相互作用的一个领域。”) >>> nlpblob.detect_language() u’en’ >>> nlpblob.translate(to=”zh”).detect_language() u’zh-CN’ >>> Except the features we have mentioned here, you can still find other text processing features by TextBlob, even to train a text classification model and build your own’s text classifier, just following the official guide you can find more interesting text analysis features. Using TextBlob in Other Programming Languages TextBlob is a Python text mining tool, only support the Python environment, even though, you have to install the NLTK Corpora and other dependences before you can use TextBlob, that’s a tedious thing. So we have intergrated TextBlog into our Text Analysis API on mashape, and the details info you can find on our demo website: Text Analysis Online . Based on mashape, you can use TextBlob features in Java/JVM/Android, Node.js, PHP, Python, Objective-C/iOS, Ruby, .NET and other programming languages. You can use the text analysis apiby the free plan first, which limited 1000 requests/day. If you need more requests, just pay a small amount money, which can be used to support our web server. Mashape is the Cloude API Marketplace, all you need to do is just three steps: 1. Register a Mashape account; 2. Go to the Text Analysis API page on Mashape and subscrible to it; 3. Start using the TexBlob method by Text Analysis API; That’s all, you can use TextBlob by a local version, or by our text analysis services: Text Analysis Online . Posted byTextMiner 本文转载自:Text Mining Online | Text Analysis Online Leave a comment 美国防部开发DEFT项目 让情报处理智能化 2014年5月8日nlplugm   美国国防部高级研究计划局(DARPA)正在开发一系列技术,旨在提升对人类语言的理解。该技术不仅有助于分析演讲或文本资源,还能在发现潜在有用的信息时提醒情报分析人员注意。 当提及处理分析自然语言的人工智能系统时,人们不免会想到一些巨头企业,如谷歌、微软、雅虎等。现在,有一个狠角色也加入到这一领域之中,它就是美国国防部高级研究计划局,简称DARPA。目前,DARPA正在开发一个名为“文本深度探索及过滤(Deep Exploration and Filtering of Text)”的项目,旨在分析一些人类无法处理的庞大文本数据。 该项目于2012年中期启动,预计整个项目的完成时间为四年半。DARPA的官网对DEFT项目的目标介绍如下: “对于那些人类无法处理的海量文本信息,自动化深度自然语言处理(NLP)技术可以提供一个解决方案。除了能够更高效地处理文本信息,该技术还可以理解上下文之间的联系。DARPA“文本深度探索及过滤”项目的目的是提升自然语言的处理能力。自然语言处理技术具备人工智能属性,并且已有一定实用经验,可 以帮助国防分析人员大幅提升海量文档调查的工作效率,并从中发现一些表达隐晦、可能付诸行动的信息。” 本质上,DARPA希望这种技术能够帮助情报分析人员扫描更多的文本文档和语音文件,并从中发现一些关键信息,比如人物、事件、地点、时间等。另外,DARPA还希望该技术能够辨别出一些模糊或是暗示性信息。一旦系统分析出新的数据源,分析师就会收到提示,其中包括可疑信息(比如内容、任务、地点等)和相关文档。 这并非DARPA首次涉足自然语言处理领域。他们希望全新的深度学习方法可从语义上理解文档信息。除了分析文本内容并发送提示外,DARPA还希望能够创建一个数据库,把文档中的相关问题和实体联系在一起: “还希望DEFT能够将个体因素整合进更大的数据模型里,这样就可以对信息进行处理,以支持分析人员进行评估、计划和预测,甚至还能完成一份报告的初稿。如果这个数据库真的完成了, DEFT 就能让分析人员从海量数据中抽身出来,转移到更加细微、更具战略意义的信息探索工作之中。.” 另据推测,使用DEFT技术,可让美国国防部分析各种信息源,比如YouTube视频、互联网论坛发帖,甚至是通过间谍软件拦截到的消息。为了进一步提升DEFT的功能,DARPA正在寻求多所大学的帮助,其中包括斯坦福大学、哥伦比亚大学、卡内基梅隆大学,这些大学都得到过DARPA的资助。 2012年,奥巴马政府表示要推动大数据技术发展。作为总统计划的一部分,美国国防部启动了2500万美元的XDATA项目。此外,他们还研究了许多其他机器学习方法,目的是组织、归纳、分析国防部获取的海量数据。这些方法包括图谱分析、时间序列关联、高级可视化技术等。 原文链接:http://www.leiphone.com/deep-learning-project.html Leave a comment List of 25+ Natural Language Processing APIs 2014年4月28日nlp, 汇总smallroof Natural Language Processing, or NLP, is a field of computer science, artificial intelligence, and linguistics concerned with the interactions between computers and human (natural) languages. Here are useful APIs that help bridge the human-computer interaction: Sentiment Analysis for Social Media – The multilingual sentiment analysis API (with exceptional accuracy, 83.4% as opposed to industry standard of 65.4%, and available in Mandarin) from Chatterbox classifies social media texts as positive or negative, with a free daily allowance to get you started. The system uses advanced statistical models (machine learning & NLP) trained on social data, meaning the detection can handle slang, common misspellings, emoticons, hashtags, etc. Stremor Automated Summary and Abstract Generator – Language Heuristics goes a step beyond Natural Language Processing to extract intent from text. Summaries are created through extraction, but maintain readability by keeping sentence dependencies intact. Text-Processing – Sentiment analysis, stemming and lemmatization, part-of-speech tagging and chunking, phrase extraction and named entity recognition. Skyttle 2.0 – Skyttle API extracts topical keywords (single words and multiword expressions) and sentiment (positive or negative) expressed in text. Languages supported are English, French, German, Russian. Textuality – The service lifts the key text from an html page. Get up an started with summarizer app in few steps. The Textuality API from Saaskit finds out the most relevant piece of information on web-pages. Text Processing – The WebKnox text processing API lets you process (natural) language texts. You can detect the text’s language, the quality of the writing, find entity mentions, tag part-of-speech, extract dates, extract locations, or determine the sentiment of the text. Question-Answering – The WebKnox question-answering API allows you to find answers to natural language questions. These questions can be factual such as “What is the capital of Australia” or more complex. Jeannie – Jeannie (Voice Actions) is a virtual assistant with over two Million downloads, now also available via API. The objective of this service is to provide you and your robot with the smartest answer to any natural language question, just like Siri. Diffbot – Diffbot extracts data from web pages automatically and returns structured JSON. For example, our Article API returns an article’s title, author, date and full-text. Use the web as your database! We use computer vision, machine learning and natural language processing to add structure to just about any web page. nlpTools – Text processing framework to analyse Natural Language. It is especially focused on text classification and sentiment analysis of online news media (general-purpose, multiple topics). Speech2Topics – Yactraq Speech2Topics is a cloud service that converts audiovisual content into topic metadata via speech recognition & natural language processing. Customers use Yactraq metadata to target ads, build UX features like content search/discovery and mine Youtube videos for brand sentiment. Repustate Sentiment and Social Media Analytics – Repustate’s sentiment analysis and social media analytics API allows you to extract key words and phrases and determine social media sentiment in one of many languages. These languages include English, Arabic, German, French and Spanish. Monitor social media as well using our API and retrieve your data all with simple API calls. Stemmer - This API takes a paragraph and returns the text with each word stemmed using porter stemmer, snowball stemmer or UEA stemmer SpringSense Meaning Recognition – The fastest and most accurate Meaning Recognition (Word Sense Disambiguation) API in the world. Recognises any nouns in a body of text and allows you to provide a rich user-interface with meaning definitions. LanguageTool – Style and grammar checking / proofreading for more than 25 languages, including English, French, Polish, Spanish and German. DuckDuckGo – DuckDuckGo Zero-click Info includes topic summaries, categories, disambiguation, official sites, !bang redirects, definitions and more. You can use this API for many things, e.g. define people, places, things, words and concepts; provides direct links to other services (via !bang syntax); list related topics; and gives official sites when available Jetlore Semantic Text Processing – Semantic Text Processing API extracts named entities from English text, including social media posts, user comments, product reviews, picture captions, email content, news articles, and web pages. We guarantee exceptional accuracy of over 90% precision at over 60% recall. The API handles slang, common misspellings, understands hashtags, and auto-fetches embedded URLs making it ideal for processing any user-generated content and social media. ESA Semantic Relatedness – Calculates the semantic relatedness between pairs of text excerpts based on the likeness of their meaning or semantic content. AlchemyAPI – AlchemyAPI provides advanced cloud-based and on-premise text analysis infrastructure that eliminates the expense and difficulty of integrating natural language processing systems into your application, service, or data processing pipeline. Sentence Recognition – The Sentence Recognition API will match strings of text based off of the meaning of the sentences. It’s powerful NLP engine offering utilizes a semantic network to understand the text presented. Machine Linking – We develop a multilingual SaaS platform performing semantic analysis of textual documents: by interfacing with our API, developers can connect unstructured documents, written in different languages, to resources in the Linked Open Data cloud such as DBPedia or Freebase TextTeaser – TextTeaser is an automatic summarization API. It extracts the most important sentences of an article. The purpose of the API is to provide a preview of what the article is all about. Textalytics Media Analytics – Textalytics Media Analysis API analyzes mentions, topics, opinions and facts in all types of media. This API provides services for: – Sentiment analysis – Extracts positive and negative opinions according to the context. – Entities extraction – Identifies persons, companies, brands, products, etc. and provides a canonical form that unifies different mentions (IBM, International Business Machines Corporation, etc.) – Topic and keyword extraction – Facts and other key information – Dates, URLs, addresses, user names, e-mails and money amounts. – Thematic classification – Organize information by topic using IPTC standard classification (more than 200 categories hierarchically structured). – Configured for different type of media: microblogging and social networks, blogs and news Wit.ai – it enables developers to add a Siri-like modern natural language interface to their app or device with minimal effort. It integrates well with Android’s speech to text engine. Machine Linking – Multilingual semantic analysis of text: developers can annotate unstructured documents and short pieces of text, and connect them to resources in the Linked Open Data cloud, such as DBPedia or Freebase. Other features include text comparison, summarization and language detection. Textalytics Topics Extraction – Textalytics Topics Extraction tags locations, people, companies, dates and many other elements appearing in a text written in Spanish, English, French, Italian, Portuguese or Catalan. This detection process is carried out by combining a number of complex natural language processing techniques that allow to obtain morphological, syntactic and semantic analyses of a text and use them to identify different types of significant elements. Textalytics Spelling Grammar and Style Proofreading – A service for automatic proofreading of multilingual texts. This API uses multilingual Natural Language Processing technology to check the spelling, grammar and style of your texts with high accuracy, in order to provide precise and up-to-date suggestions and educational explanations based on references. The current supported languages are Spanish, English, French and Italian. Textalytics Text Classification – Automatic multilingual text classification according to pre-established categories defined in a model. The algorithm used combines statistic classification with rule-based filtering, which allows to obtain a high degree of precision for very different environments. Three models available: IPTC (International Press Telecommunications Council standard), EuroVocs and Corporate Reputation model. Languages covered are Spanish, English, French, Italian, Portuguese and Catalan Fluxifi NLP – Cloud based Natural Language Processing API. Includes Sentiment and Language Detection. Cilenis – Cilenis helps you to analyze and extract information from texts.  Add language technology to your software in a few minutes using their cloud solution. They offer you technology based on years of research in Natural Language Processing in a very easy and scalable SaaS model through a RESTful API. 原文:http://blog.mashape.com/post/48946187179/list-of-25-natural-language-processing-apis Leave a comment Posts navigation ← Older posts Proudly powered by WordPress

下载文档到电脑,查找使用更方便

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 10 金币 [ 分享文档获得金币 ] 0 人已下载

下载文档