网页游戏:心有一玉

开发工具:RPG maker(mv版本)

类型:网页剧情游戏,角色扮演游戏(RPG),开源源码

使用RPG maker打开文件夹yu下的game.project即可编辑和开发游戏。

运行游戏:打开文件夹yu下的index.html

RPG maker有mv和mz等多个版本,虽然用了mz版本的图片,但是要用mv版本才能打开和正常使用。

技术原理:

我的人工智能程序是MySQL语言的存储过程,存放于数据库中,方便直接操作数据表,作为后台。而网页是html、JavaScript(含ajax)、php语言写的,作为前台,用于显示数据。

数据传输过程:index.html(主页)→ ajax技术 → connect.php → MySQL数据库。

html一般是静态网页,但是用了ajax技术(异步JavaScript),html格式的网页就可以连接数据库了,但还要写php程序(connect.php)用于连接数据库。

ajax的好处在于更新数据时不用刷新整个网页,尤其是这种频繁更新数据的网页,如果用户每点一次发送按钮,就要刷新一次网页,那就不好了。

目前人工智能,其实就是模式匹配:如果用户输入的话语和提问,能匹配上已经设定好的模式(规则),机器人就能回答,否则就回答不了。

MySQL存储过程:

一、处理流程

enter:进入程序,网页与此连接。

先调用存储过程correct,纠正不规范输入。

如果是可直接处理的句子,调用存储过程direct,快速处理,不用做逐句分解和语义理解。

如果无法直接处理,则调用存储过程SplitSS,逐句分解,作为一个个的单句处理。

如果最终都没有结果,就回答我不知道,或不知道啦。

correct:纠正不规范输入

英文标点符号变为中文标点符号。

纠正连接词前没写逗号。例如“因为饿了所以吃饭”变为“因为饿了,所以吃饭”

标注连接词语序颠倒,之后处理。例如该先说原因后说结果,但是用户先说结果后说原因,程序需要标注这种颠倒的连接词语序。

direct:可直接处理的信息

判断用户输入的话语,是否包含禁止使用的词语。

电脑可以直接回答的话语,不用分析语法。例如用户输入“你是谁”电脑回答“我是人工智能妹阿玉”。还有处理回家、去学校、去商店等转移位置的话语。

判断是否为教导方法。

判断是否为设定自动触发。如果是设定自动触发,调用存储过程TriggerInsert,向表中添加信息。

判断是否为设定“前提条件-事件-后果影响”,如果是,调用存储过程AttributeInsert,向表中添加信息。

虚拟商店系统,人工智能的虚拟人可以在商店买物品。


SplitSS:思维主框架,并且把输入的多句,分割成一个个单句进行处理

Split的意思是分割,S表示sentence,SS表示多句话。

第一阶段:先判断有没有提问词,也就是判断是不是提问句。

提问词分为两类,一类是双句(例如因果句,先后顺序句)关系的提问词(例如:为什么、然后怎样),另一类是单句的提问词(例如单句“猫吃什么”中的“什么”)。

第二阶段:

判断标点符号的数量,输入了多少句话。

把输入的多句,按标点符号,分割成一个个的单句进行处理。

第三阶段:单句的处理。

先调用AttributeControl:在“前提条件--事件-后果影响”的句型中,看是否满足前提条件,以及对属性的改变操作。

判断当前单句,是不是双句关系的提问句,是不是单句的提问句。

如果不是提问句,只是教导知识的陈述句。判断教导的知识,是否已经教过。如果没有教过,就存入sentence表,作为新知识。如果是“吗”字句(事件加“吗”字结尾,就是问事件是否存在),就要判断事件是否已经存在。

如果当前单句和上一句话是因果关系、先后顺序关系等,就要调用存储过程InsertSS,把这两句话一起存入知识表2。

调用存储过程single,执行单句的自然语言处理。

如果当前句和之前句是关联的双句,但没有提问词,就调用存储过程AnswerSS,问当前句,回答之前句,问之前句,回答当前句。如果回答不了,用抽象句、甲乙句再试。

如果是关联句,且有双句关系的提问词,也调用AnswerSS回答双句关系。和之前调用AnswerSS不一样,这次是带双句关系提问词的提问。如果回答不了,也用抽象句和甲乙句再试。

single:作用:单句的处理

(1)为单句的语义理解(mean)做准备,就是割掉句头词(例如所以)和句尾词(例如吗)等,到时候语义理解就干净方便了

(2)调用单句的问答(AnswerSingle)

(3)单句的抽象化

(4)如果当前单句和前面的句子构成关系句,例如因果关系句,就插入双句关系表

二、问答

