一、浅谈聊天机器人 ChatBot 涉及到的技术点

聊天机器人到底该怎么做呢?我日思夜想,于是乎我做了一个梦,梦里面我完成了我的聊天机器人,它叫chatbot,经过我的一番盘问,它向我叙述了它的诞生记 
请尊重原创,转载请注明来源网站www.shareditor.com以及原始链接地址

聊天机器人是可行的

我:chatbot,你好!

chatbot:你也好!

我:聊天机器人可行吗?

chatbot:你不要怀疑这是天方夜谭,我不就在这里吗?世界上还有很多跟我一样聪明的机器人呢,你听过IBM公司在2010年就研发出来了的Watson问答系统吗?它可比我要聪明100倍呢

我:噢,想起来了,据说Watson在智力竞赛中竟然战胜了人类选手。但是我了解到它有一些缺陷:因为它还只是对信息检索技术的综合运用,并没有进行各种语义关系的深刻计算,所以它能回答的问题也仅限于实事类的问题,所以它能赢得也就是知识类的智力竞赛,如果你给它出个脑筋急转弯,它就不行了

chatbot:是的呢,所以你任重道远啊

聊天机器人工作原理是什么

我:chatbot,我问的每一句话,你都是怎么处理并回答我的呢?

chatbot:我身体里有三个重要模块:提问处理模块、检索模块、答案抽取模块。三个模块一起工作,就能回答你的问题啦

我:是嘛,那么这个提问处理模块是怎么工作的呢?

chatbot:提问处理模块要做三项重要工作:查询关键词生成、答案类型确定、句法和语义分析。

我:那么这个查询关。。。

chatbot:别急别急,听我一个一个讲给你听。查询关键词生成,就是从你的提问中提取出关键的几个关键词,因为我本身是一个空壳子,需要去网上查找资料才能回答你,而但网上资料那么多,我该查哪些呢?所以你的提问就有用啦,我找几个中心词,再关联出几个扩展词,上网一搜,一大批资料就来啦,当然这些都是原始资料,我后面要继续处理。再说答案类型确定,这项工作是为了确定你的提问属于哪一类的,如果你问的是时间、地点,和你问的是技术方案,那我后面要做的处理是不一样的。最后再说这个句法和语义分析,这是对你问题的深层含义做一个剖析,比如你的问题是:聊天机器人怎么做?那么我要知道你要问的是聊天机器人的研发方法

我:原来是这样,提问处理模块这三项工作我了解了,那么检索模块是怎么工作的呢?

chatbot:检索模块跟搜索引擎比较像,就是根据查询关键词所信息检索,返回句子或段落,这部分就是下一步要处理的原料

我:那么答案抽取模块呢?

chatbot:答案抽取模块可以说是计算量最大的部分了,它要通过分析和推理从检索出的句子或段落里抽取出和提问一致的实体,再根据概率最大对候选答案排序,注意这里是“候选答案”噢,也就是很难给出一个完全正确的结果,很有可能给出多个结果,最后还在再选出一个来

我:那么我只要实现这三个模块,就能做成一个你喽?

chatbot:是的

请尊重原创,转载请注明来源网站www.shareditor.com以及原始链接地址

聊天机器人的关键技术

我:chatbot,小弟我知识匮乏,能不能告诉我都需要学哪些关键技术才能完成我的梦想

chatbot:小弟。。。我还没满月。说到关键技术,那我可要列一列了,你的任务艰巨了:

1)海量文本知识表示:网络文本资源获取、机器学习方法、大规模语义计算和推理、知识表示体系、知识库构建;

2)问句解析:中文分词、词性标注、实体标注、概念类别标注、句法分析、语义分析、逻辑结构标注、指代消解、关联关系标注、问句分类(简单问句还是复杂问句、实体型还是段落型还是篇章级问题)、答案类别确定;

3)答案生成与过滤:候选答案抽取、关系推演(并列关系还是递进关系还是因果关系)、吻合程度判断、噪声过滤

聊天机器人的技术方法

