[微信机器人_04]自然语言处理简单实现

标签: 微信 机器人 _04 | 发表时间:2014-01-20 00:22 | 作者:elcarim
分享到:
出处:http://blog.csdn.net

这篇博文中将介绍奇迹蛋自然语言处理模块的实现,自然语言处理的三个关键词:分词、建库、匹配。

 

建库:

先来看两个对话:

问:今天吃什么答:面条

问:今天吃面条答:太好了

 

机器人要如何来记忆这两组对话呢?

1、直接存储

问题

答案

今天吃什么

火锅

今天吃面条

不好吃

 

这样存储当然没有问题,但是显然太土了,有没有其它的办法呢?

 

2、树

在存储过程中,总是希望能够去除冗余,即相同的词语能够只存储一次。很容易想到,把句子拆分成词来存储。


如图所示,每个问题都拆分成词,并以词为节点建立树。每个几点可以与一个答案(或者多个答案)关联。这样的存储方式比 直接存储要精细很多,存储空间小、查找效率高。

实际建立的树结构如下:


树存储特点介绍

Ø  根节点不存储任何信息;

Ø  内部节点和叶子节点都可以与答案关联;

Ø  这棵树类似于B树的结构,即一个节点可以有N个子节点;

Ø  树的高度与一个句子中包含的词语个数有关。

 

分词

注意到以树来记忆对话,需要把问题进行拆分,即 分词

分词是自然语言处理里非常关键的一部分,用于把句子拆分成词,进行存储、匹配。分词的实现包含两个部分:

Ø  分词算法

即按照什么样的规则来切割句子,比如从头开始切还是从结尾开始切,有多种切割选择时如何决策等等。

Ø  知识库

知识库即一些常用的词语,分词算法依赖知识库来识别 元词(即由多个汉字组成的有意义的词)。知识库是否丰富,对算法的精确度有很大的影响。

分词算法我是不太懂,这里也不做过多的描述,有兴趣可以去研究下比较有名的开源分词软件如: IK分词器等。

不懂分词算法没关系,我的目的只是得到分词的结果,“拿来主义”是程序员的优良传统,可以使用开放的API来帮咱完成分词的工作,在前面的博文提到过,我这里使用的是sina的api: http://5.tbip.sinaapp.com/api.php?str=[sentence]&type=[json]

比如在浏览器中输入

http://5.tbip.sinaapp.com/api.php?str=今天吃什么&type=json

返回json格式的结果:

[

{

"word":"\u4eca\u5929",

"word_tag":"132",

"index":"0"

},

{

"word":"\u5403",

"word_tag":"170",

"index":"1"

},

{

"word":"\u4ec0\u4e48",

"word_tag":"123",

"index":"2"

}

]

 

匹配

匹配算法也很简单,关键是几个模糊匹配的规则。

假设数据库中记录了这样一个问题: ABCD,其中,A、B、C、D分别代表一个词语。

而可能遇到的问题有如下几种:

1. ABC

由于数据库中没有ABC对应的答案,而前几个词完全匹配,那么继续搜寻C的子节点,知道找到有答案的节点,将该答案作为ABC的答案返回。比如,记录的对话为:

问题你 在 干嘛 呢

答案:发呆

此时如果用户提问: 你 在 干嘛,会匹配到 “你在干嘛呢”这个问题,并获得答案“发呆”。

2. ABCD

完全匹配,不多说。

3. ABCDE

虽然前四个词完全匹配,但是多了一个E,则认为是一个新问题,不能匹配,没有答案。

4. XABC

5. XABCD

6. XABCDE

4、5、6这三种情况可分别转换为1、2、3三种情况。当发现问题的首字不匹配时,则去掉首字,重新匹配。比如,记录的对话为:

问题今天 还有 火车票 吗

答案:卖完了

此时如果用户提问: 请问 今天 还有 火车票 吗,首词 “请问”无法匹配,则去掉首词,得到新的问题 今天 还有 火车票 吗,与原问题匹配,得到答案“卖完了”。

7. CD

也遵循上面的处理原则,去掉不匹配的首词,但C、D作为首词均不能匹配到ABCD,故该问题没有答案。

 

以上即使奇迹蛋的自然语言模块的设计,很简单吧^_^

关于代码及数据库实现会在后面以整个工程上传,其实并不复杂,相信各位有更精妙的实现方法。

这里的自然语言处理只是一个简化的实现,后面如果有时间,会去研究相关的资料,这里也放出一些相关的信息,各位感兴趣的话可以去研究下,期待你的分享。

Ø Aiml (Artificial Intelligence Markup Language)

国外一个很优秀的开源人工智能项目,有丰富的语料库,很多聊天机器人都用它来实现。不过原版堆对中文的支持不好,需要修改下源码。

