技术原理
2021-12-16

我的人工智能程序是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表示多句话。SplitSS是重要又难理解的程序,所以我写的注释(解释),和代码数量差不多。
第一阶段:先判断有没有提问词,也就是判断是不是提问句。
提问词分为两类,一类是双句(例如因果句,先后顺序句)关系的提问词(例如:为什么、然后怎样),另一类是单句的提问词(例如单句“猫吃什么”中的“什么”)。
第二阶段:
判断标点符号的数量,输入了多少句话。
把输入的多句,按标点符号,分割成一个个的单句进行处理。
第三阶段:单句的处理。
先调用AttributeControl:在“前提条件--事件-后果影响”的句型中,看是否满足前提条件,以及对属性的改变操作。
判断当前单句,是不是双句关系的提问句,是不是单句的提问句。
如果不是提问句,只是教导知识的陈述句。判断教导的知识,是否已经教过。如果没有教过,就存入sentence表,作为新知识。如果是“吗”字句(事件加“吗”字结尾,就是问事件是否存在),就要判断事件是否已经存在。
如果当前单句和上一句话是因果关系、先后顺序关系等,就要调用存储过程InsertSS,把这两句话一起存入知识表2。
调用存储过程single,执行单句的自然语言处理。
如果当前句和之前句是关联的双句,但没有提问词,就调用存储过程AnswerSS,问当前句,回答之前句,问之前句,回答当前句。如果回答不了,用抽象句、甲乙句再试。
如果是关联句,且有双句关系的提问词,也调用AnswerSS回答双句关系。和之前调用AnswerSS不一样,这次是带双句关系提问词的提问。如果回答不了,也用抽象句和甲乙句再试。

single:单句处理框架
判断归属关系。
调用单句的语义理解(自然语言处理)。
调用单句的问答。
调用单句的抽象化。
就是调用几个存储过程,所以single只是个框架结构。

二、问答
AnswerSingle:单句的回答,以及单句存入知识表
动态SQL:根据情况,智能拼接成查询指令。
疑问词决定select的选择对象,句子中其它成分作为where查询条件。例如教导“猫吃鼠。”语义理解:主语:猫,谓语动词:吃,宾语:鼠,然后存入知识表know。随后用户问“猫吃什么”提问词“什么”出现在宾语位置,说明提问宾语,那么select对象就是宾语。而where查询条件就是主语“猫”和谓语动词“吃”,这样就构成了一条SQL指令,查询结果就是“鼠”。
如果是陈述句,插入到知识表know中(不是sentence),作为电脑的新知识。

AnswerSS:双句关系的回答
双句回答:双句中(例如猫饿了,所以猫吃鼠),如果有提问词(例如为什么猫吃鼠),则以已知句(例如猫吃鼠)作为搜索条件(where),提问词(例如为什么)对应回答句(select)。回答猫饿了。
如果没有提问词,问关联双句中的一句,则回答剩下的另一句。例如输入猫饿了,回答猫吃鼠。这话里没有提问词。

三、抽象与具体
abstract:抽象化
把各个名词抽象化,并组装成抽象句。
例如:猫吃鼠,猫属于动物,鼠属于动物,猫吃鼠变为动物吃动物(全抽象)、动物吃鼠(主语抽象)、猫吃动物(宾语抽象)。
简化:抽象句里,定语(形容词、数词、名词所有格)、副词、时间、地点都不要。

abstract_more:产生更多的抽象句。
例如句子的主语(具体词)有3中归属(抽象词),宾语(具体词)也有3种归属(抽象词),就可以组合成9种全抽象句。

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

belong:归属关系

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

四、属性操作:前提条件、后果影响、自动触发
AttributeInsert:把前提条件、后果影响的信息,插入到表中。

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

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

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

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

AttributeYu:机器人阿玉的事件。

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

五、自然语言处理
mean:自然语言处理框架
自然语言处理就是理解一句话中主语是什么、谓语动词是什么、宾语是什么,还有其它语法成分都是什么。
需要先判断出句型,后面才能具体判断出语法成分。例如双宾语结构的句型,就有直接宾语和间接宾语。再例如宾语补足语句型,要判断出宾语补足语。
割掉句头的连接词,例如因为、所以。割掉句尾的多余字,例如吗、啊。割掉句中的多余字:例如了。
调用存储过程:SearchTime、SearchVerb、SearchLeft、SearchO、SearchDO、SearchOC。

SearchTime:找出时间
确定年、月、日、时、分。
把今天、昨天等词转化为具体的日期。
调用存储过程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表示双句。

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

各个表格的作用
noun:名词词库

verb:动词词库

adj:形容词词库

adv:副词词库

verb_judge:进一步判断是不是动词
type_col中l表示left,r表示right
生l1花:如果“生”字左边1个字符是“花”,既花生,那么“生”字就不是动词

adj_judge:进一步判断是不是形容词
老r1师:如果“老”字右边1个字符是“师”,既老师,那么“老”字就不是形容词

other_word:引导双宾语句型的词,数词单位,带“的”字的副词
first_name:姓氏表
sensitive_word:敏感词(不可以用的词,以免人乱说话)

know:知识表:把一个单句,分割为语法词语
subject_col:主语列
verb1_col:谓语动词1列
verb1_col:谓语动词2列
object_col是宾语列,双宾语句型做直接宾语列
indirect_col是间接宾语列,宾语补足语句型做宾语补足语的动词列
adj_subject_col:主语的形容词
adj_object_col:宾语的形容词
adj_indirect_col:间接宾语的形容词
num_subject_col:主语的数词
num_object_col:宾语的数词
num_indirect_col:间接宾语的数词
po_subject_col:主语的名词所有格
po_object_col:宾语的名词所有格
po_indirect_col:间接宾语的名词所有格
adv_col:副词列
time_col:时间列
position_col:位置列
pattern_col:句型列

know2:双句的关系
s1_col:第一句话
s2_col:第二句话
con_col:第一句话和第二句话之间的关系,例如因果

sentence:输入的单句(未经自然语言处理)

attribute:对象的属性
attribute_control:对象属性的形式:前提条件、后果影响
auto_trigger:自动触发的条件和事件
belong:事物的归属关系

setting:系统设置
temp:对象事件临时的表

article:文章表
mes:留言表

网页程序中,各个文件的作用
index.html:主页
connect.php:主页通过ajax方式向mysql传输数据,需要connect.php
2.html:电影院模式的对话界面
a.php:文章阅读界面
b.php:美景模式的阅读界面
condition.php:机器人阿玉的状态、物品、事件
condition2.php:机器人阿玉所处的场所位置
object.php:查询对象
login.php:登录
manage.php:后台管理
logout.php:登出
code.html:基础训练
mes.php:留言板
gamesql和gamesql2:游戏用
style.css:网页样式表,共4个

文件夹:
img:图片文件夹
js:JavaScript文件夹。里面jquery.min.js代码看着很乱,因为min是jquery库的密集压缩形式,是为了减少代码,加快加载速度。jquery库是网页动态特效的常见库,双屏模式和留言板,都需要用jquery.min.js
music:音乐文件夹
video:视频文件夹(美景阅读界面的背景视频)
cinema:电影院模式的文件夹
cute:双屏模式
game:游戏文件夹