AnswerSingle:单句的回答,以及单句存入知识表

动态SQL:根据情况,智能拼接成查询指令。

疑问词决定select的选择对象,句子中其它成分作为where查询条件。例如教导“猫吃鼠。”语义理解:主语:猫,谓语动词:吃,宾语:鼠,然后存入知识表know。随后用户问“猫吃什么”提问词“什么”出现在宾语位置,说明提问宾语,那么select对象就是宾语。而where查询条件就是主语“猫”和谓语动词“吃”,这样就构成了一条SQL指令,查询结果就是“鼠”。

如果是陈述句,插入到知识表know中(不是sentence),作为电脑的新知识。

AnswerSS:双句关系的回答

双句回答:双句中(例如猫饿了,所以猫吃鼠),如果有提问词(例如为什么猫吃鼠),则以已知句(例如猫吃鼠)作为搜索条件(where),提问词(例如为什么)对应回答句(select)。回答猫饿了。

如果没有提问词,问关联双句中的一句,则回答剩下的另一句。例如输入猫饿了,回答猫吃鼠。这话里没有提问词。

三、抽象与具体

abstract:抽象化

把各个名词抽象化,并组装成抽象句。

例如:猫吃鼠,猫属于动物,鼠属于动物,猫吃鼠变为动物吃动物(全抽象)、动物吃鼠(主语抽象)、猫吃动物(宾语抽象)。

简化:抽象句里,定语(形容词、数词、名词所有格)、副词、时间、地点都不要。


AnswerAbstract:双句关系的抽象句的回答

如果具体句子的方式无法问答,把具体的已知条件句,抽象成三种抽象句:全抽象句、主语抽象句、宾语抽象句,再尝试问答。


concrete:具体化,把抽象的回答变为具体的回答


AnswerSS2:和AnswerSS相似,但处理的是抽象句,而不是具体句

四、属性操作:前提条件、后果影响、自动触发

AbstractAnswer:具体句变为抽象句,再用抽象句问答。比AnswerAbstract要全面。


ExistCondition:判断是否有条件限定。


JudgeCondition:判断是否满足条件。


AttributeInsert:把前提条件、后果影响的信息,插入到表中。


AttributeControl:判断是否符合前提条件,以及对属性值的变化操作。


TriggerInsert:把自动触发的信息,插入到表中。


TriggerControl:按照自动触发的设定,改变属性值,并产生自动触发的事件。


shop:在虚拟世界的商店,阿玉给自己买东西。


AttributeYu:机器人阿玉的事件。


ObjectThing:查询任何对象的事件。

五、链式关联

DepthSearch:对于链式关联的深度遍历,包括正向推理和逆向推理。

六、自然语言处理

mean:自然语言处理框架

自然语言处理就是理解一句话中主语是什么、谓语动词是什么、宾语是什么,还有其它语法成分都是什么。

需要先判断出句型,后面才能具体判断出语法成分。例如双宾语结构的句型,就有直接宾语和间接宾语。再例如宾语补足语句型,要判断出宾语补足语。

割掉句头的连接词,例如因为、所以。割掉句尾的多余字,例如吗、啊。割掉句中的多余字:例如了。

调用存储过程:SearchTime、SearchVerb、SearchLeft、SearchO、SearchDO、SearchOC。


确定年、月、日、时、分。

把今天、昨天等词转化为具体的日期。

调用存储过程NumConvert,把汉语数字转化为阿拉伯数字。

周末、春季等词也作为时间。

SearchVerb:找动词,判断句型

用游标找出所有动词:游标从动词表中逐一读出每个动词,并判断该动词是否包含在句子里。如果包含,就说明句子里有该动词,整个过程仅耗时0.2秒。


以动词来判断句型:

如果句子只有1个动词:如果有双宾语句型的引导词(例如给、看见),就是双宾语句型,如果没有,就是主谓宾句型。如果有“是”字,就是表语句型。

如果句子有2个动词:如果这两个动词连在一起(中间没有间隔词),则等于一个动词,按1个动词的情况来处理。如果这两个动词没有连在一起,则是两个动词,为宾语补足语句型。这两个动词之间的间隔,就是宾语。例如“我让她跳舞”动词“让”和“跳舞”之间是宾语“她”。

如果句子有3个动词:只有宾语补足语句型有这么多动词。

如果是被动句,调整为主动句结构。

以动词来分割句子:以谓语动词为分割词,把句子分为谓语动词左边句和谓语动词右边句,后面分开处理。


SearchLeft:自然语言处理:谓语动词左边句

找主语、主语的定语(形容词、数词、名词所有格)、副词、地点。

找形容词:调用存储过程SearchAdj。