Ø Lucence

Ø IK分词

这两个我也只是扫了一眼,有兴趣直接google吧。


谢谢关注奇迹蛋~扫一下&调戏之


作者:elcarim 发表于2014-1-20 0:22:45 原文链接
阅读:172 评论:0 查看评论

相关 [微信 机器人 _04] 推荐:

[微信机器人_04]自然语言处理简单实现

- - CSDN博客互联网推荐文章
这篇博文中将介绍奇迹蛋自然语言处理模块的实现,自然语言处理的三个关键词:分词、建库、匹配. 机器人要如何来记忆这两组对话呢?. 这样存储当然没有问题,但是显然太土了,有没有其它的办法呢. 在存储过程中,总是希望能够去除冗余,即相同的词语能够只存储一次. 很容易想到,把句子拆分成词来存储. 如图所示,每个问题都拆分成词,并以词为节点建立树.

微信自定义机器人的最初需求样本

- - 白鸦,Blog
前不久给微信提了几个未来可以通用的接口需求,我认为可以作为很多企业的智能客服去使用,也可以配套上他们的CRM. 虽然到目前为止 Guang.com的一个兼职工程师还没有完全实现这些设计,但依然还是挺好玩的~. 最近有不少新的微信账户在使用这些接口(可以添加如下好友来测试:订酒店、下厨房、逛),也有人在讨论这些接口可以怎么用.

微信公众平台开发(二)--简单的聊天机器人

- - BlogJava-首页技术区
1.设置成为开发者模式 登录微信工作平台,选择高级功能-进入开发模式,成为开发者. URL配置的信息是指,微信的后台服务器把您的用户消息发送到该URL处理. Token是你和微信之间的一个密码,用来验证消息是否是从微信的服务发送而来,而不是其他来攻击你的系统. 现在你还不能设置,在设置时微信会GET请求你设置的URL,已检测接口是否可以使用.

机器人与羊

- Mr.aa - 网不易
- 这里有两个机器人,不,是两个加上两个“半个”机器人,问你怕不怕.

Android 机器人遇见龙

- oltra - 谷安——谷奥Android专题站
不知道你是否看过 Authors@Google 系列. 最近的嘉宾是 George R.R. Martin(乔治·马丁),它曾执笔了《A Song of Fire and Ice》(冰与火之歌)系列的《A Game of Thrones》(权力的游戏)一书. 不过在长达一个小时的视频中他看起来似乎不够酷,看看他的衬衫就知道打扮有点宅,不过 Googlers 送了他一件衣服,一件 Android Dragon T恤.

机器人世界杯2011

- Mooky - Solidot
2011年度机器人世界杯于7月5日到11日在土耳其伊斯坦布尔举行. 来自泰国的Skuba团队在小型组决赛中以5:1战胜Immortals; 来自美国的RoMeLa团队机器人选手DARwIn在类人组比赛中显得无人能抵挡,它在小组赛中先后以8:0,9:0和10:0等横扫对手,7月10日它将在半决赛挑战去年的对手Darmstadt Dribblers,去年它遭到惨败,比分1:9.

机器人的革命

- Homer - 科学松鼠会
原作:http://www.smbc-comics.com/index.php?db=comics&id=2124#comic.

软件机器人崛起

- - 《商业价值》杂志
The Economist 《经济学人》2013年1月17日. 伊莉莎·杜利特尔(Eliza Doolittle)是20世纪60年代由麻省理工学院(MIT)科学家约瑟夫·魏泽鲍姆(Joseph Weizenbaum)创造出来的. 他一个是以萧伯纳作品中的人物命名的电脑程序机器人,在刚刚舞台表演的时候,她还带着浓重的伦敦口音.

安卓机器人的七十二变

- hidecloud - 和邪社
首先作为一个使用安卓系统的人而言安卓的系统还有待完善,和竞争对手ios而言,安卓的稳定性安全性要差不少. 不过多亏有Android才使得智能机的市场不是苹果一家独大,绿色的机器人和白色的苹果还将继续一场旷日持久的大战. 我们今天并不是要讨论这场智能手机和平板电脑的系统大战,而是来看看,安卓机器人玩Cosplay的套图.

Android机器人的七十二变

- Darth Noctis - cnBeta全文版
首先作为一个使用安卓系统的人而言安卓的系统还有待完善,和竞争对手ios而言,安卓的稳定性安全性要差不少. 不过多亏有Android才使得智能机的市场不是苹果一家独大,绿色的机器人和白色的苹果还将继续一场旷日持 久的大战. 我们今天并不是要讨论这场智能手机和平板电脑的系统大战,而是来看看,安卓机器人玩Cosplay的套图.