我:chatbot,我对聊天机器人的相关技术总算有所了解了,但是我具体要用什么方法呢?

chatbot:看你这么好学,那我就多给你讲一讲。聊天机器人的技术可以分成四种类型:1)基于检索的技术;2)基于模式匹配的技术;3)基于自然语言理解的技术;4)基于统计翻译模型的技术。这几种技术并不是都要实现,而是选其一,听我给你说说他们的优缺点,你就知道该选哪一种了。基于检索的技术就是信息检索技术,它简单易实现,但无法从句法关系和语义关系给出答案,也就是搞不定推理问题,所以直接pass掉。基于模式匹配的技术就是把问题往已经梳理好的几种模式上去靠,这种做推理简单,但是模式我们涵盖不全,所以也pass掉。基于自然语言理解就是把浅层分析加上句法分析、语义分析都融入进来做的补充和改进。基于统计翻译就是把问句里的疑问词留出来,然后和候选答案资料做配对,能对齐了就是答案,对不齐就对不起了,所以pass掉。选哪个知道了吗?

我:知道了!基于自然语言理解的技术!so easy!妈妈再也不用担心我的学习!o(╯□╰)o

chatbot:好,那我的任务结束啦,我该走了,再见!

我:不要走——不要走——ka ji ma——

在呼唤chatbot的声音中,我从梦中醒来,这时我才意识到这是一个梦,揉揉双眼,突然发现床边有一张纸,上面写着:

你会成功的!读了这篇文章的人也会成功的!加油!chatbot

二、词性标注和关键字提取部分

想要做到和人聊天,首先得先读懂对方在说什么,所以问句解析是整个聊天过程的第一步,问句解析是一个涉及知识非常全面的过程,几乎涵盖了自然语言处理的全部,本节让我们尝试一下如何分析一个问句

问句解析的过程

一般问句解析需要进行分词、词性标注、命名实体识别、关键词提取、句法分析以及查询问句分类等。这些事情我们从头开始做无非是重复造轮子,傻子才会这么做,人之所以为人是因为会使用工具。网络上有关中文的NLP工具有很多,介绍几个不错的:

第一个要数哈工大的LTP(语言技术平台)了,它可以做中文分词、词性标注、命名实体识别、依存句法分析、语义角色标注等丰富、 高效、精准的自然语言处理技术

第二个就是博森科技了,它除了做中文分词、词性标注、命名实体识别、依存文法之外还可以做情感分析、关键词提取、新闻分类、语义联想、时间转换、新闻摘要等,但因为是商业化的公司,除了分词和词性标注免费之外全都收费

第三个就是jieba分词,这个开源小工具分词和词性标注做的挺不错的,但是其他方面还欠缺一下,如果只是中文分词的需求完全可以满足

第四个就是中科院张华平博士的NLPIR汉语分词系统,也能支持关键词提取

我们优先选择NLPIR

NLPIR使用

文档在http://pynlpir.readthedocs.io/en/latest/

首先安装pynlpir库

pip install pynlpir

写个小程序测试一下分词效果:

# coding:utf-8import sys
reload(sys)
sys.setdefaultencoding( "utf-8" )import pynlpirpynlpir.open()
s = '聊天机器人到底该怎么做呢?'
segments = pynlpir.segment(s)
for segment in segments:print segment[0], '\t', segment[1]pynlpir.close()

执行效果如下:

聊天     verb
机器人     noun
到底     adverb
该     verb
怎么     pronoun
做     verb
呢     modal particle
?     punctuation mark

下面我们再继续试下关键词提取效果:

key_words = pynlpir.get_key_words(s, weighted=True)
for key_word in key_words:print key_word[0], '\t', key_word[1]

输出如下:

聊天     2.0
机器人     2.0

从这个小程序来看,分词和关键词提取效果很好

下面我们再来试验一个,这一次我们把分析功能全打开,部分代码如下:

s = '海洋是如何形成的'
segments = pynlpir.segment(s, pos_names='all')

执行后效果如下:

