标题: 批处理版聊天机器人 [打印本页]
作者: cjiabing 时间: 2010-9-5 11:21 标题: 批处理版聊天机器人
看看新闻:
工程师带机器人女友与父母过圣诞节(图) 新浪 2009-12-27 02:58
机器人聊天实录:引出让人类震惊的智慧(图)-搜狐IT
和QQ机器人聊天,差点把我笑岔了【原创】
以前就有想法写个聊天机器人,只是这些新闻又一次激起了我的冲动。
用P尝试过好多次,因为技术有限,单靠一个人实在困难。
用机器人模拟人类是一项非常前沿的科技,与此有关的计算机研究有行为识别、视觉识别、AI、人工智能语言……
行为和视觉、听觉等等的识别注意靠传感器获得信息,然后利用计算机处理信息实现。
最难的应该算是“人工智能语言”了,也就是如何让计算机说话的问题。
人工智能语言涉及到计算机学、语言学、心理学、生理学、哲学、逻辑学、人类学……众多学科。
计算机可以实现发音(批处理也可以实现),也可以实现既定情景下的回答(一般用于客服)。
但计算机很难像人类那样会自己思考、和人类进行有效的交流……
实现思维是难的,但是因为“语言是思想的载体,思想是语言的灵魂。”,所以通过处理语言实现思维也是可能的。
语言就像一副扑克牌,牌的组合是变化的,但牌的个数是定的。
目前可用于“人工智能语言”的计算机语言主要有LISP、Prolog、Smalltalk、C++等。
批处理能够实现“人工智能语言”吗?我的直觉判断是可以的,至少在最低层次上的交流是可以实现的。
比如,制作一个可以聊天的批处理机器人。
最差或者最好的效果就像 QQ小 i 机器人一样。
可以吗?
可以。
——————————————————————————————————
下面谈谈思路。
最最简单的方式就是“标准型”或者“客服型”。
也就是在某一专业领域,你提问与此有关的问题,计算机搜索数据库,得到与你有关的答案。
说白了就是“搜索”,批处理也可以“FIND”啊。
这样,你只需一个程序界面以供输入搜索内容,附加一个相关数据库存储相关问题答案你就可以实现了。
这种不能称为智能,因为太简单、太死板了,体现不出智能的特点。
所谓智能,能够根据变化的情景条件做出合理有效的反应。
从语言层面讲,应该是能够理解对方语言包含的信息,能够据此做出适当的回答。
计算机如何理解人类语言中包含的信息?
比如,“我今天捡到一百块钱了。”我们人类会想,他真幸运,潜台词是,假如我也捡到就好了,捡到钱对自己是有利的,因此,我们会将其判断为好事。
假如后面加上“我把它交给警察叔叔了。”我们人类会想,他失去了一百块钱,真遗憾。
再进一步,钱交给了警察叔叔,警察叔叔又可能再交回丢失钱的人,这是好事。
假如我也丢了钱,有人捡到钱也交给警察,警察再交回给我,那是好事。所以,这件事情仍然是好事。
如此分析,计算机可以模拟人类的思维过程以及根据语言的特性来再现聊天过程:
1、以关键词来判断。查找关键词,根据关键词的组合来判断语句可能的意思。
2、以自我来判断。聊天中只有“我”和“你”,对方所说的每句话,都要对自我的信息进行检索和比对,并据此作答。
3、以上下文来判断。当有多个意思供选择时,如何进一步判断句子意思?上文,即前面的聊天记录,下文,主要是通过反问来确定。
为实现以上功能,计算机要有一定的文化素质。
“计算机”?“文化素质”?是的。
程序必须有一个“关键词字典”,用来理解(拆解和比对)输入的语言。
将输入的一个句子拆解成一个个字词,并查阅“关键词字典”,获得每个字词的词性、词义和用法。
结合词语在句子中的位置和上文中出现的意思进行进一步判断。
最后自己“理解”了,将这些关键词重新组合成一个句子,这个句子应该和输入的句子意思一致,我们称为“确认”或“复述”。
为实现以上过程,可能还需要对句法、词法做一定的准备。包括代码、词典等等。
“理解”和“复述”之后,开始回答问题,怎么回答?还是要检索数据库中的答案。——看来逃不了这个弊端。
但程序可以增加一个条件判断,就是根据上下文或者随机来获取这些答案。
这些答案储存在一个数据库中,一般有十来个备选答案。但是可以使用变量,可以随机挑选。
但这些都避免不了计算机的“知识有限”。为了扩展答案,计算机必须学会“学习”
计算机学习?是的。
什么是学习啊?搜集资料——整理——储存。
用P来说就是通过获取聊天记录,将聊天记录分类储存。下次遇到类似的问题时可以使用以前的聊天记录。
前面说了,计算机需要文化,文化哪里来?计算机的文化一个来自互联网,一个来自硬盘数据。
只要你在硬盘上储存足够的文史百科知识以供计算机检索,一旦计算机遇到问题无法作答,它可以查阅这些资料来作答。
……
说白了,就是在固定的模式上尽量扩展P处理聊天时获得答案的情境性、随机性和有效性,不能敷衍了事和胡言乱语。
整个过程都需要文本处理。而这也是批处理薄弱点——目前我们看到的。
请各路高手或者有兴趣的朋友一起来挑战。组成开发团队也好。
——————————————————————————
开始着手,希望得到各位的指点和帮助,谢谢!~2010/09/09
[ 本帖最后由 cjiabing 于 2010-9-9 17:06 编辑 ]
作者: netbenton 时间: 2010-9-5 13:03
哇咔咔~我太感兴趣啦~
作者: qq506657335 时间: 2010-9-5 14:48
有意思,但实现起来有点难
作者: luckboy45 时间: 2010-9-5 17:57
思想很好,你能实现,我用纯脚本“系统日志扫描助手”和你换
下面是我的系统日志 扫描速度飞快,可以在20秒内完成系统全面扫描,优越于SRENG日志,是反病毒杰出的贡献,体积小巧,只有17KB,包含完整的工作界面和作者说明,及动态扫描,为08年10月编写的依靠外部工具实现的,09年10月完美用纯脚本实现的,以前发过挑战,每个人只想看源代码,一直没发,后来今年硬盘坏掉后数据修复抢救出来的了,你如果能实现人机对聊,我和你换代码学习!~
作者: hfg1977 时间: 2010-9-5 17:59
最差或者最好的效果就像 QQ小 i 机器人一样。
可以吗?
可以。
做QQ那样的机器人是没有意义的, 它们在聊天机器人领域中被划分到 "弱智"机器人.
建议LZ再google一下聊天机器人,要做就做ALICE那样的 "智能"机器人.
作者: cjiabing 时间: 2010-9-5 18:52
原帖由 hfg1977 于 2010-9-5 17:59 发表
做QQ那样的机器人是没有意义的, 它们在聊天机器人领域中被划分到 "弱智"机器人.
建议LZ再google一下聊天机器人,要做就做ALICE那样的 "智能"机器人.
在线聊天:
http://i.xiaoi.com/
http://cleverbot.com/
http://www.pandorabots.com/pandora/talk?botid=f5d922d97e345aa1
http://vhost.oddcast.com/support/examples/API/sayAIResponse/sayAIResponse.html
http://www.pandorabots.com/pandora/talk?botid=f5d922d97e345aa1&skin=custom_input
http://showcase.pandorabots.com/pandora/talk?botid=d10d53a63e345abf&skin=iframe
http://international.jabberwacky.com/
基本介绍
世界上最早的聊天机器人诞生于20世纪80年代,这款机器人名为“阿尔贝特”,用BASIC语言编写而成。但今天的互联网上,已出现诸如“比利”、“艾丽斯”等聊天机器人。据悉,还有一个“约翰·列侬人工智能计划”,以再现当年“甲壳虫”乐队主唱的风采为目标。
编辑本段各种聊天机器人
TalkBot
最初作为一个在线聊天系统,TalkBot 是克莉斯·克沃特于1998年用javascript 和PERL语言编写完成的,并于2001年和2002年两次获得“Chatterbox Challenge”比赛的冠军。
Elbot艾尔伯特
在德语聊天机器人查理的程序改进后诞生了艾尔伯特,2000年底德语版艾尔伯特就开始在线聊天,并且到了2001年连英语版也有了。在2003年获得“Chatterbox Challenge”比赛冠军。
eLise伊莉斯
讲德语的聊天机器人。伊莉斯由Java分子编辑器前端、Java服务器以及一种知识编辑器组成。其中,知识程序包括了1100多节点,而且还在不停升级。
Alice艾丽斯
1995年11月23日,艾丽斯Alice诞生了。艾丽斯的名字是由英文“人工语言在线计算机实体”的头一个字母的缩写拼成。科学家华莱士将这个聊天程序安装到网络服务器,然后待在一边观察网民会对它说什么。随着华莱士对艾丽斯的升级与艾丽斯聊天经验的日渐丰富,艾丽斯越来越厉害。2000年、2001年、2004年艾丽斯三夺勒布纳奖。艾丽斯是乔治的强劲对手,曾一度被认为是最聪明的聊天机器人。
Laylahbot蕾拉伯特
由原始的艾丽斯程序改头换脸而来。整个程序和华莱士在2002年编写的艾丽斯的程序基本没什么差别。蕾拉伯特的存在是试图对基本的“人工语言在线计算机实体”聊天机器人的性能、功能提供一个范本。
编辑本段中文聊天机器人
中文聊天机器人技术的发展
基于中文聊天的机器人技术也日趋成熟,国内已经出现了不少智能聊天机器人,比如赢思软件的小i,爱博的小A,还有小强等等。这些机器人也已经日益成为网民上网的好伙伴。赢思软件推出的小i还有很多丰富的功能,比如msn群,让办公室白领能够更加轻松的交流。
另外,聊天机器人也被应用到了商务和政务领域,很多网站上已经有了msn机器人或者web机器人,让互动交流变得更加方便和人性化。
编辑本段自然语言的机器人
FunnyAI是一个自然语言的机器人 FunnyAI是一个自然语言的机器人。如果你的话机器人无法理解,机器人会自动发送到管理中心。你输入:“Help”或“?”就可以查看到当前帮助。现在AI还不是很成熟,所以,尽量按照训练的样本来训练FunnyAI http://www.funnyai.com/AI/FunnyAI.html MSN用:[email=msgerai@hotmail.com]msgerai@hotmail.com[/email] GTalk用:[email=msgerai@gmail.com]msgerai@gmail.com[/email], [email=ai.funny@gmail.com]ai.funny@gmail.com[/email]
[ 本帖最后由 cjiabing 于 2010-9-5 18:59 编辑 ]
作者: cjiabing 时间: 2010-9-5 19:04
原帖由 luckboy45 于 2010-9-5 17:57 发表
思想很好,你能实现,我用纯脚本“系统日志扫描助手”和你换
下面是我的系统日志 扫描速度飞快,可以在20秒内完成系统全面扫描,优越于SRENG日志,是反病毒杰出的贡献,体积小巧,只有17KB,包含完整的工作界面和 ...
谢了,很好很强大!~
对你的脚本很感兴趣,可是,相比之下,假如能做好聊天脚本,比起你的来意义更大。
批处理实现起来确实有难度,但相信路是可以走得通的。
大家一起努力吧,我技术不是很好呢!~
作者: xuxiao 时间: 2010-9-5 20:37
顶!!!!小弟膜拜~!!!!!
作者: Batcher 时间: 2010-9-5 20:59 标题: 回复 4楼 的帖子
你不想开源是可以理解的,但是能否请你把附件压缩一下再上传,以便节约论坛空间。
作者: netbenton 时间: 2010-9-6 19:16
应该可以实现~~
但要付出“心血”……
作者: cjiabing 时间: 2010-9-9 17:11 标题: 如何过滤重复的词语?
以下代码用于将一个输入的句子拆解成词语,但拆解过程中出现重复,比如输入“我喜欢鸭肉”,会得到“鸭肉”和“鸭”、“肉”三个词语,如何过滤才能提取“鸭肉”(长字节)而非“鸭”或“肉”(短字节)。
代码中有四行条件判断,用于处理词语是四个字的、三个字的、两个字的和一个字的情况。当两个字的词语与三个字的词语有部分重复时,如何只提取三个字符的,而忽略两个字符的?其它的以此类推,当遇到部分重复而字长不同时,取汉字较多的而舍弃汉字较少的。
比如:我喜欢在面包车上一边吃面包一边看北京天安门门楼的门。
其中与“面”字有关的四个词语:“面包车”、“面包”、“面”、“包”,如何提取三个字“面包车”的,而忽略两个和一个字的?- @echo off&setlocal enabledelayedexpansion
- :fjjz
- if exist S.txt type S.txt>>talklog.txt&cd.>S.txt
- cls
- set /p inf= 你对电脑说:
- for /l %%i in (0,1,100) do (
- set strdd=!inf:~%%i,4!&if defined strdd set strddo=!strdd:~3,1!&if defined strddo for /f "tokens=1,*" %%a in (dictionary.txt) do if "%%a"=="!strdd!" echo 4 %%i %%a %%b %%i,4
-
- set strcc=!inf:~%%i,3!&if defined strcc set strcco=!strdd:~2,1!&if defined strcco for /f "tokens=1,*" %%e in (dictionary.txt) do if "%%e"=="!strcc!" echo 3 %%i %%e %%f %%i,3
-
- set strbb=!inf:~%%i,2!&if defined strbb set strbbm=!strbb:~1,1!&if defined strbbm for /f "tokens=1,*" %%x in (dictionary.txt) do if "%%x"=="!strbb!" echo 2 %%i %%x %%y %%i,2
-
- set straa=!inf:~%%i,1!&if defined straa for /f "tokens=1,*" %%m in (dictionary.txt) do if "%%m"=="!straa!" echo 1 %%i %%m %%n %%i,1
- )>>S.txt
- type S.txt
- pause
- goto fjjz
- 需要字典支持,附件中包含字典。而且字典目前只支持部分字词,查看字典第一列是可以用的字词。
复制代码
作者: cjiabing 时间: 2010-9-10 19:15 标题: 自然语言理解与中文分词
自然语言通常是指一种自然地随文化演化的语言。英语、汉语、日语为自然语言的例子,而世界语则为人造语言,即是一种由人蓄意为某些特定目的而创造的语言。
不过,有时所有人类使用的语言(包括上述自然地随文化演化的语言,以及人造语言)都会被视为“自然”语言,以相对于如编程语言等为计算机而设的“人造”语言。这一种用法可见于自然语言处理一词中。自然语言是人类交流和思维的主要工具。
自然语言是人类智慧的结晶,自然语言处理是人工智能中最为困难的问题之一,而对自然语言处理的研究也是充满魅力和挑战的。随着计算机和互联网的广泛应用,计算机可处理的自然语言文本数量空前增长,面向海量信息的文本挖掘、信息提取、跨语言信息处理、人机交互等应用需求急速增长,自然语言处理研究必将对我们的生活产生深远的影响。
自然语言处理是计算机科学领域与人工智能领域中的一个重要方向。它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法。
Natural Language Understanding 俗称人机对话。人工智能的分支学科。研究用电子计算机模拟人的语言交际过程,使计算机能理解和运用人类社会的自然语言如汉语、英语等,实现人机之间的自然语言通信,以代替人的部分脑力劳动,包括查询资料、解答问题、摘录文献、汇编资料以及一切有关自然语言信息的加工处理。这在当前新技术革命的浪潮中占有十分重要的地位。研制第 5代计算机的主要目标之一,就是要使计算机具有理解和运用自然语言的功能。
自然语言理解是一门新兴的边缘学科,内容涉及语言学、心理学、逻辑学、声学、数学和计算机科学,而以语言学为基础。自然语言理解的研究,综合应用了现代语音学、音系学语法学、语义学、语用学的知识,同时也向现代语言学提出了一系列的问题和要求。本学科需要解决的中心问题是:语言究竟是怎样组织起来传输信息的?人又是怎样从一连串的语言符号中获取信息的?
这一领域的研究将涉及自然语言,即人们日常使用的语言,包括中文、英文、俄文、日文、德文、法文等等,所以它与语言学的研究有着密切的联系,但又有重要的区别。自然语言处理并不是一般地研究自然语言,而在于研制能有效地实现自然语言通信的计算机系统,特别是其中的软件系统。因而它是计算机科学的一部分。
中文分词 (Chinese Word Segmentation) 指的是将一个汉字序列切分成一个一个单独的词。分词就是将连续的字序列按照一定的规范重新组合成词序列的过程。我们知道,在英文的行文中,单词之间是以空格作为自然分界符的,而中文只是字、句和段能通过明显的分界符来简单划界,唯独词没有一个形式上的分界符,虽然英文也同样存在短语的划分问题,不过在词这一层上,中文比之英文要复杂的多、困难的多。
中文分词是文本挖掘的基础,对于输入的一段中文,成功的进行中文分词,可以达到电脑自动识别语句含义的效果。
中文分词技术属于自然语言处理技术范畴,对于一句话,人可以通过自己的知识来明白哪些是词,哪些不是词,但如何让计算机也能理解?其处理过程就是分词算法。
分词算法分类
现有的分词算法可分为三大类:基于字符串匹配的分词方法、基于理解的分词方法和基于统计的分词方法。按照是否与词性标注过程相结合,又可以分为单纯分词方法和分词与标注相结合的一体化方法。
1、基于字符串匹配的分词方法
这种方法又叫做机械分词方法,它是按照一定的策略将待分析的汉字串与一个“充分大的”机器词典中的词条进行配,若在词典中找到某个字符串,则匹配成功(识别出一个词)。按照扫描方向的不同,串匹配分词方法可以分为正向匹配和逆向匹配;按照不同长度优先匹配的情况,可以分为最大(最长)匹配和最小(最短)匹配;常用的几种机械分词方法如下:
1)正向最大匹配法(由左到右的方向);
2)逆向最大匹配法(由右到左的方向);
3)最少切分(使每一句中切出的词数最小);
4)双向最大匹配法(进行由左到右、由右到左两次扫描)
还可以将上述各种方法相互组合,例如,可以将正向最大匹配方法和逆向最大匹配方法结合起来构成双向匹配法。由于汉语单字成词的特点,正向最小匹配和逆向最小匹配一般很少使用。一般说来,逆向匹配的切分精度略高于正向匹配,遇到的歧义现象也较少。统计结果表明,单纯使用正向最大匹配的错误率为1/169,单纯使用逆向最大匹配的错误率为1/245。但这种精度还远远不能满足实际的需要。实际使用的分词系统,都是把机械分词作为一种初分手段,还需通过利用各种其它的语言信息来进一步提高切分的准确率。
一种方法是改进扫描方式,称为特征扫描或标志切分,优先在待分析字符串中识别和切分出一些带有明显特征的词,以这些词作为断点,可将原字符串分为较小的串再来进机械分词,从而减少匹配的错误率。另一种方法是将分词和词类标注结合起来,利用丰富的词类信息对分词决策提供帮助,并且在标注过程中又反过来对分词结果进行检验、调整,从而极大地提高切分的准确率。
对于机械分词方法,可以建立一个一般的模型,在这方面有专业的学术论文,这里不做详细论述。
2、基于理解的分词方法
这种分词方法是通过让计算机模拟人对句子的理解,达到识别词的效果。其基本思想就是在分词的同时进行句法、语义分析,利用句法信息和语义信息来处理歧义现象。它通常包括三个部分:分词子系统、句法语义子系统、总控部分。在总控部分的协调下,分词子系统可以获得有关词、句子等的句法和语义信息来对分词歧义进行判断,即它模拟了人对句子的理解过程。这种分词方法需要使用大量的语言知识和信息。由于汉语语言知识的笼统、复杂性,难以将各种语言信息组织成机器可直接读取的形式,因此目前基于理解的分词系统还处在试验阶段。
3、基于统计的分词方法
从形式上看,词是稳定的字的组合,因此在上下文中,相邻的字同时出现的次数越多,就越有可能构成一个词。因此字与字相邻共现的频率或概率能够较好的反映成词的可信度。可以对语料中相邻共现的各个字的组合的频度进行统计,计算它们的互现信息。定义两个字的互现信息,计算两个汉字X、Y的相邻共现概率。互现信息体现了汉字之间结合关系的紧密程度。当紧密程度高于某一个阈值时,便可认为此字组可能构成了一个词。这种方法只需对语料中的字组频度进行统计,不需要切分词典,因而又叫做无词典分词法或统计取词方法。但这种方法也有一定的局限性,会经常抽出一些共现频度高、但并不是词的常用字组,例如“这一”、“之一”、“有的”、“我的”、“许多的”等,并且对常用词的识别精度差,时空开销大。实际应用的统计分词系统都要使用一部基本的分词词典(常用词词典)进行串匹配分词,同时使用统计方法识别一些新的词,即将串频统计和串匹配结合起来,既发挥匹配分词切分速度快、效率高的特点,又利用了无词典分词结合上下文识别生词、自动消除歧义的优点。
另外一类是基于统计机器学习的方法。首先给出大量已经分词的文本,利用统计机器学习模型学习词语切分的规律(称为训练),从而实现对未知文本的切分。我们知道,汉语中各个字单独作词语的能力是不同的,此外有的字常常作为前缀出现,有的字缺常常作为后缀(“者”“性”),结合两个字相临时是否成词的信息,这样就得到了许多与分词有关的知识。这种方法就是充分利用汉语组词的规律来分词。这种方法的最大缺点是需要有大量预先分好词的语料作支撑,而且训练过程中时空开销极大。
到底哪种分词算法的准确度更高,目前并无定论。对于任何一个成熟的分词系统来说,不可能单独依靠某一种算法来实现,都需要综合不同的算法。例如,海量科技的分词算法就采用“复方分词法”,所谓复方,就是像中西医结合般综合运用机械方法和知识方法。对于成熟的中文分词系统,需要多种算法综合处理问题。
编辑本段分词中的难题
有了成熟的分词算法,是否就能容易的解决中文分词的问题呢?事实远非如此。中文是一种十分复杂的语言,让计算机理解中文语言更是困难。在中文分词过程中,有两大难题一直没有完全突破。
1、歧义识别
歧义是指同样的一句话,可能有两种或者更多的切分方法。主要的歧义有两种:交集型歧义和组合型歧义,例如:表面的,因为“表面”和“面的”都是词,那么这个短语就可以分成“表面 的”和“表 面的”。这种称为交集型歧义(交叉歧义)。像这种交集型歧义十分常见,前面举的“和服”的例子,其实就是因为交集型歧义引起的错误。“化妆和服装”可以分成“化妆 和 服装”或者“化妆 和服 装”。由于没有人的知识去理解,计算机很难知道到底哪个方案正确。
交集型歧义相对组合型歧义来说是还算比较容易处理,组合型歧义就必需根据整个句子来判断了。例如,在句子“这个门把手坏了”中,“把手”是个词,但在句子“请把手拿开”中,“把手”就不是一个词;在句子“将军任命了一名中将”中,“中将”是个词,但在句子“产量三年中将增长两倍”中,“中将”就不再是词。这些词计算机又如何去识别? 如果交集型歧义和组合型歧义计算机都能解决的话,在歧义中还有一个难题,是真歧义。真歧义意思是给出一句话,由人去判断也不知道哪个应该是词,哪个应该不是词。例如:“乒乓球拍卖完了”,可以切分成“乒乓 球拍 卖 完 了”、也可切分成“乒乓球 拍卖 完 了”,如果没有上下文其他的句子,恐怕谁也不知道“拍卖”在这里算不算一个词。
2、新词识别
命名实体(人名、地名)、新词,专业术语称为未登录词。也就是那些在分词词典中没有收录,但又确实能称为词的那些词。最典型的是人名,人可以很容易理解。句子“王军虎去广州了”中,“王军虎”是个词,因为是一个人的名字,但要是让计算机去识别就困难了。如果把“王军虎”做为一个词收录到字典中去,全世界有那么多名字,而且每时每刻都有新增的人名,收录这些人名本身就是一项既不划算又巨大的工程。即使这项工作可以完成,还是会存在问题,例如:在句子“王军虎头虎脑的”中,“王军虎”还能不能算词? 除了人名以外,还有机构名、地名、产品名、商标名、简称、省略语等都是很难处理的问题,而且这些又正好是人们经常使用的词,因此对于搜索引擎来说,分词系统中的新词识别十分重要。目前新词识别准确率已经成为评价一个分词系统好坏的重要标志之一。
中文分词的应用
目前在自然语言处理技术中,中文处理技术比西文处理技术要落后很大一段距离,许多西文的处理方法中文不能直接采用,就是因为中文必需有分词这道工序。中文分词是其他中文信息处理的基础,搜索引擎只是中文分词的一个应用。其他的比如机器翻译(MT)、语音合成、自动分类、自动摘要、自动校对等等,都需要用到分词。因为中文需要分词,可能会影响一些研究,但同时也为一些企业带来机会,因为国外的计算机处理技术要想进入中国市场,首先也是要解决中文分词问题。在中文研究方面,相比外国人来说,中国人有十分明显的优势。
分词准确性对搜索引擎来说十分重要,但如果分词速度太慢,即使准确性再高,对于搜索引擎来说也是不可用的,因为搜索引擎需要处理数以亿计的网页,如果分词耗用的时间过长,会严重影响搜索引擎内容更新的速度。因此对于搜索引擎来说,分词的准确性和速度,二者都需要达到很高的要求。目前研究中文分词的大多是科研院校,清华、北大、哈工大、中科院、北京语言学院、东北大学、IBM研究院、微软中国研究院等都有自己的研究队伍,而真正专业研究中文分词的商业公司除了海量科技以外,几乎没有了。科研院校研究的技术,大部分不能很快产品化,而一个专业公司的力量毕竟有限,看来中文分词技术要想更好的服务于更多的产品,还有很长一段路。
[ 本帖最后由 cjiabing 于 2010-9-10 19:17 编辑 ]
作者: hkxc 时间: 2010-9-11 23:17
用其他语言实现起来比较容易。
或者做个没技术的,相当于是个中转。
把别人输入的话发送给某网站的机器人,再获取某网站的机器人的回应。
曾经做过这样的asp小偷。。
作者: cjiabing 时间: 2010-9-13 10:20 标题: 批处理中文分词正向最大匹配法
终于弄明白了一个小问题的用法,很好的解决了词语的选择,实现了批处理版的中文分词正向最大匹配法。其实问题很简单,只是原来我一直没弄懂它的原理。
当句子中含有类似“面包车”一类由三个字组成的词语,并且该词语可以切分为“面包”、“面”、“包”、“车”等两个字组成的词和一个字组成的词时,挑选由三个字组成的词语而忽略由两个字组成的词语——同样的字组成的词语中,挑选字最多的词语作为结果。
如句子:我喜欢在面包车上一边吃面包一边看北京天安门门楼的门
仍需要以上提供的字典的支持。字典没有的字请自行添加。- @echo off&setlocal enabledelayedexpansion
- :fjjz
- cls
- set /p inf= 你对电脑说:
- echo.
- cd.>S.TXT
- for /l %%i in (0,1,100) do (
- set strdd=!inf:~%%i,4!&if defined strdd set strddo=!strdd:~3,1!&if defined strddo for /f "tokens=1,*" %%a in (dictionary.txt) do if "%%a"=="!strdd!" echo 4 %%i %%a %%b %%i,4
- set strcc=!inf:~%%i,3!&if defined strcc set strcco=!strdd:~2,1!&if defined strcco for /f "tokens=1,*" %%e in (dictionary.txt) do if "%%e"=="!strcc!" echo 3 %%i %%e %%f %%i,3
- set strbb=!inf:~%%i,2!&if defined strbb set strbbm=!strbb:~1,1!&if defined strbbm for /f "tokens=1,*" %%x in (dictionary.txt) do if "%%x"=="!strbb!" echo 2 %%i %%x %%y %%i,2
- set straa=!inf:~%%i,1!&if defined straa for /f "tokens=1,*" %%m in (dictionary.txt) do if "%%m"=="!straa!" echo 1 %%i %%m %%n %%i,1
- )>>S.TXT
- set var=-1
- echo 切分结果:
- echo.
- :lp
- set /a var+=1
- for /f "tokens=1,2,3,*" %%i in (S.txt) do (
- if !var!==%%j (
- set /p k= 【%%k】<nul
- rem echo %%k 1
- set /a var=%%j+%%i
- )
- )
- if %var% lss 30 goto lp
- echo.
- echo.
- pause
- goto fjjz
复制代码
[ 本帖最后由 cjiabing 于 2010-9-13 10:26 编辑 ]
作者: cjiabing 时间: 2010-9-14 18:46
经过艰苦努力,完成第一阶段任务——批处理中文分词的实现:
http://www.bathome.net/thread-9296-1-1.html
作者: caruko 时间: 2010-12-20 18:37
其实,让计算机理解才是最难的。。。
作者: hnqx 时间: 2011-2-20 18:48 标题: 回复 1楼 的帖子
早期传奇有过一段机器人,但不是很智能。接着就是大话西游推出了自己的机器人,但数据库词组.词不是很完整,但是比传奇的又有些智能,它们所收录的数据都是记载在TXT上来完成的。然后通过数据库来调用的。你要是真想搞个比较好点的机器人,建议你先把四库全书或当代的新华词..字典收录完成在说吧。
............不是打搅你的信心,等你把库文编纂好了,估计P要来解读库文的话最少也要30秒的时间,更不要谈什么分析处理了。
作者: pict 时间: 2013-6-12 22:32
回复 4# luckboy45
聊天机器人值得一试啊,4楼
作者: L-殇 时间: 2014-3-5 02:28
本帖最后由 L-殇 于 2014-3-5 02:32 编辑
首先声明我只是感兴趣,实际能力不怎么样.请不要在意...
最近注意到聊天机器人,于是又去下载了个我删了又删的工具(编程工具vb,vc,java,易语言,按键精灵(应该不算)都试过,不懂语言,很费力,经常中断或放弃),这次弄着弄着弄到路由器了...然后没网的时候注意到bat,有较完整的说明,感觉不错...做了个简单应答的...后来看到这里,感觉那差距....不废话了...
正文:词库分类,情绪判断
貌似你分享的是有单字,双字,三字,四字4次处理的.我想如果分开分别用4个词库应该会好点吧...
然后应该可以弄个除通用答话外其他环境的回话,还有数据库(用户品行),比如
某个无记录的人(关于习性)如果突然来了句坏话,可以给其一个(心情不好)的定义,让机器人处于(调解)的状态(解锁相应词库与关闭不需要的),
如果那人继续,则给其(找茬)的定义,让机器人(劝告)及词库解锁于关闭,
任然继续,那就开"特殊词库"对骂算了...
呃,貌似忘了点什么...就先这样吧...
诶,4年了...不知道还在不在...
作者: cjiabing 时间: 2014-3-5 11:52
回复 19# L-殇
开发智能聊天是非常困难的,批处理也应付不来,。
如果开发专家系统,就是那种智能问答系统还是可行的。
后生可畏,加油吧!
作者: L-殇 时间: 2014-3-7 01:15
回复 20# cjiabing
经过几天的拖拉断续(除了那个交集bat没看懂先放着),终于弄出一个自己性格的分词bat样本...自己的XP测试可用,请指点...
传送点:CS=初始,D=点(用于跳出重复)
变量:A=开始断句位置,Y=语句,C=分出来的词,C1=测试C是否为理想对象而临时出现
For变量:%%a=断句位,%%b=先四字后三字后...,%%c=为了比b小1而临时出现
文件:C%%b=就是上面说的分词库,H=缓存,或者说历史记录
注:rem 是后来加的,并没有测试是否兼容.
刚刚突然想到先准确判断句长再分词,但貌似又没必要,请指点...弄完这个就完成分词,回话,联网三阶段之一啦...
至于后生可畏...其实我只是感兴趣而且此bat系统自带并有较完整(刚刚突然发现help里没有ping!竟然还有隐藏!)的说明所以尝试了一下...- @echo off & setlocal enabledelayedexpansion
- &rem 关闭显示与解决变量延迟问题,也可以用两种相应符号玩变量中的变量
- :CS
- rem 一个回头的传送点
- set A=0
- rem 默认为从句首开始断句
- cls
- rem 清屏
- set /p Y=输入:
- rem 获取句子
- echo 输出:>>H
- rem 提前注入"输出:"到缓存
- if exist H cd.>H
- rem 清空缓存空间
- :D
- rem 一个让截词不重复的传送点
- for /l %%a in (!A!,1,100) do (
- rem 从楼主那看来的截词法
- for /l %%b in (4,-1,1) do (
- rem 先截四字再三字再二.....
- set C=!Y:~%%a,%%b!
- rem 截出一个词并给予调用方法
- if defined C (
- rem 判断是否截到词
- set /a b=%%b-1
- rem 为了获取一个比%%b小1的数
- for %%c in (!b!) do (
- rem 为了让此数字成功融入变量成为变量从的变量
- set C1=!C:~%%c,1!
- rem 为了判断,截出C的末词
- if defined C1 (
- rem 判断接出的词是否理想
- for /f "tokens=1,*" %%d in (C%%b) do (
- rem 获取词库里的词
- if "%%d"=="!C!" (
- rem 判断是否截词成功
- echo %%d
- rem 显示成功截出的词(因为后面放进了"缓存",所以不再显示,但也需要)
- set /a A=%%a+%%b
- rem 设置跳过重复的量
- goto D
- rem 跳过重复
- )))))))>>H
- rem 上面用了几个大句子,这里结清并将结果放入"缓存"
- for /f %%a in (H) do set /p Y=%%a <nul
- rem 显示分词的结果,如果词库内不存在的字就会消失
- echo.
- rem 差不多就算回车一下
- pause
- rem 稍等以便查看结果
- goto CS
- rem 开始新的轮回
复制代码
突然想起还要分库的,马上去弄了个...并加上附件..- @echo off & setlocal enabledelayedexpansion
- rem 虽然不确定变量中的变量是否高效,但个人不是很喜欢基本重复的句子
- for /f "tokens=1,*" %%a in (C) do (
- rem 提取词库每一行
- for /l %%c in (1,1,4) do (
- rem 分别识别单字,双字,三.....
- set /a S=%%c-1
- rem 获取小一数
- for %%d in (!S!) do (
- rem 变量中的变量
- set C=%%a
- rem 获取词语
- set C1=!C:~%%d,1!
- rem 截应该出现的词末
- set C2=!C:~%%c,1!
- rem 截不应该出现的词末末
- if defined C1 (
- rem 判断词语是否够长
- if not defined C2 (
- rem 判断词语是否超长
- echo %%a %%b >>C%%c
- rem 将匹配词语放入相应词库
- )))))
复制代码
作者: yixinyichao 时间: 2014-8-2 11:43
研究中,用asp應該簡單的多
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |