网页游戏:心有一玉
开发工具: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
评论(0)