3.7 处理濒危语言时特别注意事项

语言对科学和艺术的重要性体现在文化宝库包含在语言中。世界上大约 7000 种人类语言中的每一个都是丰富的,在它独特的方面,在它口述的历史和创造的传说,在它的文法结构和它的变化的词汇和它们含义中的细微差别。受威胁残余文化中的词能够区分具有科学家未知的治疗用途的植物亚种。当人们互相接触,每个人都为之前的语言提供一个独特的窗口,语言随着时间的推移而变化。世界许多地方,小的语言变化从一个镇都另一个镇,累加起来在一个半小时的车程的空间中成为一种完全不同的语言。对于其惊人的复杂性和多样性,人类语言犹如丰富多彩的挂毯随着时间和空间而伸展。

然而,世界上大多数语言面临灭绝。对此,许多语言学家都在努力工作,记录语言,构建这个世界语言遗产的重要方面的丰富记录。在 NLP 的领域能为这方面的努力提供什么帮助吗?开发标注器、分析器、命名实体识别等不是最优先的,通常没有足够的数据来开发这样的工具。相反,最经常提出的是需要更好的工具来收集和维护数据,特别是文本和词汇。

从表面看,开始收集濒危语言的文本应该是一件简单的事情。即使我们忽略了棘手的问题,如谁拥有文本,文本中包含的文化知识有关敏感性,转录仍然有很多明显的实际问题。大多数语言缺乏标准的书写形式。当一种语言没有文学传统时,拼写和标点符号的约定也没有得到很好的建立。因此,通常的做法是与文本收集一道创建一个词典,当在文本中出现新词时不断更新词典。可以使用文字处理器(用于文本)和电子表格(用于词典)来做这项工作。更妙的是,SIL 的自由语言软件 Toolbox 和 Fieldworks 对文本和词汇的创建集成提供了很好的支持。

当濒危语言的说话者学会自己输入文本时,一个共同的障碍就是对正确的拼写的极度关注。有一个词典大大有助于这一进程,但我们需要让查找的方法不要假设有人能确定任意一个词的引文形式。这个问题对具有复杂形态的包括前缀的语言可能是很急迫的。这种情况下,使用语义范畴标注词项,并允许通过语义范畴或注释查找是十分有益的。

允许通过相似的发音查找词项也是很有益的。下面是如何做到这一点的一个简单的演示。第一步是确定易混淆的字母序列,映射复杂的版本到更简单的版本。我们还可以注意到,辅音群中字母的相对顺序是拼写错误的一个来源,所以我们将辅音字母顺序规范化。

  1. >>> mappings = [('ph', 'f'), ('ght', 't'), ('^kn', 'n'), ('qu', 'kw'),
  2. ... ('[aeiou]+', 'a'), (r'(.)\1', r'\1')]
  3. >>> def signature(word):
  4. ... for patt, repl in mappings:
  5. ... word = re.sub(patt, repl, word)
  6. ... pieces = re.findall('[^aeiou]+', word)
  7. ... return ''.join(char for piece in pieces for char in sorted(piece))[:8]
  8. >>> signature('illefent')
  9. 'lfnt'
  10. >>> signature('ebsekwieous')
  11. 'bskws'
  12. >>> signature('nuculerr')
  13. 'nclr'

下一步,我们对词典中的所有词汇创建从特征到词汇的映射。我们可以用这为一个给定的输入词找到候选的修正(但我们必须先计算这个词的特征)。

  1. >>> signatures = nltk.Index((signature(w), w) for w in nltk.corpus.words.words())
  2. >>> signatures[signature('nuculerr')]
  3. ['anicular', 'inocular', 'nucellar', 'nuclear', 'unicolor', 'uniocular', 'unocular']

最后,我们应该按照与原词相似程度对结果排序。通过函数rank()完成。唯一剩下的函数提供给用户一个简单的接口:

  1. >>> def rank(word, wordlist):
  2. ... ranked = sorted((nltk.edit_distance(word, w), w) for w in wordlist)
  3. ... return [word for (_, word) in ranked]
  4. >>> def fuzzy_spell(word):
  5. ... sig = signature(word)
  6. ... if sig in signatures:
  7. ... return rank(word, signatures[sig])
  8. ... else:
  9. ... return []
  10. >>> fuzzy_spell('illefent')
  11. ['olefiant', 'elephant', 'oliphant', 'elephanta']
  12. >>> fuzzy_spell('ebsekwieous')
  13. ['obsequious']
  14. >>> fuzzy_spell('nucular')
  15. ['anicular', 'inocular', 'nucellar', 'nuclear', 'unocular', 'uniocular', 'unicolor']

这仅仅是一个演示,其中一个简单的程序就可以方便的访问语言书写系统可能不规范或语言的使用者可能拼写的不是很好的上下文中的词汇数据。其他简单的 NLP 在这个领域的应用包括:建立索引以方便对数据的访问,从文本中拾取词汇表,构建词典时定位词语用法的例子,在知之甚少的数据中检测普遍或特殊模式,并在创建的数据上使用各种语言的软件工具执行专门的验证。我们将在5返回到其中的最后一个。