在“学习分词程序”发出以后,利_刃先生为我的程序作了一个图表,很清晰,看来他没少花力气。我还没有来得及感谢他,就被气着了。原来他竟用了一句话“空荡的庭院分外寂静,内墙城垛上只有一位拉紧斗篷抵御寒意的守卫。”做出了640种分词组合。
我简直欲哭无泪了。这还是我的程序吗?我发了一通牢骚,利_刃先生也很纳闷,不明白我的责怪从何而来。后来我想明白了。原来我们的分歧就在“学习”上。
在我看来,程序的分词方式,取决于在它的学习词汇阶段,我怎么教它,它就怎么分词。比如利_刃先生的那句长语句,到了我的程序里。我就教它一种分词方式:把语句分成一个个词汇。因此,它绝对不会产生第二种分词方式。
而利_刃先生忽视了“学习分词”这个问题,他用一般分词程序来想想我的程序,以为程序会自动做出各种分词组合,从而忘记了我没有那样去教程序。
“学习分词程序”贵在“学习”。由于程序的能力被“学习”限制,它反而不会做出很出格的分词方式,不会为我们造成困扰。
而且,我的“学习分词程序”就想进行到把语句分解为各个词汇为止。词组的输入仅仅是为了解决同头词汇的多种分词困难。更长的词组输入我并不考虑。因此,利_刃先生几次追问匹配规则问题,我都回说不会采用。我的分词就到分成各个词汇为止,不考虑分成大型词组,要最大匹配法何用?
进一步工作,我已经多次声明,交给语义识别去做。而语义识别问题,我原来想在完成模拟思维以后,返回头解决这个问题。现在人们都想知道如何进行语义识别。而语义识别我们还要沿用离散学习的模式。让程序在学习中自建相应的资料库。
现在提出一个讨论题大家共同想一下:如果让你编写一个“学习识别语义程序”,你将如何去编写?
(1)基于计算机操作的语句理解
如果我们对计算机说(输入):你从…………找到……然后给我显示出来。
这似乎像是对牛弹琴。
但是我们今天要讨论的正是一个这样的语句理解技术。
计算机对语言理解并转入操作很平常。在操作系统还是DOS的时候,我们在系统提示符后面键入一个文件名,系统就会自动调出那个文件并且执行。如果我们把文件名写成一个语句,那么系统调出文件并执行。这就相当于系统理解了我们的语句,并在理解的基础上执行了该语句
有趣的是DOS命令还可以向内传递参数,向外返回参数。这对相当于计算机理解的语句不仅能转变为内部操作,还能够按语句确定操作对象,改变操作对象。它返回的参数可以看成是计算机向我们做出的汇报。
“基于计算机操作的语句理解”,就是用这个原理。我们在编程时,使命令语句与子函数名称完全一致,并且编程时把输入语句、词库语句与这些命令语句的调用、执行结合在一起。这些语句可以很死板,程序读这些语句时也不必分词,或做一些简单的不可能有歧义的分词。
与DOS命令不同的是,DOS是直接调用相应的程序。而我们这里是让程序在其运行过程中执行内部操作。因此其理解语句,执行语句命令的现象会更明显。
这类程序的关键是字符串与内部操作名称一致,当程序读到(不管是从输入还是从内部)该字符串时,就在程序内调用相应的子函数。
命令语句也可以含有操作对象,它们作为参数传递给子函数,由子函数内部确定操作指针。命令语句含有操作对象时,程序读语句需要简单的分词。不过因为用不了几个词汇,不会在分词时出现歧义。
如此,我向程序输入“你从…………找到…………然后给我显示出来。”的命令语句,它会乖乖的执行,也就毫不稀罕了。
而且程序如果从内部字符串读到“你从…………找到…………然后给我显示出来。”的命令语句也应该能够准确的执行。
这个基于“计算机操作的语句理解程序”会大大改变我们理解语言所处的尴尬局面。
(2)引入归纳和抽象能力
以前我们讨论的分词程序都属于机械分词,因此它遇到歧义无法很好地解决。目前已经有很多其它方法弥补机械分词的不足。但是由于人们不敢涉及让计算机思维这个课题,解决方式都很笨拙。
人也会遇到分词歧义的问题,但是人能够总结出很多经验性规律,用这些经验很快处理分词歧义问题。很多人也想让计算机用这些经验,但是经验太多,占计算机存储的开销太大。要是计算机也能够像人一样把经验归纳出那么几句话,然后用这几句话去解决问题,那该多好呀。
可是,这可能做到吗?我们以后就在这方面努力。
A、引入对操作记录的功能
对操作进行记录,保留系统的操作历史,是模拟意识技术的一部分。我们先不去管什么是模拟意识。只管我们这儿,要程序把自己的操作历史,保存在一个叫做“历史存储区”的数组变量之中(这是一个一维数组变量)。别的先不去追究。
我们的程序连语言表达都不会,如何让它能够记录自己的活动呢?只好由我们代劳,不过不是代写,那样我们就太辛苦了。我们在程序中编入一个死格式,由计算机再填写进一些内容,凑成一个格式固定表达语句,记录在“历史存储区”中。
例如,给计算机这样的格式“我从语句‘A’找到‘B’。”A、B代表两个字符串。
但我们给程序输入一个语句后,它就把语句填写在‘A’中。它在学习中并在分词时从语句中找到一个词汇,就把那个词汇填写到‘B’中。这样就完成了一个历史记录的语句。然后存入“历史存储区”。
下一次在分词和学习分词时就再填写一个语句,存入“历史存储区”。
B、引入归纳和抽象过程。
为了便于程序进行归纳与抽象。我们先输入一批有一类分词规律的语句,由“历史存储区”保存。这以后我们用一个特殊键,要求程序接受我们发出的命令。程序转入接收命令阶段。该命令由“基于操作的语句理解程序”接受并执行。
这个命令就是要求程序对“历史记录区”记录的语句进行比较检索操作,程序在执行后就给出比较结果,即:归纳出的这批记录语句的相同之处与不同之处。抽象出规律。
规律也用语句表达,表达还是用填写死格式的方式进行。这就是程序归纳后抽象出的结论。这个规律是程序自学产生的,并可以用语言表达该规律。而且这个语句也是一条基于操作的语句,是一条命令。
当我们再命令程序用等量替代操作或假设量替代操作替代表达语句的相应部分后,再执行这个语句程序自己组织的命令,就相当于程序按自己找出的规律去操作了。也就是按自己抽象出的经验工作了。
如果程序由内部自己调用这句语句命令(这种“自己调用”当然是我们编写到程序中的),那就是程序能够自己执行自己归纳的经验了。
显然,这种用归纳和抽象出新操作方法运作以后,可以代替大量的经验资料,即加快了程序的工作速度,又减少了存储资料的开销。
C、引入分类和归类功能。
我这里指的不是人工神经网络的那种分类,而是由“离散编程法”编写的分类操作。这个操作的工作原理和程序流程以后会发出。现在先不讨论。
这里要说的是,有了分类和归类的功能,我们就可以不必向程序输入一批语句,而是成批给程序输入文件,由程序自己在为资料分类和归类后,得到归纳的对象资料,并对这些对象资料进行归纳、抽象,找出很多经验(规律)。
这样,程序就有了自己依据现成语言文件得出分词规律的能力。显然,这种程序的分词水平就会大大提高,程序处理歧义的能力也会大大增强。
而且,与统计方式大有不同,这种取得经验的方式和人类取得经验的形式几乎一样,这种的经验也是用语句说得清道得明的东西,即便是经验有错误,我们也可以分析、发现错误,并利用程序的自学能力修改错误经验。
D、先积累合成词组的经验
我们已经讨论过了两次分词,如果你觉得这种跳跃分词的方式还有用,你可以设置更多次分词,在机械分词的领域多停留一阵子。
而在我的设计中,第三次分词是合成词组。我们都知道词组的合成方式比较多,但是因为输入语句对词汇和词汇位置的限制。合成量不会是很大的。不必在大量组合中去费脑筋。
为了简便、准确进行合成词组工作,就需要我们的程序首先积累合成词组的经验。
在合成词组时我们要用到大量操作经验。而合成词组的操作经验的工作我也交给程序去做。产生操作经验后,要求程序用操作经验合成词组。由于合成词组经验是由大量文字资料中归纳抽象得来的,因此经验的准确度会很高,其合成词组的准确程度也会相当高。
依据操作经验与依据“经验资料”有本质的差别。经验资料是由大量例句组成的,它的存储开销非常之大。操作经验就是那么几句话,它的存储开销非常小。但是操作经验操作后产生的结果会很大。
E、各种经验的积累
在交插分词过程中,要对分词结果做语义分析、语境分析,因此这些分析经验也要积累。积累经验后对语句各词汇的关系进行识别,分析后排除错误的分词方式。
这就是语义识别工作。有很多经验如语义分析经验、语境分析经验、判定错误分次经验等,都要程序自己进行积累。
F、语法分析
用合成法合成词组,准确率很高,经语义分析、语境分析,分词歧义基本都予以消除。合成后稍微与语法规则一比较,就会很好地确定语句各部分间的语法关系。分析语法关系也需要积累相应的经验,由经验来完成。
语法关系分析完了,绝大部分语言理解工作就基本完成。
在分析语法关系的同时,也还可以纠正分词错误。依“多轮分词法”的思想,什么时候分词都不为过,只要能最后把分词歧义消灭掉,就是好方法。
下面还有一项任务,就是元词汇解释,这是获得语义的关键工作。元词汇是一种词义稳定的词汇,用它来解释其它词汇,比词典里循环解释效果要好得多。
元词汇解释完成后,程序在表达方面就会有极大的提高。当然这时的程序还不能与有感觉参与的语言理解相比拟。但是程序在大量掌握语言文件后,其理解与表达能力也会很强。
以上所考虑的一切,其后面D、E、F和元词汇解释等项工作,我都没有谈透,因为其详细过程较复杂。即便是A、B、C、D几项的工作细节,也都大有深入研究之处。这里仅是一些初步设想。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。