和游戏里的人物人工智能对话

未来游戏发展的趋势:和游戏里的人物智能对话。

目前做了一个,展示一下。在兔山公寓设置了一个可智能对话的女仆机器人。

每隔一段时间,我就会更新游戏。


你可以教机器人知识,然后提问教过的知识,或机器人已知的知识。

也可以教机器人什么样的事情,应该怎样回答。

由于个人无力做庞大的知识库,所以知识库是空的,只能先教后问。

教和问不要一起发送,分两次写。一些用户把教和问写到一起了,导致机器人无法回答。

如果机器人还不能回答,可能因为句子里包含了词库没有的词语。毕竟我也无力收录所有词语,只收录了一些常用的词语。


对话时,由于之前输入网址时,输入法已切换为英文,请先把输入法切换回中文,再输入,否则英文会激发快捷键。

智能对话的快捷键:
M键:打开智能对话说明。点击翻页,鼠标右键返回。
N键:关闭智能对话的输入框
B键:查看机器人的状态


问答方法

提问动作执行者(主语)或动作对象(宾语)用:谁、什么、啥

教:猫吃鼠

问:猫吃什么

答:鼠

注意1:不要写“教:”直接写猫吃鼠。也不要写“问:”直接写猫吃什么。

注意2:问主语或宾语,用“谁”或“什么”,不要再加多余的字。例如问猫吃什么,不要问猫吃什么动物,多加“动物”两个字,就错了。

问:什么吃鼠

答:猫。

双宾语结构:谓语动词后面有两个名词。

教:猫给鼠苹果

问:猫给鼠什么

答:苹果

宾语补足语结构:宾语后面还有动词。

教:猫让鼠跳舞

问:猫让谁跳舞

答:鼠

提问动作(谓语动词)用:怎么

教:猫吃鼠

问:猫怎么鼠

答:吃

提问行为(动作及动作对象)用:干什么、做什么

提问主语的行为:

教:猫喜欢跑步

教:猫讨厌游泳

问:猫喜欢干什么

注意:不要问猫喜欢什么,提问动作(动词)要用“干什么”,提问名词才用“什么”

答:跑步

问:猫讨厌干什么

答:游泳

提问宾语的行为:

教:猫让鼠跳舞

问:猫让鼠干什么

答:跳舞

提问主语的身份、性质、状态(表语)用:是什么

教:猫是动物

问:猫是什么

答:动物

提问形容词用:什么样的

教:猫吃黑色的鼠

问:猫吃什么样的鼠

答:黑色的

提问数词用:多少、几

教:猫吃两只鼠

问:猫吃多少鼠

答:2只

提问所属(名词所有格)用:谁的、什么的

教:阿哲的猫吃鼠

问:谁的猫吃鼠

答:阿哲的

提问动作方式(副词)用:怎么的

教:猫经常吃鼠

问:猫怎么的吃鼠

答:经常

提问时间用:什么时候,什么时间

教:昨天猫吃鼠

问:什么时候猫吃鼠

答:(显示昨天的年月日)

提问地点用:在哪里、什么地方

教:猫在花园吃鼠

问:猫在哪里吃鼠

答:花园

“吗”字句:

教:猫咬鼠

问:猫咬鼠吗

答:是的

问:猫咬蛇吗

答:没听说过

已知句(教过的句子,再教):

教:猫咬鼠

答:这个我知道

原因结果连接词:所以、因为

教:猫饿了,所以猫吃鼠

或者教:因为猫饿了,猫吃鼠

或者教:猫吃鼠,因为猫饿了

提问因果关系:为什么、所以怎样、结果怎样

问:为什么猫吃鼠

答:猫饿了

问:猫饿了,所以怎样

答:猫吃鼠

其实输入原因(猫饿了),直接就会回答结果(猫吃鼠)

输入结果(猫吃鼠),直接就会回答原因(猫饿了)

先后顺序连接词:然后

教:猫吃饭,然后睡觉

提问先后顺序:然后怎样,然后干什么,之前怎样

问:猫吃饭,然后怎样

答:猫睡觉

目的连接词:为了、目的是

教:猫吃饭,为了生存

或者教:猫吃饭,目的是生存

