自然语言形式化与词法、形态分析详解
1. 罗马数字对词法分析的干扰
罗马数字会干扰词法分析,因为它们与常规单词形式难以区分。例如,“CM” 既可以表示 900,也可以表示 “centimeter”;“IV” 既可以表示 4,也可以表示 “intravenous”。将罗马数字的语法与常规词典结合应用,能够表示单词与罗马数字之间的歧义。后续的句法或语义分析则需要结合单词的句法或语义上下文来解决这些词法歧义。
2. 大写单词的处理
大多数欧洲语言采用大小写字母系统。大写字母通常用于标记专有名词或句子的开头。为了从单词形式中识别词汇单元(ALUs),通常需要将包含一个或多个大写字母的单词改写为小写形式。词法分析器根据大小写处理三种类型的单词形式:
-
全小写单词
:例如 “table”。识别这类单词时,只需查阅词典。如果在词典中未找到该单词,则认为该单词拼写错误(此时可以运行自动拼写校正器)。
-
首字母大写或全大写的单词
:如 “When”、“Joe” 或 “INTRODUCTION”、“IBM”。识别这类单词通常需要查阅两个词典:一个是常用词词典(因为所有常用词可能会在句子开头或标题中以大写字母形式出现),另一个是专有名词词典。
-
更通用的单词形式
:如 “McCarthy”、“RedOw”、“kW”、“dnaC” 等。这些专有名词和首字母缩写词应列在特定的词典中。
在严格的语言项目范围内,构建一个详尽的专有名词词典是不可行的,因为它需要包含美国、英国和世界上所有的人名、街道名、城镇名、地区名、国家名、社会组织名、首字母缩写词、品牌名和产品名等,实际上这个词典可能是无限的,因为作者可能会在小说中创造新的人名或地名。而且,即使构建了这样的数据库,其作用也有限。例如,在句子 “X went to Y to buy the latest model of Z’s phones” 中,人们可以推测出 X 是人名,Y 是地名,Z 是品牌名。也就是说,当对一种语言有足够完整的描述时,就能够识别专有名词,而无需列出所有专有名词。
然而,在构建特定领域或市场的自然语言处理(NLP)应用程序时,需要获取详尽的专有名词列表。例如,为了让拼写检查器能够纠正 “Masachussets” 这样的错误形式。经典的方法是构建适合待分析文本的专有名词词典:如果分析的是报纸,就将国家名和政治人物名插入词典;如果分析的是经济报告,就将企业名插入词典等。
此外,专有名词、首字母缩写词和常用词之间存在许多歧义。例如,“Seal” 可以指英国歌手,“navy SEAL” 指特种部队,而 “seal” 指海洋哺乳动物。对于没有大小写字母的语言(如阿拉伯语、中文、韩语、希伯来语、日语),这种歧义更为普遍。此时,可以使用类似 TAS 的结构暂时存储词法歧义,等待更复杂的分析来解决这些歧义。
3. 形态分析概述
形态分析旨在将单词形式与代表相应词汇元素(ALUs)的词法条目联系起来。形态分析主要包括屈折形态分析、派生形态分析、词法形态分析和黏着分析。
4. 屈折形态分析
屈折形态分析描述动词的变位、名词和形容词的复数形式(在阿拉伯语中还有双数形式)、形容词的阴性或中性形式(如在德语中)以及名词和形容词的变格(如主格、宾格、与格和所有格)。一种语言的屈折形态由一组范式描述,每个屈折范式对应一个规则或上下文无关的语法,用于描述如何为给定的词法条目生成所有形式。
例如,范式 “TABLE” 的定义语法如下:
TABLE = <E>/s | s/p;
这个语法描述了两个后缀,每个后缀产生一个代表语言属性的输出。如果将这个语法应用于词法条目 “pen”:
- 后缀
<E>
(空字符串)添加到词法条目上生成相同的形式 “pen”,该语法为这个形式生成属性 “s”(表示单数)。
- 后缀 “s” 添加到词法条目上生成形式 “pens”,该语法为这个形式生成属性 “p”(表示复数)。
屈折语法产生的信息由代码表示。以下是 NooJ 英语模块中的一些屈折代码:
| Code | Meaning | Code | Meaning |
| ---- | ---- | ---- | ---- |
| G | Gerund | 3 | 3rd Person |
| INF | Infinitive | f | feminine |
| PP | Past Participle | p | plural |
| PR | Present | s | singular |
| PT | Preterite | m | masculine |
范式 “TABLE” 可用于描述大量单词的屈折变化,实际上,所有复数形式加 “s” 的名词(超过 30,000 个简单名词)都可以用它来描述,例如:
abandon,N+FLX=TABLE
abbey,N+FLX=TABLE+Conc
abbot,N+FLX=TABLE+Hum
abbreviation,N+FLX=TABLE
abdication,N+FLX=TABLE
abdicator,N+FLX=TABLE+Hum
...
该范式还可用于对数万个复合名词进行屈折变化,例如 “educational system” 变为 “educational systems”。
另一个富有成效的范式是 “HELP”:
HELP = <E>/INF | <E>/PR | s/PR+3+s | ing/G | ed/PT | ed/PP ;
这个语法可以对近 5,000 个动词进行变位,例如:
abandon,V+FLX=HELP
abduct,V+FLX=HELP
abort,V+FLX=HELP
absorb,V+FLX=HELP
abstain,V+FLX=HELP
accustom,V+FLX=HELP
act,V+FLX=HELP
adopt,V+FLX=HELP
afford,V+FLX=HELP
aim,V+FLX=HELP
...
需要注意的是,这个语法会产生一些歧义形式。例如,“acted” 既可以与代码 “+PT”(过去式)关联,也可以与代码 “+PP”(过去分词)关联。
上述语法相对简单,因为它们以词法条目为根来生成形式,即只需在词法条目上添加后缀即可获得其屈折形式。但一般情况下,情况更为复杂。例如,要从词法条目 “to know” 得到 “knew” 形式,需要先删除词法条目的最后两个字母,然后添加后缀 “ew”。
为了删除最后几个字母,使用 “Backspace” 特殊字符。删除单词的最后一个字母,只需在后缀中添加 “Backspace” 字符。从计算机的角度来看,常规字母键(如 “e”)和控制键(如 “Backspace”)之间差别不大。例如,用于对 “to blow”、“to grow”、“to know”、“to throw” 等动词进行变位的语法 “KNOW” 如下:
KNOW = <E>/INF | <E>/PR | s/PR+3+s | <B2>ew/PT | n/PP ;
在这个语法中,后缀 “ ew” 可以理解为:按两次 Backspace 键,然后添加 “e” 和 “w”。从初始词法条目 “blow” 开始,该语法会生成 “blew” 形式,这个形式与代码 “+PT”(过去式)关联。
以下是 NooJ 英语的形态操作符列表:
| 操作符 | 功能 |
| ---- | ---- |
|
| Delete the current character |
|
| Change the case of the current character |
|
| Duplicate the current character |
|
| Move the cursor left |
|
| Move to the right |
|
| Delete the character after the cursor |
|
| Move the cursor to the beginning of the next word |
|
| Move the cursor to the end of the previous word |
操作符
<N>
(下一个单词)和
<P>
(上一个单词)可以在单词之间移动光标,而不考虑每个单词的长度。例如,要将 “work in progress” 变为复数形式,可以应用以下语法:
NX = <E>/s | <P2>s/p;
<P2>
会将光标移动到前一个单词的末尾两次,因此命令 “
s” 会将光标定位到 “work” 这个单词的末尾,然后添加 “s”,生成 “works in progress” 这个屈折形式,该形式与属性 “p”(复数)关联。
在很多情况下,多词单元的组成部分在性、数上必须一致,对于某些语言还包括格的一致。例如,对英语名词 “woman writer” 进行屈折变化时,应生成 “woman writer” 和 “women writers” 这两种形式,而不是 “ women writer” 和 “ woman writers”。默认情况下,NooJ 在应用屈折语法时会检查复合名词所有组成部分的一致性。例如,以下范式:
NN= :TABLE <P> :MAN;
该范式简单地复用了范式 “TABLE” 来对 “writer” 进行屈折变化,复用范式 “MAN” 来对 “woman” 进行屈折变化。NooJ 会过滤掉同时产生 “s” 和 “p” 特征的屈折形式,因为在系统中这两个特征被描述为不相容的。
但并非所有情况都需要强制一致,例如 “proof of purchase”、“proofs of purchase”、“proof of purchases”、“proofs of purchases” 这四种形式中,“proof” 和 “purchase” 这两个组成部分在数上不需要一致。
上述操作符使语言学家能够显著减少范式的数量。NooJ 还提供了为每种语言添加特定新操作符的可能性。以下是为非英语语言开发的一些操作符示例:
-
西班牙语
:操作符
<Á>
为当前元音 a、e、i、o 或 u 添加重音。例如,从 “ampliar” 开始,后缀 “
<Á>is” 会生成 “ampliáis” 形式。
-
希伯来语
:操作符
<B>
、
<L>
和
<R>
会考虑某些辅音中软 dagesh 的存在。如果一个辅音包含 dagesh,这些操作符会将该辅音和 dagesh 作为一个整体字符进行处理。
-
匈牙利语
:操作符
<D>
用于双写字母。例如,“b” 变为 “bb”。但一些匈牙利辅音由两个或三个字母组成,双写时,匈牙利正字法惯例是只双写第一个字母,例如 “sz” 变为 “ssz”。
-
克丘亚语
:操作符
<Q>
可以复制整个单词。例如,将其应用于词法条目 “sacha”(树),后缀 “
” 会生成 “sachasacha”(森林)形式。
下面用 mermaid 流程图展示屈折形态分析的基本流程:
graph TD;
A[输入单词形式] --> B[选择合适的范式];
B --> C[应用范式规则];
C --> D[生成屈折形式和属性];
D --> E[检查一致性];
E --> F[输出结果];
5. 派生形态分析
派生形态分析描述一个词汇单元(ALU)在任何句法类别中可以呈现的所有形式之间的联系。例如,从动词 “to drink” 可以派生出名词 “a drink”、“a drinker” 以及形容词 “drinkable”。
派生形式必须被视为同一个词汇单元的不同表现形式,即来自一个由单个词法条目表示的唯一词汇元素。派生不仅仅是一个学术问题,它对许多 NLP 应用程序至关重要。例如,在搜索引擎中输入 “good actor” 请求,如果 “acting” 和 “actor” 之间没有关联,就无法找到 “Her acting was good” 这样的内容。派生对于翻译系统也很重要,因为一种语言中的名词可能需要用另一种语言中的形容词来翻译,或者动词可能需要用名词来翻译。例如,以下法语/英语翻译涉及词性变化:
- “Il a raison”(
he has reason
)↔ “He is right”
- “Elle déjeune”(
she lunches
)↔ “She is having lunch”
- “Il est culotté”(
he is underpanted
)↔ “He has nerve”
据了解,对于英语,只有 NomBank 系列词典包含派生关联。
在 NooJ 词典中,派生通过属性 “+DRV” 来描述。例如,以下词法条目:
act,V+FLX=HELP+DRV=NOP:TABLE+DRV=OR:TABLE+DRV=AING:NOP+DRV=NING:NOP
这个条目表示 “to act” 按照 “HELP” 范式进行变位,并且有四种派生形式:
- “+DRV=NOP:TABLE”:派生形式 “an act” 本身按照 “TABLE” 范式进行屈折变化。
- “+DRV=OR:TABLE”:派生形式 “an actor” 也按照 “TABLE” 范式进行屈折变化。
- “+DRV=NING:NOP”:派生名词 “acting” 没有屈折变化。
- “+DRV=AING:NOP”:派生形容词 “acting”。
主要的派生类型如下:
| 派生类型 | 示例 |
| ---- | ---- |
| A → N | red → redness |
| A → V | black → to blacken |
| A → ADV | quick → quickly |
| N → V | a table → to table |
| N → A | an artist → artistic |
| N → ADV | an artist → artistically |
| V → N | to organize → an organization |
| V → A | to love → lovable |
| V → ADV | to love → lovably |
使用 NooJ 时,派生的形式化方式与屈折变化相同。例如,为了将 “to organize” 派生为 “organization” 进行形式化,可以使用以下语法:
ATION = <B>ation/N
这个语法从词法条目 “organize” 生成 “organization” 形式,然后将生成的形式与 “Noun” 类别(代码 N)关联。需要注意的是,生成的名词形式 “an organization” 本身有屈折变化,它使用屈折范式 “TABLE”(复数形式加 “s”)。
当派生形式的屈折变化与基础形式完全相同时,可以省略屈折范式。例如,前缀 “re-” 或 “dis-” 不会改变动词的屈折变化:
mount,V+FLX=HELP+DRV=RE+DRV=DIS
“To remount” 和 “to dismount” 的变位方式与 “to mount” 完全相同,因此无需明确写出派生动词的屈折范式。
派生形态分析的流程可以用以下 mermaid 流程图表示:
graph TD;
A[输入基础词法条目] --> B[确定派生规则];
B --> C[应用派生规则生成派生形式];
C --> D[关联派生形式的类别和屈折信息];
D --> E[输出派生结果];
6. 词法形态分析
词法形态分析主要处理派生词汇家族。例如在法语中,“France”、“français”(法语)、“franciser”(使法国化)、“francisation”(法国化)、“francophonie”(讲法语的社区)、“francophile” 等词都基于名词 “France”。这个词汇家族可以用以下图形来表示:
graph LR;
A[France] --> B[français];
A --> C[franciser];
A --> D[francisation];
A --> E[francophonie];
A --> F[francophile];
这个语法将每个派生形式与一个屈折代码(例如 +FLX=CRAYON)相关联,这样 NooJ 就能识别所有相应的屈折形式。有些形式可能会被多次识别(即沿着图形上的多条路径),从而产生多种不同的分析结果。例如,“francophone”(讲法语的人)既可以被分析为人类名词(N + Hum),也可以被分析为形容词(A)。
这个语法相当于一个列出相同形式的词典,实际上,NooJ 的 “GRAMMAR > Generate Language” 命令可以自动构建等效的词典。
部分前缀或后缀可以有效地应用于大量的词汇单元(ALUs)。例如,许多动词会使用前缀 “over - ”,如 “overact”、“overbook”、“overcharge”、“overdevelop”、“overeat”、“overflow” 等。为了避免在词典中分别列出所有动词及其带有 “over - ” 前缀的对应词而使词典规模翻倍,更简单和经济的方法是设置一个富有成效的形态上下文敏感语法,如下所示:
graph TD;
A[输入单词形式] --> B[识别以 over 开头的形式];
B --> C{检查后续序列是否为动词形式};
C -- 是 --> D[关联分析形式、词元及相关信息];
C -- 否 --> E[排除该形式];
该语法中的符号
<L>
代表任何字母。第一步,这个语法会识别所有以 “over” 开头的单词形式,例如 “overture” 和 “overeat”。第二步,约束
<$Verb = :V>
会检查前缀后面的序列是否真的是一个动词形式。NooJ 会排除 “overture”,因为 “ture” 未被列为动词;而会保留 “overeat”,因为 “eat” 是一个动词形式。最终的分析
<$1L,V$1S$1F + OVER>
会将分析形式(“overeat”)与词元(“eat”)以及与通过约束识别的词汇单元(“to eat”)相关联的句法 - 语义信息(+Transitive + Food)和屈折信息(+INF)进行关联。
7. 黏着分析
通常被称为 “黏着语” 的典型语言有芬兰语、匈牙利语和土耳其语。这里使用 “黏着” 这个术语更广泛地描述多个词汇单元(ALUs)以无空格的单一正字法形式书写的所有情况。黏着与复合词相反,黏着形式必须被分析为一系列的词汇单元,而多词单元则不需要进行分析。这里不区分黏着和缩写(如英语中的 “cannot”),但缩写形式通常非常少见,可以很容易地列在一个小词典中,而黏着是富有成效的,涉及数千种组合,不适合(实际上也不可能)全部列出。
例如在闪米特语中,可以将几个语法词黏着到后面的名词上。例如,“and in the house” 这个序列在希伯来语中写成一个单一形式:“[ו: ובביתand] + ב[in the] + [ביתhouse]”。在阿拉伯语中,同样的四个词汇单元序列也写成一个无空格的单一缩写形式 “وﺑﺒﻴﺘﻪ”。
罗曼语族也有一些富有成效的黏着现象。例如在西班牙语中,补充动词的代词会附着在动词右侧。在句子 “Se niega a regalármelo”(他拒绝把它给我)中,“regalármelo” 这个形式应该被分析为三个词汇单元的序列:“regalar”(提供) + “me”(我) + “lo”(它)。可以使用如下形态语法来解析黏着形式:
graph TD;
A[输入黏着形式 regalármelo] --> B[匹配前缀 regal 并存储到 $Verb];
B --> C{检查 $Verb 是否为动词不定式形式};
C -- 是 --> D[分析为三个 ALUs 序列];
C -- 否 --> E[排除该形式];
当这个图形应用于 “regalármelo” 形式时,它会匹配并将其前缀 “regal” 存储在变量
$Verb
中。约束
<$Verb#ar = :V + INF>
变为
<regalar = :V + INF>
,NooJ 会检查 “regalar” 形式是否真的对应一个动词不定式形式(V + INF)。
这个语法可以通过添加对每个动词允许的补语的约束来改进。例如,语法不应识别 “sleep it to me” 这样的序列,因为 “to sleep” 是一个不及物动词。
在日耳曼语中,黏着用于构建非常长的单词形式。例如,以下德语形式:
虽然这些形式有时被称为复合名词,但在当前的框架中,复合名词是多词单元,因此是不可分析的词汇单元,而黏着形式由多个必须分解才能进行分析的词汇单元组成。
总结
自然语言的形式化过程中,词法分析和形态分析起着至关重要的作用。词法分析要处理罗马数字干扰、大写单词识别以及专有名词歧义等问题,通过构建合适的词典和采用有效的分析方法来解决这些难题。形态分析则涵盖屈折、派生、词法和黏着等多个方面,每种分析都有其独特的规则和方法,并且可以借助 NooJ 等工具和各种操作符来实现。这些分析方法不仅有助于我们理解自然语言的结构和规则,也为自然语言处理应用(如搜索引擎、翻译系统等)提供了坚实的基础。通过不断优化和完善这些分析方法,我们能够更好地实现自然语言与计算机之间的交互,推动自然语言处理技术的发展。
超级会员免费看

被折叠的 条评论
为什么被折叠?



