该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
教你快速制作一个简单的人工智能机器人(懂编程的人进来看)
本文我首发于“人工智能吧”,叫做《机器人理解人类语言》和《计算机回答人类的提问》
这个机器人能理解你的语言,能和你对话,能学习知识。
首先安装:SQL Server,然后用SQL语言编程。
(一)计算机理解人类语言
说明:/* 符号 和 */ 符号之间的内容为注释内容。
SQL源代码:
/*
设计语言:SQL
数据库名称:try
表名:verb,只有一列,列名:动词,数据类型:varchar(50)
表名:noun,只有一列,列名:名词,数据类型:varchar(50)
要找的动词和名词必须是动词表和名词表里已有的词
*/
/*全句*/
declare @s varchar(100)--全句的内容
set @s = '我很喜欢漫天飞雪的冬季'
/*寻找动词*/
declare @verb varchar(100)--要找的动词
set @verb = ''--默认为空
declare mouse cursor for select 动词 from [try].[dbo].verb--定义游标,叫做mouse
open mouse--打开游标
declare @cat varchar(100)--存储游标读出的数据
fetch next from mouse into @cat--读取下一条语句,并把游标获取的值存入cat变量
while @@fetch_status=0--SQL Server本身自带的全局变量,等于0表示读取下一条语句成功
begin--循环开始
set @cat = RTRIM(@cat)--注意:游标获得的@cat值,右边带有空格,必须用rtrim去除掉空格
if (CHARINDEX(@cat,@s)>0)--找到动词:@s变量包含@cat变量时,也就是数据库的动词@cat属于句子@s里
begin
set @verb = @cat--把cat变量的值(找到的动词)给verb变量
break--结束循环
end
else--还没找到动词
begin
fetch next from mouse into @cat--读取下一条语句,并把游标获取的值存入cat变量
end
end
close mouse--关闭游标
deallocate mouse--删除游标
if(@verb = '')--没有找到动词
print '句子不含动词'--输出
else--找到了动词
print '动词:' + @verb--输出
/*
函数说明:
截取函数:SUBSTRING(全句,截取的开始位置,截取长度)
判断词语在全句位置的函数:CHARINDEX(词语,全句)
测量变量字符串的长度:LEN(变量)
*/
declare @left varchar(100)--动词左边的内容
set @left = SUBSTRING(@s,1,CHARINDEX(@verb,@s)-1)--可以嵌套函数,把函数返回值作为SUBSTRING的参数
print '动词左边:' + @left
declare @right varchar(100)--动词右边的内容
set @right = SUBSTRING(@s,CHARINDEX(@verb,@s)+LEN(@verb),LEN(@s))
print '动词右边:' + @right
/*
用相同原理的方法,在@left里找主语(名词),相当于把@left作为全句变量@s进行分析
用相同原理的方法,在@right里找宾语(名词),相当于把@right作为全句变量@s进行分析
说明:建立形容词表和副词表,名词 + “的” = 定语,“在” + 名词 = 地点状语,用数量单位确定数词,PATINDEX('%[0-9]%',变量)判定数字,去分直接宾语和间接宾语
*/
(二)计算机回答人类的提问
规范语法,是为了方便初学者学习,不规范语法也可以,但是代码就复杂多了,不适合给初学者看。
语法解释语言:主语 - 谓语 - 宾语 来表示 动作执行者 - 动作 - 动作对象。
第一章 提问:主语、谓语、宾语
第一步:建立名词表和动词表。
在名词表添加词语:猫、老鼠,在动词表添加词语:追赶。
在名词表添加疑问词:谁,在动词表添加疑问词:怎样。
第二步:建立语法表:
第1列:主语。
第2列:谓语。
第3列:宾语。
第4列:时间状语。
第5列:地点状语。
第6列:目的状语。
第7列:原因状语。
第8列:条件状语。
第9列:结果状语。
为了简单的讲解,语法表不考虑定语(形容词、数词、名词所有格)和副词,也不考虑间接宾语。
第三步:用户教导:猫追赶老鼠。(先教导,后提问)
第四步:计算机语义理解:
请先阅读我之前发表的文章《计算机理解人类语言(源代码)》
通过语义理解得知:提问句的“猫”是主语,存入语法表的主语列, “追赶”是谓语,存入语法表的谓语列,“老鼠”是宾语,存入语法表的宾语列。
第五步:提问和回答。
用户提问:谁追赶老鼠
计算机分析:
通过语义理解代码,计算机得知该句的主语是“谁”,存入变量@zhuyu中,谓语是“追赶”,存入变量@weiyu中,宾语是“老鼠”,存入变量@binyu中。
IF(@zhuyu = ‘谁’)
SELECT 主语 FROM 语法表 WHERE 谓语 = @weiyu AND 宾语 = @binyu
输出:猫
IF(@weiyu = ‘怎样’)
SELECT 谓语 FROM 语法表 WHERE 主语 = @zhuyu AND 宾语 = @binyu
输出:追赶
IF(@binyu = ‘谁’)
SELECT 宾语 FROM 语法表 WHERE 主语 = @zhuyu AND 谓语 = @weiyu
输出:老鼠
同理,还可以提问:猫怎样老鼠,猫追赶谁。
第二章 提问状语:时间、地点、目的、原因、条件、结果
第一步,教导:
要求:教导时,状语和主句用逗号隔开。主句:猫追赶老鼠。
教导时间状语:昨天,猫追赶老鼠。
标志词:昨天。
教导地点状语:在操场,猫追赶老鼠。
标志词:在。
教导目的状语:猫追赶老鼠,为了吃。
标志词:为了。
教导原因状语:由于猫饿了,猫追赶老鼠。
标志词:由于。(不用在主句加“所以”)
教导条件状语:如果猫饿了,猫追赶老鼠。
标志词:如果。
教导结果状语:猫追赶老鼠,结果猫吃了老鼠。
标志词:结果。
第二步,计算机确定壮语:
确定主句和状语:根据逗号,把主句和状语分开,包含谓语的句子为主句,不包含谓语的句子为状语。
分割方法在《计算机理解人类语言(源代码)》一文中,已经讲解了。
截取函数:SUBSTRING(全句,截取的开始位置,截取长度)
判断词语在全句位置的函数:CHARINDEX(词语,全句)
测量变量字符串的长度:LEN(变量)
按照逗号分割句子,逗号左边的部分存入@left,逗号右边的部分存入@right。
如果@left包含谓语,@left就是主句,@right就是状语,@right赋值给@zhuangyu。
如果@right包含谓语,@right就是主句,@left就是状语,@left赋值给@zhuangyu。
如果@zhuangyu包含时间状语标志词:昨天,则把该状语存入语法表的时间状语列,主句存入同一行的主、谓、宾列。
如果@zhuangyu包含地点状语标志词:在,则把该状语存入语法表的地点状语列,主句存入同一行的主、谓、宾列。
如果@zhuangyu包含目的状语标志词:为了,则把该状语存入语法表的目的状语列,主句存入同一行的主、谓、宾列。
如果@zhuangyu包含原因状语标志词:由于,则把该状语存入语法表的原因状语列,主句存入同一行的主、谓、宾列。
如果@zhuangyu包含条件状语标志词:如果,则把该状语存入语法表的条件状语列,主句存入同一行的主、谓、宾列。
如果@zhuangyu包含结果状语标志词:结果,则把该状语存入语法表的结果状语列,主句存入同一行的主、谓、宾列。
判断一句话是否包含某个词的方法在《计算机理解人类语言(源代码)》一文中,已经讲解了。
如果CHARINDEX(特定的词,全句)>0表示全句包含该词。
第三步:提问和回答:
要求:提问时,状语和主句用逗号隔开。主句:猫追赶老鼠。
提问:什么时间,猫追赶老鼠
通过语义理解得知:提问句的“猫”是主语, “追赶”是谓语,“老鼠”是宾语,“什么时间”是状语。然后把状语部分的内容放入变量@zhuangyu中,主语存到@zhuyu中,谓语存到@weiyu中,宾语存到@binyu中。
IF(@zhuangyu = ‘什么时间’)
SELECT 时间状语FROM 语法表 WHERE主语 = @zhuyu AND谓语 = @weiyu AND 宾语 = @binyu
输出:昨天
IF(@zhuangyu = ‘什么地点’)
SELECT 地点状语FROM 语法表 WHERE主语 = @zhuyu AND谓语 = @weiyu AND 宾语 = @binyu
输出:在操场
IF(@zhuangyu = ‘什么目的’)
SELECT 目的状语FROM 语法表 WHERE主语 = @zhuyu AND谓语 = @weiyu AND 宾语 = @binyu
输出:为了吃
IF(@zhuangyu = ‘什么原因’)
SELECT 原因状语FROM 语法表WHERE主语 = @zhuyu AND谓语 = @weiyu AND 宾语 = @binyu
输出:由于猫饿了
IF(@zhuangyu = ‘什么条件’)
SELECT 条件状语FROM 语法表 WHERE主语 = @zhuyu AND谓语 = @weiyu AND 宾语 = @binyu
输出:如果猫饿了
IF(@zhuangyu = ‘什么结果’)
SELECT 结果状语FROM 语法表 WHERE主语 = @zhuyu AND谓语 = @weiyu AND 宾语 = @binyu
输出:结果猫吃了老鼠
计算机回答人类提问 SQL源代码:
declare @sen varchar(100)
set @sen = '猫追赶老鼠'
/*
语义理解。具体代码见:计算机理解人类语言(源代码),此处省略
通过语义理解,得知主语、谓语、宾语,然后存入相应的变量
*/
declare @zhuyu varchar(100)
declare @weiyu varchar(100)
declare @binyu varchar(100)
/*因为省略了语义理解代码,所以下面的赋值,我手工填写*/
set @zhuyu = '猫'
set @weiyu = '追赶'
set @binyu = '老鼠'
/*
建立一张表,表名sentence(数据库名:try)
第1列,列名:主语,数据类型:varchar(50)
第2列,列名:谓语,数据类型:varchar(50)
第3列,列名:宾语,数据类型:varchar(50)
*/
insert into [try].[dbo].sentence values(@zhuyu,@weiyu,@binyu)--按照主、谓、宾,插入sentence表
/*提问*/
declare @ask varchar(100)
set @ask = '谁追赶老鼠'--提问的内容,不用加问号
/*
语义理解。具体代码见:计算机理解人类语言(源代码),此处省略
通过语义理解,得知主语、谓语、宾语,然后存入相应的变量
注意:名词表里必须先加入“谁”,动词表里必须先加入“怎样”,然后再执行此代码,否则语义理解会失败
因为省略了语义理解代码,所以下面的赋值,我手工填写
*/
set @zhuyu = '谁'
set @weiyu = '追赶'
set @binyu = '老鼠'
/*计算机回答提问*/
declare @answer varchar(100)
IF(@zhuyu = '谁')--对主语进行提问
BEGIN
SET @answer = (SELECT 主语 FROM [try].[dbo].sentence WHERE 谓语 = @weiyu AND 宾语 = @binyu)
PRINT '回答: ' + @answer
END
IF(@weiyu = '怎样')--对谓语进行提问
BEGIN
SET @answer = (SELECT 谓语 FROM [try].[dbo].sentence WHERE 主语 = @zhuyu AND 宾语 = @binyu)
PRINT '回答: ' +@answer
END
IF(@binyu = '谁')--对宾语进行提问
BEGIN
SET @answer = (SELECT 宾语 FROM [try].[dbo].sentence WHERE 主语 = @zhuyu AND 谓语 = @weiyu)
PRINT '回答: ' +@answer
END
分割状语和主句 SQL源代码:
/*全句*/
declare @m varchar(100)--全句的内容
set @m = '在学校,我看见一只猫'
if (CHARINDEX(',',@m)>0)--找到逗号:@m变量包含逗号时
begin
declare @l varchar(100)--逗号左边的内容
set @l = SUBSTRING(@m,1,CHARINDEX(',',@m)-1)--可以嵌套函数,把函数返回值作为SUBSTRING的参数
print '逗号左边:' + @l
declare @r varchar(100)--逗号右边的内容
set @r = SUBSTRING(@m,CHARINDEX(',',@m)+LEN(','),LEN(@m))
print '逗号右边:' + @r
end
if (CHARINDEX('在',@l)>0)--如果句子中包含“在”字
print '逗号左边为地点状语'
if (CHARINDEX('在',@r)>0)
print '逗号右边为地点状语'
if (CHARINDEX('昨天',@l)>0)--如果句子中包含词语“昨天”
print '逗号左边为时间状语'
if (CHARINDEX('昨天',@r)>0)
print '逗号右边为时间状语'
if (CHARINDEX('为了',@l)>0)
print '逗号左边为目的状语'
if (CHARINDEX('为了',@r)>0)
print '逗号右边为目的状语'
if (CHARINDEX('由于',@l)>0)
print '逗号左边为原因状语'
if (CHARINDEX('由于',@r)>0)
print '逗号右边为原因状语'
if (CHARINDEX('如果',@l)>0)
print '逗号左边为条件状语'
if (CHARINDEX('如果',@r)>0)
print '逗号右边为条件状语'
if (CHARINDEX('结果',@l)>0)
print '逗号左边为结果状语'
if (CHARINDEX('结果',@r)>0)
print '逗号右边为结果状语'