找名词(名词、名词所有格、地点名词):调用存储过程SearchNoun。

句子修复:补全省略的主语,把代词替换为指代的具体内容。

找副词:调用存储过程SearchAdv,这里指修饰谓语动词的副词,如果是修饰形容词的副词,直接与形容词合并。


SearchO:自然语言处理:主谓宾句型或表语句型的谓语动词右边句

找宾语、宾语的定语、地点。

O指object,原理与SearchLeft相似,但处理的是谓语动词右边句。


SearchDO:自然语言处理:双宾语句型的谓语动词右边句

找直接宾语、间接宾语、宾语的定语、地点。

DO指Double Object,原理与SearchLeft相似,但要找两个宾语。

区分直接宾语和间接宾语:直接宾语在句子底端,后面没内容了,而间接宾语后面还有内容。例如“我给她苹果。”“苹果”是直接宾语,“她”是间接宾语。如果一个定语,左边是间接宾语,说明这个定语是直接宾语的定语,如果左边没有间接宾语,就是间接宾语的定语。


SearchOC:自然语言处理:宾语补足语句型的谓语动词右边句

找宾语、宾语的定语、宾语补足语、地点。

OC指Object Complex,原理与SearchLeft相似,但处理的是谓语动词右边句。

前面SearchVerb已经找出所有动词,包括宾语补足语动词。宾语补足语动词左边是宾语,右边是宾语补足语的名词部分。


SearchNoun:找出名词

游标找名词、动词、形容词、副词,都要面临一个问题,例如“熊猫”被游标理解为三个名词:熊、猫、熊猫。需要长词(熊猫)覆盖短词(熊),短词(熊)吸收长词(熊猫),这样结果就只有一个名词“熊猫”。

如果名词右边有“的”字,就是名词所有格。如果名词左边有“在/去/到/来/回”等词,说明该名词为地点。

游标找出名词的顺序,不是句子里出现的先后顺序,而是名词表里出现的先后顺序。因此要排序,使之符合句子里出现的先后顺序。

名词之间如果是“和”字、“与”字、顿号,或没有间隔字符,就要连接成一个名词。


SearchAdj:找出形容词


SearchAdv:找出副词


NotVerb:进一步确定到底是不是动词

进一步判断一个动词到底是不是动词。例如“学”字是动词,但在“学生”这个词里作名词。再例如“成”指变成,做动词,但是在“成绩”里做名词。

如果一个词,既可以做动词,也可以作名词。那就看这个词前面是否是定语(尤其是“的”)字,因为定语只能修饰名词。如果这个词后面是“的”字,那个词本身就是定语,而不是动词。


NotAdj:进一步确定到底是不是形容词

进一步判断一个形容词到底是不是形容词。例如“白”字是颜色形容词,但在“莲花白”里做名词。再例如“老”字做形容词,但在“老鼠”里做名词。


NotAdv:进一步确定到底是不是副词

进一步判断一个副词到底是不是副词。例如“太”字是程度副词,但是在“太阳”里做名词。再例如“才”表示刚才,做时间副词,但是在“才能”里做名词。


IsName:确定是不是名字

如果句子中出现姓氏,就要看其左右的字符,来判断到底是不是姓氏。例如“王”字,如果左边的字符是“大”,那么“大王”的“王”显然不是姓氏。

如果姓氏前有“小”字,例如“小蔡”,就构成名词。

姓氏和动词之间的部分就是名字,例如“蔡昊哲爱阿玉”,姓氏“蔡”到动词“爱”之间的部分是名字。


NumConvert:汉字型数字转阿拉伯数字

汉字型数字(例如三百六十五)转化为阿拉伯数字(例如365),方便后面加减乘除计算。


InsertSS:双句存入数据表

前后两句话,如果有关系,就是有连接词。例如“猫饿了,所以猫吃鼠。”前后两句话是因果关系,存入双句关系表中。SS表示双句。

七、其它

SentencceRelation和SentenceRelation2:判断句子之间的关联


SentenceRelationInsert:句子之间关联的插入


SplitOnce:把每次输入的段落,拆分成一个个单句


TimePosition:根据现实世界的时间,来决定网页显示的环境背景图和人物图。

八、剧情设计

Story:剧情程序

StoryAffect:后果影响

StoryCondition:前提条件

StoryEnd:读取剧情线最后一句话

StoryList:读取剧情标题

StorySave和StorySave2:网页剧情栏的内容,存入数据库的数据表中

StorySelect:选项处理

此说明文档来自:贴吧云上晴空,https://tieba.baidu.com/home/main?un=%E6%9A%AE%E6%9C%A8%E5%A4%95%E6%BA%AA

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。