提问目的:为了什么,目的是什么

问:猫吃饭,为了什么

答:猫生存

设置回答

如果我教“张三欺负李四,所以李四抱怨张三。”我又要教“小帅欺负小美,所以小美抱怨小帅。”人名无限多,我永远教不完。

那就要想一种一劳永逸的方法,教:甲欺负乙#乙抱怨甲。#号左边是用户提问,#号右边是电脑回答。

这样的话,以后问:张三欺负李四。电脑就会回答:李四抱怨张三。问:小帅欺负小美,电脑就会回答:小美抱怨小帅。

当然句子中,也可以只有甲,没有乙。

例如教:甲撞墙#甲受伤。

问:张三撞墙。

电脑回答:张三受伤。

问:李四撞墙。

电脑回答:李四受伤。

当然,也可以直接设置具体内容。教:王五打小强#小强哭了。

问:王五打小强。

电脑回答:小强哭了。

建议句型

五种基本句型:

主谓句型:动作执行者 - 动作

例如:猫玩耍

主谓宾句型:动作执行者 - 动作 - 动作对象

例如:猫吃鼠

双宾语句型:动作执行者 - 动作 - 间接宾语 - 直接宾语

例如:猫给鼠苹果

双宾语句型的常见动词:给、给予、交给、供给、提供、供应、赠、赠送、送、送给、捐给、捐赠、捐献、献给、资助、赞助、授予、交付、花费、递给、递来、借、借给、租借、还、归还。

宾语补足语句型:动作执行者 - 动作 - 动作对象 - 动作对象的行为

例如:猫让鼠跳舞

宾语补足语句型的常见动词:把、使、让。

定语(形容词、数词、名词所有格)修饰名词。

例如:白色的猫、两只猫、阿哲的猫

副词修饰动词。

例如:轻轻的、快速的、不断的。

抽象思维

我不可能教机器人所有的具体知识,只要教抽象知识,就等于教了很多具体知识。

第一步教导抽象知识,第二步说清归属关系:用“属于”或“是”,第三步提问。

如果教过具体知识,优先按具体知识回答。如果没有具体知识,才开始抽象思维回答。

单句的抽象问答:

(1)抽象回答:

例如:没有教过狼吃羊,但是教过动物吃肉,且教过狼属于动物。那么问狼吃什么,虽然无法回答羊,但是电脑把“狼吃什么”抽象成“动物吃什么”之后,就会回答肉。

(2)抽象到具体的回答:

例如:教:哺乳动物吃鱼。教:熊属于哺乳动物,鲤鱼属于鱼。问:熊吃什么。答:鲤鱼。而不是答鱼,就是由抽象到具体了。

双句的抽象问答:

(1)关联句的回答:

例如教:人吃动物,所以动物怕人

再教:我属于人,牛属于动物

问:我吃牛

电脑把“我吃牛”抽象化为“人吃动物”(全抽象化)、“人吃牛”(主语抽象化)、“我吃动物”(宾语抽象化)

其中“人吃动物”这一条知识是教过的,所以就能回答

答:牛怕你

注意:双句关系要写连接词(例如所以、然后),不能写“人吃动物,动物怕人”(不能省略“所以”)

再例如教:老师爱护学生,所以学生尊敬老师

再教:张三是老师,李四是学生

问:张三爱护李四。或者问张三爱护李四,所以怎样

答:李四尊敬张三

词句决定回答

只要句子中包含指定的词句,就会产生指定的回答。

书写规范:冒号左边是词句,冒号右边是回答。多个词句(条件)用逗号隔开。要有一个含动词的词句。

例如教:看见熊:很惊讶

问:我出去玩时看见熊了

答:很惊讶

问:我在河边竟然看见熊游泳

答:很惊讶

也就是说,只要句子中包含词句“看见熊”电脑就会回答“很惊讶”

多个词句(条件),就可以灵活决定回答。多个词句之间,用逗号隔开。

例如教:森林,看见熊:逃跑

再教:动物园,看见熊:观赏

问:我在森林看见熊了

答:逃跑

问:我在动物园看见熊了

答:观赏

最多可以由4个词句(条件)决定一个回答。

当提问满足多种回答时,优先选择满足词句(条件)最多的回答。

