4.2 正则表达式标注器

正则表达式标注器基于匹配模式分配标记给词符。例如,我们可能会猜测任一以 ed 结尾的词都是动词过去分词,任一以’s 结尾的词都是名词所有格。可以用一个正则表达式的列表表示这些:

  1. >>> patterns = [
  2. ... (r'.*ing$', 'VBG'), # gerunds
  3. ... (r'.*ed$', 'VBD'), # simple past
  4. ... (r'.*es$', 'VBZ'), # 3rd singular present
  5. ... (r'.*ould$', 'MD'), # modals
  6. ... (r'.*\'s$', 'NN$'), # possessive nouns
  7. ... (r'.*s$', 'NNS'), # plural nouns
  8. ... (r'^-?[0-9]+(.[0-9]+)?$', 'CD'), # cardinal numbers
  9. ... (r'.*', 'NN') # nouns (default)
  10. ... ]

请注意,这些是顺序处理的,第一个匹配上的会被使用。现在我们可以建立一个标注器,并用它来标记一个句子。做完这一步会有约五分之一是正确的。

  1. >>> regexp_tagger = nltk.RegexpTagger(patterns)
  2. >>> regexp_tagger.tag(brown_sents[3])
  3. [('``', 'NN'), ('Only', 'NN'), ('a', 'NN'), ('relative', 'NN'), ('handful', 'NN'),
  4. ('of', 'NN'), ('such', 'NN'), ('reports', 'NNS'), ('was', 'NNS'), ('received', 'VBD'),
  5. ("''", 'NN'), (',', 'NN'), ('the', 'NN'), ('jury', 'NN'), ('said', 'NN'), (',', 'NN'),
  6. ('``', 'NN'), ('considering', 'VBG'), ('the', 'NN'), ('widespread', 'NN'), ...]
  7. >>> regexp_tagger.evaluate(brown_tagged_sents)
  8. 0.20326391789486245

最终的正则表达式«.*»是一个全面捕捉的,标注所有词为名词。这与默认标注器是等效的(只是效率低得多)。除了作为正则表达式标注器的一部分重新指定这个,有没有办法结合这个标注器和默认标注器呢?我们将很快看到如何做到这一点。

注意

轮到你来:看看你能不能想出一些模式,提高上面所示的正则表达式标注器的性能。(请注意1描述部分自动化这类工作的方法。)