• 4.2 正则表达式标注器

    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描述部分自动化这类工作的方法。)