例如前面教过看见熊:很惊讶,后面又教过森林,看见熊:逃跑。那么问我在森林看见熊,应该回答很惊讶,还是回答逃跑?会选择符合词句多的回答,所以回答逃跑。

状态判断

一、文字形式的状态:

(1)具体的句子:

我饿了,所以吃饭。这样说话太抽象,应该具体问题具体分析:

教:如果我在家,我饿了,所以自己做饭

教:如果我在外面,我饿了,所以餐馆吃饭

如果句就是条件。对于同样的提问(我饿了),条件不同(在家或在外面),回答就不同。

教:我在家

问:我饿了

答:自己做饭。

有了“我在家”这个条件约束,就会回答“自己做饭”,而不是回答餐馆吃饭,否则默认回答餐馆吃饭。

注意1:带“如果”二字的句子,只表示假设,不表示事实条件。例如前面教了“如果我在家”,还需要另外单独再教“我在家”。也就是说,不带“如果”二字,才算满足“我在家”这个事实条件。

注意2:人们一般的说话习惯“如果我在家,我饿了,自己做饭。”此句中少了连接词“所以”,提问就无法回答。

(2)抽象的句子:

教:如果食肉动物饿了,食肉动物看见食草动物,所以食肉动物吃食草动物

教:狼是食肉动物,羊是食草动物

教:狼饿了

问:狼看见羊

答:狼吃羊

既然告诉了电脑狼是食肉动物,那么教狼饿了,在狼与羊的关系句中,就等于教了“食肉动物饿了”这个条件,也就表示满足此条件,从而能回答。

二、数字形式的状态:

每个对象(事物)都有多个属性(对象的状态、对象拥有的物品数量)。

属性的三种操作:前提条件,后果影响,自动触发。

(1)前提条件:

输入:心情大于60,体力大于40,去公园

下次再输入去公园,如果心情小于60,或体力小于40,那么“去公园”这件事就无法执行,电脑会回答不满足条件。

要知道心情是多少,在对象分析栏目下可以查看。

(2)后果影响

输入:写作业,心情减20

现在心情已经减了20,以后每次输入写作业,心情都会减20

那么现在再输入去公园,就无法执行了,因为心情减20后,心情不足60了,不符合去公园的前提条件。

输入:玩游戏,心情加30

以后每次输入“玩游戏”,心情都会加30。现在心情恢复到60以上了,再输入去公园,又可以执行了(电脑回答这个我知道,而不是回答不满足条件)。

(3)自动触发

输入:心情小于10,自动触发睡觉

注意:在事件前写“自动触发”四个字,才算是自动触发。

以后只要心情发生变化,且变化到10以下,就会自动执行事件“睡觉”。也就是说,只有刚刚改变了的属性,才会自动判断是否自动触发事件。否则即便满足自动触发的条件,也不会触发事件,这是为了避免频繁的自动触发。

由于现在心情还大于10,不能自动触发“睡觉”。那么反复输入写作业,每输入一次,心情就减20。直到心情减到10以下时,就会自动执行“睡觉”。

说明1:心情、体力等就是对象的属性。用户可以自定义属性:用户输入的话语中,如果出现了表中没有的属性,就会自动添加为新属性。那么新创建的属性的初始值是多少?最初话语里属性后面的数字就作为初始值。

说明2:前面输入的话语(心情大于60)里,并没有对象。其实省略对象,默认就是指电脑智美。

要指定对象应该这样写:猫的心情大于60,猫的心情加20。就是说明对象的属性。

说明3:可以一次写多个前提条件,或多个后果影响。

如果写了多个前提条件(逗号隔开),就必须全部满足,才算满足条件。

如果写了多个后果影响(逗号隔开),每个影响都会执行。

说明4:前提条件操作符:大于、小于、等于、为。例如心情大于50。

后果影响操作符:加、减、为。例如心情减10。

说明5:如果一个数值,上限是100,应在数值后面加星号*,例如心情大于30*,表示心情的最大上限是100。如果超过100,按100算。再例如体力加40*,表示属性体力的最大上限为100。如果不加星号,则不设上限。属性的最小值低于0时,按0算。

查找对象的属性和对象的事件:

对象分析栏目下,有查找对象,输入对象名称。

如果之前教过:猫的心情大于90,猫玩耍。而且前面已经教过关于猫的事件(例如猫吃鼠),那么查找对象猫,就会显示猫的属性和事件。

链式思维

教:张三摔倒,所以张三受伤。

再教:张三受伤,所以张三去医院。

再教:张三去医院,然后张三治疗。

再教:张三治疗,然后张三出院。

也可以不按先后顺序,或中间间隔其它教导,反正只要教完这四条就可以。

形成链式关系:张三摔倒-张三受伤-张三去医院-张三治疗-张三出院。

也可以直接一次教:张三摔倒,所以受伤。张三受伤,所以去医院。张三去医院,所以治疗。张三治疗,所以出院。

如果省略主语,就自动用上一句话的主语。

电脑进行正向推理和逆向推理。

问:张三摔倒

提问的内容在链的开头,所以只有正向推理。

电脑回答:张三摔倒,所以张三受伤。张三受伤,所以张三去医院。张三去医院,所以张三治疗。张三治疗,所以张三出院。

问:张三去医院

提问的内容在链的中间,所以既有正向推理,也有逆向推理。

电脑回答:正向推理:张三去医院,然后张三治疗。张三治疗,然后张三出院。逆向推理:张三受伤,所以张三去医院。张三摔倒,所以张三受伤。

如果提问的内容在链的末尾,只有逆向推理。

注意1:句子之间的关联,要用所以、然后等词,否则不作为关联。

注意2:如果有提问词,例如问:张三受伤,所以怎样。电脑只回答去医院,不会继续关联下去。

其它

教:爬山-所以-累

这种把句子之间连接起来的教法,是有两个横杠的,而且中间连接词是所以、因此、然后等词。

再教:我下午爬山,回到家,我累了

电脑分析:由于教过“爬山”和“累”是因果关系,所以含有“爬山”二字的句子“我下午爬山”和含有“累”字的句子“我累了”,也是因果关系。

构成因果关系,就可以问答了。

提问:为什么我累了

电脑分析:提问结果,回答原因。

电脑回答:你下午爬山

提问:我下午爬山,所以怎样

电脑回答:你累了

如果“我下午爬山”和“我累了”中间相隔100句话,那么这两句话之间就不该有关联了,按照经验,相隔不要超过两句话。

优先级

张三打李四#李四恨张三

张三打李四:李四抱怨张三

第一句表示用户提问“张三打李四”时,电脑回答“李四恨张三”。第二句表示当句子里包含“张三打李四”时,电脑回答“李四抱怨张三”。

那么用户问张三打李四,电脑该回答李四恨张三,还是回答李四抱怨张三?

电脑优先回答#号的句式,而冒号的句式,优先级低,

用户教了:李四踢张三#张三恨李四。

后来用户又教了:李四踢张三#张三抱怨李四。

用户问李四踢张三,电脑该回答张三恨李四,还是张三抱怨李四?

电脑回答最新学到的知识:张三抱怨李四。


设计理念

(一)

人工智能有两种开发方法:一种是手动设置信息之间的关联。基本的方法是在对话中,收集条件状态,再根据不同的条件状态组合,来决定回答。例如张三饿了,来到餐馆,接下来干什么?对话中收集到“饿了”和“来到餐馆”这两个条件,根据程序设定(什么样的条件状态组合,该产生什么样的回答),电脑回答吃饭。这种设定是人工设定信息之间的关联,缺点是无法考虑到所有情况(所有可能的条件状态和条件状态的所有组合)。例如张三饿了,来到餐馆,但是张三的妻子在家已经给张三做好了饭,张三就不能在餐馆吃饭。或者张三饿了,来到餐馆,但是张三还有其它急事要办,就不能在餐馆吃饭。这种情况无限多,人不可能把所有情况都考虑到。所以人们觉得这种方法不行,于是人们提出一种新方法:机器人自动阅读上亿条语句,通过神经网络算法,总结词语、句子、段落之间的关系和规律,从而形成知识。这两种设计方法,会产生两种不同原理和风格的人工智能机器人。

(二)

手动设置信息之间关联的典型示例:

小美喜欢张三,张三搂抱小丽,小美会怎么样?

即便设置了这个具体问题该怎样处理,下次换成小欣喜欢李四,李四搂抱小娜,又要重新设置该怎样处理。人名无限多,不可能全部都设置,所以只能用抽象概括的规则来处理。

因此设置:人1喜欢人2,人2搂抱人3,人1会生气和嫉妒。(目前我用甲乙来表示)

但是如果人2搂抱的是他父亲,或同性别的朋友,那么人1就不该生气和嫉妒。

所以不得出现的条件状态:人2和人3是亲属,人2和人3是同性别。

因此最终的规则设定是这样的:出现的条件状态:人1喜欢人2,人2搂抱人3。不得出现的条件状态:人2和人3是亲属,人2和人3是同性别。电脑的回答:人1会生气和嫉妒。

不仅是电脑的回答,还有电脑的回答意味着什么:人1不再喜欢人2,人1讨厌人3。

而神经网络方式,是在大量的训练语句中,自动总结出这些规则,而不是手动去设定的。

(三)

手动设置信息之间关联的缺点:

第一,手动设置信息之间关联的机器人,设计者不可能考虑到所有情况(所有条件状态和条件状态的所有组合),只能考虑到通常情况,所以机器人比较单纯、朴素、一根筋,只会考虑通常情况、一般情况。

第二,手动设置信息之间关联的机器人,不善于做出选择。例如苹果便宜,但有点老了,梨很贵,但很新鲜。该买苹果,还是买梨?作为一根筋的单纯机器人,选择事物只能有一种标准,不能有两种标准。在同一种标准中,按优先级优先选择。

手动设置信息之间关联的优点:

第一,手动设置信息之间的关联,信息组织的清楚、条理。而神经网络方式的人工智能,信息之间的关系是杂乱的网状,不利于阅读、整理、修改,而且不能充分按照人的情感意愿去设计信息之间的关联和流程。

第二,情感沟通是互动的,机器人绝不能被动的问一句、答一句。而手动设定机器人的回答,可以设置:当满足什么样的条件状态时,或满足什么样的条件状态组合时,机器人就主动说什么话,而不是被动的等着用户提问后才说。还有,判断一件事,当所需的条件状态(判断依据)不足时,机器人还可以主动反问用户,让用户来补充条件状态。例如张三和李四游泳时,李四溺水了,张三应该怎么办?这时条件状态(判断依据)不足,机器人还没法判断。机器人可以主动反问用户:张三会游泳吗?如果张三会游泳,就跳下水救李四。如果张三不会游泳,就叫附近的人救李四。而不是在判断依据还不足的情况下,就强行回答。

第三,有时电脑的回答不是一句话,而是触发一个计划任务,并设定任务的每一步骤。例如张三在菜场买了水果,回家发现水果里有虫,电脑的回答就是触发一个计划任务:第一步:张三返回菜场,第二步:张三退掉水果,第三步:张三去其它水果摊重新买水果。

(四)

手动设置信息之间关联,什么样的条件状态组合,该生成什么样的回答。这个关系的设计,既包含情感思维,也包含因果逻辑等理性思维。例如走到餐馆门口时,感觉饿了,按照原因产生结果的因果关系,应该去吃饭。但是如果心情不好,就没心情吃饭。所以人的思维是情感思维和理性思维融合为一体的思维。然后把这种思维,灌输给机器人。

结构三部分:之前语句中收集的条件状态,当前语句中的条件状态,该产生的回答。

就是以当前语句中的条件状态为中心,搭配之前语句中收集的条件状态,来决定回答。例如之前语句中收集的条件状态是A、B、C,当前语句中的条件状态是D,程序设定了B和D组合时,就产生回答E,那么B和D能组合起来,并产生回答。

产生一个回答,需要具备哪些条件状态,且哪些条件状态不得出现时才行。例如想去公园,需要具备的条件状态是周末放假,不得出现的条件状态是下雨。

并不是产生一个回答就完了,还要考虑这个回答(结果)意味着什么。意味着的事情也将作为接下来用到的条件状态。例如张三摔碎李四的杯子,这个结果意味着杯子减少了一个,地面有玻璃渣子,还意味着张三和李四的友谊度下降,并不只是摔杯子这样一个事情。