海洋     noun
是     verb:verb 是
如何     pronoun:interrogative pronoun:predicate interrogative pronoun
形成     verb
的     particle:particle 的/底
海洋     2.0
形成     2.0

如果我们把segments在加上一个参数pos_english=False,也就是不使用英语,那么输出就是

海洋     名词
是     动词:动词"是"
如何     代词:疑问代词:谓词性疑问代词
形成     动词
的     助词:的/底
海洋     2.0
形成     2.0

解释一下

这里的segment是切词的意思,返回的是tuple(token, pos),其中token就是切出来的词,pos就是语言属性

调用segment方法指定的pos_names参数可以是'all', 'child', 'parent',默认是parent, 表示获取该词性的最顶级词性,child表示获取该词性的最具体的信息,all表示获取该词性相关的所有词性信息,相当于从其顶级词性到该词性的一条路径

请尊重原创,转载请注明来源网站www.shareditor.com以及原始链接地址

词性分类表

查看nlpir的源代码中的pynlpir/docs/pos_map.rst,可以看出全部词性分类及其子类别如下:

    POS_MAP = {'n': ('名词', 'noun', {'nr': ('人名', 'personal name', {'nr1': ('汉语姓氏', 'Chinese surname'),'nr2': ('汉语名字', 'Chinese given name'),'nrj': ('日语人名', 'Japanese personal name'),'nrf': ('音译人名', 'transcribed personal name')}),'ns': ('地名', 'toponym', {'nsf': ('音译地名', 'transcribed toponym'),}),'nt': ('机构团体名', 'organization/group name'),'nz': ('其它专名', 'other proper noun'),'nl': ('名词性惯用语', 'noun phrase'),'ng': ('名词性语素', 'noun morpheme'),}),'t': ('时间词', 'time word', {'tg': ('时间词性语素', 'time morpheme'),}),'s': ('处所词', 'locative word'),'f': ('方位词', 'noun of locality'),'v': ('动词', 'verb', {'vd': ('副动词', 'auxiliary verb'),'vn': ('名动词', 'noun-verb'),'vshi': ('动词"是"', 'verb 是'),'vyou': ('动词"有"', 'verb 有'),'vf': ('趋向动词', 'directional verb'),'vx': ('行事动词', 'performative verb'),'vi': ('不及物动词', 'intransitive verb'),'vl': ('动词性惯用语', 'verb phrase'),'vg': ('动词性语素', 'verb morpheme'),}),'a': ('形容词', 'adjective', {'ad': ('副形词', 'auxiliary adjective'),'an': ('名形词', 'noun-adjective'),'ag': ('形容词性语素', 'adjective morpheme'),'al': ('形容词性惯用语', 'adjective phrase'),}),'b': ('区别词', 'distinguishing word', {'bl': ('区别词性惯用语', 'distinguishing phrase'),}),'z': ('状态词', 'status word'),'r': ('代词', 'pronoun', {'rr': ('人称代词', 'personal pronoun'),'rz': ('指示代词', 'demonstrative pronoun', {'rzt': ('时间指示代词', 'temporal demonstrative pronoun'),'rzs': ('处所指示代词', 'locative demonstrative pronoun'),'rzv': ('谓词性指示代词', 'predicate demonstrative pronoun'),}),'ry': ('疑问代词', 'interrogative pronoun', {'ryt': ('时间疑问代词', 'temporal interrogative pronoun'),'rys': ('处所疑问代词', 'locative interrogative pronoun'),'ryv': ('谓词性疑问代词', 'predicate interrogative pronoun'),}),'rg': ('代词性语素', 'pronoun morpheme'),}),'m': ('数词', 'numeral', {'mq': ('数量词', 'numeral-plus-classifier compound'),}),'q': ('量词', 'classifier', {'qv': ('动量词', 'verbal classifier'),'qt': ('时量词', 'temporal classifier'),}),'d': ('副词', 'adverb'),'p': ('介词', 'preposition', {'pba': ('介词“把”', 'preposition 把'),'pbei': ('介词“被”', 'preposition 被'),}),'c': ('连词', 'conjunction', {'cc': ('并列连词', 'coordinating conjunction'),}),'u': ('助词', 'particle', {'uzhe': ('着', 'particle 着'),'ule': ('了/喽', 'particle 了/喽'),'uguo': ('过', 'particle 过'),'ude1': ('的/底', 'particle 的/底'),'ude2': ('地', 'particle 地'),'ude3': ('得', 'particle 得'),'usuo': ('所', 'particle 所'),'udeng': ('等/等等/云云', 'particle 等/等等/云云'),'uyy': ('一样/一般/似的/般', 'particle 一样/一般/似的/般'),'udh': ('的话', 'particle 的话'),'uls': ('来讲/来说/而言/说来', 'particle 来讲/来说/而言/说来'),'uzhi': ('之', 'particle 之'),'ulian': ('连', 'particle 连'),}),'e': ('叹词', 'interjection'),'y': ('语气词', 'modal particle'),'o': ('拟声词', 'onomatopoeia'),'h': ('前缀', 'prefix'),'k': ('后缀' 'suffix'),'x': ('字符串', 'string', {'xe': ('Email字符串', 'email address'),'xs': ('微博会话分隔符', 'hashtag'),'xm': ('表情符合', 'emoticon'),'xu': ('网址URL', 'URL'),'xx': ('非语素字', 'non-morpheme character'),}),'w': ('标点符号', 'punctuation mark', {'wkz': ('左括号', 'left parenthesis/bracket'),'wky': ('右括号', 'right parenthesis/bracket'),'wyz': ('左引号', 'left quotation mark'),'wyy': ('右引号', 'right quotation mark'),'wj': ('句号', 'period'),'ww': ('问号', 'question mark'),'wt': ('叹号', 'exclamation mark'),'wd': ('逗号', 'comma'),'wf': ('分号', 'semicolon'),'wn': ('顿号', 'enumeration comma'),'wm': ('冒号', 'colon'),'ws': ('省略号', 'ellipsis'),'wp': ('破折号', 'dash'),'wb': ('百分号千分号', 'percent/per mille sign'),'wh': ('单位符号', 'unit of measure sign'),}),}

