生成斯瓦希里语的动词词干列表

斯瓦希里语(以下简称斯语)的时态没有特别复杂,一般由一个动词词干作为这个动词的语义核心,各种屈折变形作为这个动词词干的前缀出现。拿比较简单的时态现在时来看,主语前缀-时态前缀-(宾语前缀)-动词词干,只要动词词干确定了,可变的位置只有前面三种前缀。

Ni -na -ku -penda
我(主) -现在时 -你(宾) -爱

而且前面三种前缀的数量也是在可控范围内的。所以斯语还是一门比较容易用计算机进行处理的语言(相对于中文来说)。

生成动词词干列表的两个思路

一般来说生成动词词干列表有两个思路。

第一种思路是将所有句子里包含字母数量较多的词提取出来(斯语中动词的长度一般都比名词要长很多),分解其语素,把最后一个位置的语素认定为动词词干。这种思路最大的问题有两个,第一个问题在于动词的屈折变形并没有真的那么简单,比如1的位置有19种不同的主语前缀;2的位置是时态,简单的时态有5种;3的位置的宾语,宾语前缀的数量和主语前缀类似。真正的难点在于有些同形但是异义的前缀,比如ku-可以作为第二人称单数的宾语前缀,但是同样也有动词词干是以ku开头的,比如-kubali。所以也就是说Nilikubali.我同意了。这样的词,很难通过算法将ku认定为动词词干的一部分。第二个难点在是所谓“复杂”的时态,有些时态会使得动词词干的元音发生变化1

schadeberg1992

第二种思路是按照动词词干的构成来生成单词表,因为斯语的动词词干最终都是由动词词根构成的。上图是Schadeberg(1992)给出的一个很有名的例子,例子面出现的-pel-这个词根,理论上可以衍生出-peleka, -pelekwa, -pelekea等动词词干。或者换一种说法,在斯语中动词词根的数量(比如这里的-pel-)是非常有限的,而动词词干的数量可能要庞大得多。这条思路看上去很好,因为动词词干是动词词根衍生而来这一条肯定是没有错误的,但是由于词根位于一个动词的正中心部分,需要处理的位置太多了2,而且动词词根衍生到动词词干并不是类似英语时态一样从一个点散发出去,对应各种一般现在时、一般过去将来时等等,换句话说,英语的动词时态变形类似于一朵花瓣数量有限的花。而斯语的动词词根衍生更像是洋葱,一层皮外可能还有另一层皮,并且动词词根衍生过程中词素插入的顺序如果不同,得出的动词词干意思也会不同。比如-pig-这个词根,加入表示相互关系的-an-和屈为式的-IL-后可以衍生出-pigania 争取某物,为了……而奋斗,同样的词素,如果加入的顺序不同,则会变成-pigiana,打给对方(电话)。并且动词衍生的语法现象经常会引入同义异形3,造成处理起来更困难。

为两种思路铺垫的准备工作

第一种思路,通过查找动词前段的“预设字段”来确定这个动词的动词词干,需要我们本身就有一个好的动词词干列表来消除不必要的干扰。第二种思路则需要更多的演算空间,并且我们也需要一个可以用的「动词词根的列表」,而这个也是通过动词词干列表消减各种动词衍生词素得来的。总之这两种思路都要求我们要有一个已经可以用的动词词干列表,但是尽量希望收得词多一些。

Martin Benjamin 维护的 Kamusi Gold 提供了一份供斯语老师或研究者使用的、可免费获取的纯文本字典档案,但是需要写信联系对方。Kamusi Gold 项目的好处是收词量很大。很多在一般斯语词典不会收录、衍生后的新动词词干在他们的档案里也有收集。

verb_stems

[code language=”python”]
# based on sall_kamusiproject.org.txt
# line the document
myfile=open("sall_kamusiproject.org.txt")
full=myfile.read()
full=full.replace("\n\n","FISIFISI").replace("\n"," ").replace("FISIFISI","\n")
newfile=open("0","w")
newfile.write(full)
newfile.close

import re

pop=[]
f=open("0")
for lines in f:
match=re.search("^.*\[Part of Speech\] verb(?=[^\w])", lines)
if match:
match1=re.search("^.*\[Swahili Word\] ", match.group())
if match1:
b=match1.group()
a=match.group().replace(b,"")
if a[0]=="-":
a=a[:a.find(" ")]
if a not in pop:
pop.append(a)
vdict=set()
for full in pop:
vdict.add(full[1:])

n=open("vdict.txt","w")
for full in sorted(vdict):
n.write(full+"\n")
[/code]

最后的结果是这样一个文件:

[code language=”text”]
aasi
abiri
abiria
abirika
abirisha
abiriwa
abudia
abudisha
abudiwa
abudu
[/code]

  1. 理论上也可以增加新的位置,这也是AFF/肯定式的由来。 []
  2. 前面要处理各种人称和时态的前缀,后面又要处理各种可能的动词衍生词素 []
  3. allomorph []
 

ynshen