有些条件状态是文字形式,例如饿了。有些条件状态是数值形式,例如张三和李四的友谊度是85。一件事上,李四是否会帮张三,就需要判断张三和李四的友谊度。

(五)

手动设置信息之间的关联,人无法考虑到所有情况(条件状态),以下方法可以缓解这个问题。

第一,只考虑通常的情况、一般的情况,机器人就是单纯一些而已。

第二,抽象概括的方法。张三受伤,去医院。李四受伤,去医院。王五受伤,去医院。名字是无限多的,只能用抽象概括的方法来处理:人受伤了,去医院。再例如:桔子补充维生素C,葡萄补充维生素C,苹果补充维生素C,这样要教的具体知识就太多了,人教不完。概括归纳的方法,可以适用于很多具体情况。水果补充维生素C,桔子、葡萄、苹果属于水果。

开发传统人工智能,最头疼的问题就是条件状态的无限组合:张三去学校路上,肚子疼怎么办?张三去菜场路上,肚子疼怎么办?张三可去的地方有无限种可能,为每种可能都设置回答,是不可能的,因为根本想不完,也写不完。只能用抽象概括的方法来处理:张三无论是去学校的路上,还是去菜场的路上,都意味着在外面。那么这个问题就该抽象概括为:在外面的时候,肚子疼怎么办?具体实现:去学校路上这句话,就意味着条件状态“在外面”,然后只是处理“在外面”和“肚子疼”这两个条件状态的组合,来决定回答,根本不理会“去学校路上”这个条件状态。

第三,限定环境。给机器人设计一个虚拟的生活环境,虚拟环境让条件状态(尤其是时间、位置、周围的人、周围的事物)变得清楚,从而使机器人有充分的判断依据。

例如对话场景直接标注:人物:机器人和用户。时间:早上8点。位置:面包屋。周围的人:店主李四。周围的事物:面包。这些都是条件状态。

然后,用户说要去公园,到了公园后,根据虚拟世界地图上面包屋和公园的距离,来改变时间。到了公园后,时间变为早上9点,就是走了一个小时的路程。

到了公园后。位置:公园。周围的事物:草坪、湖畔、长凳。还可以随机增加条件状态,例如让王五出现在公园。

用户说话往往很粗略,很多条件状态都不说。而虚拟环境提供的条件状态,就可以补充用户未说的条件状态。虚拟环境越具体,虚拟环境的条件状态越多,收集的条件状态就越多,判断依据就越充分。如果没有虚拟环境,只有文字对话,机器人就等于成了盲人,无法判明周围的情况,所以无法好好思维和判断。

在对话程序旁边,应有一个列表,显示当前所处的虚拟环境的各种条件状态。

第四,限定人物,可以避免用户所说的人物出了机器人的认知范围。限定的人物都已经设定好各种条件状态,机器人都是知道的。所以用户说这些人物时,机器人已经把握了这些人物的条件状态,从而便于思考和分析。

第五,同义词转化。例如喝饮料可以解暑,喝汽水可以解暑。“汽水”这个词转化为“饮料”这个词。

(六)

计划任务:例如说了明天早上8点去公园。等虚拟环境变为明天早上8点时,就自动触发计划任务:去公园。

计划任务就需要知道现在的时间和位置,因为任何计划任务都设定在特定的时间和位置,才能完成。可是用户说话往往很粗略,不说时间或位置,所以提供时间和位置的虚拟环境就很重要。

在对话程序旁边,还应有一个计划任务列表,就像行程备忘录。

计划任务也会使机器人主动产生回答。例如到了中午,机器人回答“该吃饭了。”

完成一件事情,往往需要分为多个阶段,前一阶段是后一阶段的前提和基础。例如上学分为小学、中学、大学。

有时候,前一阶段完成后,下一阶段有多种可能。根据情况,来决定下一阶段。

(五)

优先级:例如张三准备炒菜时,妻子在家滑倒受伤了。那么炒菜和照看妻子,张三应该优先选择照看妻子。

