Eisen's Blog

© 2023. All rights reserved.

毕设那点儿事情

April 14, 2011

最近在做毕业设计了,刚刚终于让那个PyAIML可以学习中文的语句了,这个速度真的大大慢于我的预期。我想在这里写出来我对这个东西做一个任务分解,详细的说说每一块应该做什么。 首先,当然是要概述一些这个东西咯。我想要用目前的PyAIML去构建一个支持中文的ALICE。这种基于模板匹配的聊天机器人我觉得还是应该有一个自动学习的机制才能有所发展。最后,为了让这个聊天机器人可以更好的发展,需要提供更多的接口,让它可以通过不能的接口和别人去聊天,比如QQ,MSN等等。

我把问题分成如下几个:

  • 如何去支持中文
  • 如何构建自动学习
  • 怎样添加接口

中文的问题倒不是很难,可就是很讨厌。最近跑程序见到最多的错误就是UnicodeEncodeError和UnicodeDecodeError,恶心的不得了,每次看到这两个错误我都觉得自己以后应该去一个7位ascii就可以包含所有字符的国家活着去。编程这么久,遇到的最多的问题就是这讨厌的编码问题,mysql乱码,数据爬取乱码等等。写完这篇日志,我就要再写一篇专门将Python的编码相关的日志。我们回归正题,AIML是以词为单位进行分词的,以空格为词的分隔。天然中文之间是没有空格的,我要做的包括:

  • 为用户输入的中文字符之间添加空格
  • 剔除中文输出之间的空格

构建自动学习是最近工作的主题,随着中英的测试成功后,这个也告一段落了。AIML的Specification中有说标签可以执行代码的。可PyAIML做的太槽了,只能运行shell代码,而且是1行!So I hava to do it by myself....

我想尽各种办法让python可以运行下的python代码,在这里遇到了诸多的难题。首先,如何让python代码可以在运行时嵌入到python当前环境中呢?这里,伟大的stackoverflow拯救了我,我找到了how to input python code in run time and execute it ?, oh shit, i suddenly can not type Chinese in ubuntu now, what a shit os, it is better to be a server!!!! 好吧,我来到了我可爱的windows,一切继续吧。execfile可以把一个临时文件的代码相当于嵌入到当前的环境中。但是python是以indent为格式进行代码解析的。但是我们可爱的AIML默认把string 之间的 's+' 给删除掉了,我首先做的就是为system设置xml:space = "preserve"。然后,我写了一个算法可以格式化这些内容。之后就是无尽的debug了,比如全局变量和局部变量的问题呀,比如execfile无法嵌入import声明呀,比如中文字符问题呀。一坨一坨的,纠结了很久。这里就提一提我最后遇到的一个bug吧。

file = codecs.open(filename, 'r+', encoding='utf8')
xmldom = minidom.parse(file)

可耻的 minidom.parse 报错了,我纠结了很久很久!关键是之前已经因为各种bug烦的受不了了,遇到这个bug根本就没仔细看错误说明,开始根本就没注意是 parse 方法报错了!!!再次自责自己的不仔细,不淡定!最后,我删掉了那个codecs,让filename直接传递给 minidom.parse 就没问题了,一切就解决了!!!

把大量的时间耗费在某些很白痴的 bug 上真的很打击我,我觉得这些时间真的是白白浪费了,明明可以做很多事情的时间,就是因为不仔细,不细心就丢失了。开始怀疑自己平时编程是不是养成了太多的坏毛病。最近在看新浪名校公开课的stanford的编程基础课,那里老师就说,如果你有了编程基础但是养成了一些坏习惯还不如那些一张白纸,什么都不知道的门外汉好教呢。我觉得我就有点坏毛病了,很多东西浅尝辄止实在是不能成大器。

最后一个就是添加接口的问题了,我现在最想添加的就是 QQ 的接口了,不过看情况吧,不知道能不能做到那一地步,因为为了让机器人足够聪明,我还有很多工作要做,如果来不及的话,我就添加个 web 界面就OK了吧:)