好,这回我们一下子完成了分词、词性标注、关键词提取。命名实体识别、句法分析以及查询问句分类我们之后再研究

浅谈聊天机器人 ChatBot 涉及到的技术点 以及词性标注和关键字提取相关推荐

  1. php字面量,浅谈js之字面量、对象字面量的访问、关键字in的用法

    一:字面量含义 字面量表示如何表达这个值,一般除去表达式,给变量赋值时,等号右边都可以认为是字面量. 字面量分为字符串字面量(string literal ).数组字面量(array literal) ...

  2. rnss和rdss的应用_浅谈北斗二代RDSS和RNSS组合技术.doc

    浅谈北斗二代RDSS和RNSS组合技术 浅谈北斗二代RDSS和RNSS组合技术 [摘 要]正在组网建设的"北斗二代"系统不仅完全继承兼容"北斗一代",在用户容量 ...

  3. rnss和rdss的应用_浅谈北斗二代RDSS与RNSS组合技术

    龙源期刊网 http://www.qikan.com.cn 浅谈北斗二代 RDSS 与 RNSS 组合技术 作者:陈德旭 王成皇 刘延鹏 来源:<中国科技博览> 2015 年第 07 期 ...

  4. 潇洒老师浅谈高光无痕注塑模具及成型技术

    浅谈高光无痕注塑模具及成型技术 高光是典型的无痕注塑的突出体现,但不是无痕注塑的全部.我们制作高光模具已经有几个年头了,主要是家电产品的外部装饰件,如前面板.装饰片等,但每次我们都遇到过同样的难题,即 ...

  5. 浅谈新兴室内外无线局域精准定位技术UWB(超宽带)

    浅谈新兴室内外无线局域精准定位技术UWB(超宽带) 1.UWB高精度定位系统概述 2.与传统定位比较 3.应用场景 4.实现uwb高精度定位 4.UWB室内定位的缺陷 5.应用案例 1.UWB高精度定 ...

  6. dom影像图形成数字地形图_浅谈数字正射影像图(DOM)的生产技术

    浅谈数字正射影像图 (DOM) 的生产技术 杜 磊 [摘 要] 摘 要 : 利用航空摄影像片和遥感卫片生产制作正射影像图 , 是地形图测 绘方法的又一技术 , 它补充和完善地形图所有的缺陷 , 制作的 ...

  7. 自己动手做聊天机器人 一-涉及知识【转】

    转自:http://www.shareditor.com/blogshow/?blogId=63 人工智能一直以来是人类的梦想,造一台可以为你做一切事情并且有情感的机器人,像哆啦A梦一样,现在这已经不 ...

  8. 如何用tf2.0训练中文聊天机器人chatbot

    向AI转型的程序员都关注了这个号???????????? 机器学习AI算法工程   公众号:datayx 一个可以自己进行训练的中文聊天机器人, 根据自己的语料训练出自己想要的聊天机器人,可以用于智能 ...

  9. 聊天机器人chatbot搭建及思考(TensorFlow)(附代码)

    端到端的对话系统 环境 Python 3.7 TensorFlow 1.14 模型结构 使用seq2seq + attention 模型 NLP应用 词向量层 单词->实数向量 降低输入维度(o ...

  10. 自己动手做聊天机器人 一-涉及知识

    人工智能一直以来是人类的梦想,造一台可以为你做一切事情并且有情感的机器人,像哆啦A梦一样,现在这已经不是一个梦了:iPhone里会说话的siri.会下棋的阿法狗.小度机器人.大白......,他们都能 ...

最新文章

  1. NAR:UNITE真菌鉴定ITS数据库——处理未分类和并行分类(数据库文章阅读笔记Markdown模板)...
  2. Ubuntu下Nginx/PHP/MYSQL开发环境的配置方法
  3. Maven常用参数及其说明
  4. 使用MAT做jvm的GC Roots溯源
  5. .Net——使用DataContractJsonSerializer进行序列化及反序列化基本操作
  6. 导入工程后 报错 The import javax.faces cannot be resolved 解决办法
  7. SpringMVC的返回值和参数类型
  8. matlab求系统根轨迹和系统增益,控制系统的根轨迹分析
  9. 基于R实现统计中的检验方法---卡方检验
  10. python xgboost建模过程_机器学习——XGBoost大杀器,XGBoost模型原理,XGBoost参数含义...
  11. 用tensorflow深度学习梵高的画并模仿
  12. 2021年起重机械指挥考试题及起重机械指挥模拟考试
  13. ArduPilot — Building the code(Linux/Ubuntu)
  14. BERT所占内存的计算
  15. u盘中的android文件夹图标不显示,个性化自己U盘里的文件夹图标不让其随着文件夹的移动而改变...
  16. oracle缩表空间大小,Oracle查询锁 表空间名称和大小 被锁的表
  17. 中文编程软件-习语言2013版 发布啦
  18. 使用Arduino烧写 Arduino BootLoader
  19. mysql 1-9_1.1.9 mysql
  20. 离心式固液分离过滤器 旋液分离器

热门文章

  1. 计算机无法查看隐藏文件夹,电脑里的隐藏文件夹怎么显示不出来啊?
  2. oracle增加dbf文件,oracle导入dbf文件工具下载|
  3. 【锟斤拷】的故事:谈谈汉字编码和常用字符集
  4. 独立访客数UV、访问量PV和IP数的区别
  5. 三维提取等值面的重建方法Marching Cubes
  6. 手机下拉框是怎么做出来
  7. java在控制台打印余弦曲线_控制台绘制正弦/余弦曲线
  8. C# for循环99乘法表
  9. clion ros debug clion配置ros环境及调试
  10. 秋天网站快速部署系统 一.入门使用