计划任务要做一件事,但是遇到其它事件,而且更重要,优先级更高,那就先做其它事件,而不按之前的计划任务。把优先级高的事情做完,再回到之前的计划任务,接着完成计划任务。优先级更高的事情做完,也可能无法再完成计划任务了。

再举个例子:张三和机器人约定在电影院门口见面,去看电影。张三迟到了一个小时,张三见到机器人后,说“抱歉,我迟到了。”机器人就应该主动反问:为什么要迟到?张三说路上救人,耽搁了时间。机器人就要对比看电影和救人的重要性,也就要给各种事情设置重要性级别。由于救人的重要性更高,所以机器人原谅张三。

权衡利弊:有时虽然优先级高,但是也会因此损失高,所以要权衡利弊,做出综合效果最好的选择。

随机选择:如果每次相同的情况,都产生相同的回答,就觉得枯燥。一件事可以设置多种回答,随机选择其中一个。

(七)

凡是人工智能对话程序,第一步都是先做自然语言处理。

先说个最简单的主谓宾句型:主语(动作执行者,名词)、谓语(动作,动词)、宾语(动作对象,名词)。

找出句子中的名词:用数据库游标,从名词表里每次读取一个名词。名词表的每一行,只有一个单元格,一个单元格里只有一个名词。再用包含函数判断从名词表里读取出的名词是否包含在句子中。如果包含,就说明该名词是句子中的名词,也就找到名词了。

那么问题来了:从句子中找出的名词,是主语名词还是宾语名词呢?这就需要先以谓语动词为句子分割符号,把句子分割成两段,一段是谓语动词左边部分,另一段是谓语动词右边部分。从谓语动词左边部分找出的名词,就是主语名词。从谓语动词右边部分找出的名词,就是宾语名词。

所以不是先找名词,而是先找动词。找动词的方法和找名词相似,就是用游标从动词表里逐一读取动词,在用包含函数判断读取的动词是否包含在句子中,如果包含,就说明这个动词是句子的谓语动词。

至于按指定字符(例如动词)来分割字符串(句子),是最基本的编程能力。无论哪种编程语言,都有字符串分割相关的函数,而且有很多种。也都有包含函数,用于判断词语是否包含在字符串里。

“喜欢熊猫”这句话,你以为找出的名词是熊猫,其实找出的名词是熊、猫、熊猫,这三个名词。因此要长词覆盖短词,有熊猫这个长词,就要覆盖熊和猫这两个短词,从而确保只有“熊猫”这一个名词。

“学校”这个词是名词,但是游标找动词时,会把“学”字当成动词。所以要词性辨析,如果“学”字右边第一个字符是“校”字,“学”字就不做动词。因此找到动词时,先做词性辨析,如果没问题,才能确定为动词。

你以为自然语言处理的第一步是找动词,然后按动词分割句子。其实第一步是找标点符号,按标点符号分割段落,形成一个个的单句。然后再从单句中找动词,以动词来分割单句。

在名词左边,还有找定语。定语分为形容词、数词、名词所有格。

形容词最好找,用游标从形容词表中逐一读取形容词,再看是否包含在句子中。

找数词的基本方法:先找到数词单位,例如个、只。然后从这个数词单位左边第一个字符开始,一直往左逐一判断是否是数字字符,直到不是数字字符的那个字符,才停下。每次已找到的数字字符,和新找到的数字字符,连接在一起,最终形成句子中的数字。字符串中找数字,还有很多方法。

名词所有格都有一个特点,都以“的”字结尾,且“的”字左边是名词。例如张三的猫,其中“猫”是名词,“张三的”是名词所有格。

副词修饰动词,副词也可以用游标找副词表的副词。

时间词语往往有时间单位,时间单位左边就是时间,或直接是上午、下午等时间词语。地点词语往往有在、到、去等词开头,这些词的右边就是地点词。

句式不仅是主谓宾,还有其它句式,怎么判断?用标志字。例如谓语动词是“给”字,后面肯定是双宾语,我给张三(间接宾语)苹果(直接宾语)。再例如谓语动词是“把”字,后面肯定有宾语补足语,我把教室(宾语)扫(宾语补足语)了。还有“是”字来判定句型。主谓句型判定方法是按谓语动词分割后,谓语动词右边没有内容。

做词库比较漫长和枯燥。


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部