我的人工智能程序是MySQL语言的存储过程,存放于数据库中,方便直接操作数据表,作为后台。而网页是html、JavaScript(含ajax)、php语言写的,作为前台,用于显示数据。
数据传输过程:index.html(主页)→ ajax技术 → connect.php → MySQL数据库。
html一般是静态网页,但是用了ajax技术(异步JavaScript),html格式的网页就可以连接数据库了,但还要写php程序(connect.php)用于连接数据库。
ajax的好处在于更新数据时不用刷新整个网页,尤其是这种频繁更新数据的网页,如果用户每点一次发送按钮,就要刷新一次网页,那就不好了。
MySQL存储过程:
一、处理流程
enter:进入程序,网页与此连接。
先调用存储过程correct,纠正不规范输入。
如果是可直接处理的句子,调用存储过程direct,快速处理,不用做语义理解。
如果无法直接处理:
调用AskSS找出是否有双句关系的提问词。
如果有双句关系的提问词:双句关系的问答:调用AnswerSS。如果没有回答结果,变为抽象句,再试一次:调用存储过程AnswerAbstract
如果没有双句关系的提问词:调用SplitSS逐句分解,作为一个个的单句处理。
如果最终都没有结果,就回答我不知道,或不知道啦。
correct:纠正不规范输入
英文标点符号变为中文标点符号。
纠正连接词前没写逗号。例如“因为饿了所以吃饭”变为“因为饿了,所以吃饭”
标注连接词语序颠倒,之后处理。例如该先说原因后说结果,但是用户先说结果后说原因,程序需要标注这种颠倒的连接词语序。
direct:可直接处理的信息
判断用户输入的话语,是否包含禁止使用的词语。
电脑可以直接回答的话语,不用分析语法。例如用户输入“你是谁”电脑回答“我是人工智能妹小飞”。还有处理回家、去学校、去商店等转移位置的话语。
判断是否为教导方法。
判断是否为设定自动触发。如果是设定自动触发,调用存储过程TriggerInsert,向表中添加信息。
判断是否为设定“前提条件-事件-后果影响”,如果是,调用存储过程AttributeInsert,向表中添加信息。
虚拟商店系统,人工智能的虚拟人可以在商店买物品。
SplitSS:多句分割成单句
Split的意思是分割,SS是多句话。
把多句话分割成一个个的单句。因为自然语言处理每次只能处理一个单句,所以多句(例如段落)要先分割成一个个的单句。
调用AttributeControl:在“前提条件--事件-后果影响”的句型中,看是否满足前提条件,以及对属性的改变操作。
调用single,开始自然语言处理。
调用InsertSS和AnswerSS,处理有双句前后关系的句子。
single:单句处理框架
调用存储过程:mean、AnswerSingle、ConditionChange。
二、问答
AnswerSingle:单句的回答,单句存入知识表
动态SQL:根据情况,智能拼接成查询指令。疑问词决定select的选择对象,句子中其它成分作为where查询条件。
例如教导“猫吃鼠。”语义理解:主语:猫,谓语动词:吃,宾语:鼠,然后存入知识表。然后用户问“猫吃什么”提问词“什么”出现在宾语位置,说明提问宾语,那么select对象就是宾语。而where查询条件就是主语“猫”和谓语动词“吃”,这样就构成了一条SQL指令,查询结果就是“鼠”。
如果是陈述句,插入到知识表中,作为电脑的新知识。
AskSS:找出提问词和问句的已知条件
S是sentence,表示一句话,那么SS就是多句话。
找出的提问词。例如为什么、所以怎样。判断要提问什么。
找出问句的已知条件。例如“因为饿了,所以怎样”,已知条件是“饿了”。
找出提问词和已知条件,是为后面的问答做准备。
AnswerSS:双句关系的回答
双句回答:双句中(例如猫饿了,所以猫吃鼠),如果有提问词(例如为什么猫吃鼠),以已知句(例如猫吃鼠)作为搜索条件(where),提问词(例如为什么)对应回答句(select)。回答猫饿了。
三、抽象化
abstract:抽象简化
把各个名词抽象化,并组装成抽象句。
例如:猫吃鼠,猫属于动物,鼠属于动物,猫吃鼠变为动物吃动物(全抽象)、动物吃鼠(主语抽象)、猫吃动物(宾语抽象)。
简化:抽象句里,定语(形容词、数词、名词所有格)、副词、时间、地点都不要。
AnswerAbstract:双句关系的抽象句的回答
如果具体句子的方式无法问答,把具体的已知条件句,抽象成三种抽象句:全抽象句、主语抽象句、宾语抽象句,再尝试问答。
belong:归属关系
向归属关系表填入事物的归属关系。
四、属性操作:前提条件、后果影响、自动触发
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:第一句话和第二句话之间的关系,例如因果
howto:做一件事的方法
做饭:洗菜、切菜、炒菜,那么ask_col是做饭,answer_col是洗菜、切菜、炒菜
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:留言板
style.css:网页样式表,共4个
文件夹:
img:图片文件夹
js:JavaScript文件夹。里面jquery.min.js代码看着很乱,因为min是jquery库的密集压缩形式,是为了减少代码,加快加载速度。jquery库是网页动态特效的常见库
music:音乐文件夹
video:视频文件夹(美景阅读界面的背景视频)
cinema:电影院模式的文件夹
live2d:阅读界面右下角,动态人物(看板娘)的文件夹,live2d是一种绘图软件的名字
音乐播放器