- 4.2 正则表达式标注器
4.2 正则表达式标注器
正则表达式标注器基于匹配模式分配标记给词符。例如,我们可能会猜测任一以 ed 结尾的词都是动词过去分词,任一以’s 结尾的词都是名词所有格。可以用一个正则表达式的列表表示这些:
>>> patterns = [... (r'.*ing$', 'VBG'), # gerunds... (r'.*ed$', 'VBD'), # simple past... (r'.*es$', 'VBZ'), # 3rd singular present... (r'.*ould$', 'MD'), # modals... (r'.*\'s$', 'NN$'), # possessive nouns... (r'.*s$', 'NNS'), # plural nouns... (r'^-?[0-9]+(.[0-9]+)?$', 'CD'), # cardinal numbers... (r'.*', 'NN') # nouns (default)... ]
请注意,这些是顺序处理的,第一个匹配上的会被使用。现在我们可以建立一个标注器,并用它来标记一个句子。做完这一步会有约五分之一是正确的。
>>> regexp_tagger = nltk.RegexpTagger(patterns)>>> regexp_tagger.tag(brown_sents[3])[('``', 'NN'), ('Only', 'NN'), ('a', 'NN'), ('relative', 'NN'), ('handful', 'NN'),('of', 'NN'), ('such', 'NN'), ('reports', 'NNS'), ('was', 'NNS'), ('received', 'VBD'),("''", 'NN'), (',', 'NN'), ('the', 'NN'), ('jury', 'NN'), ('said', 'NN'), (',', 'NN'),('``', 'NN'), ('considering', 'VBG'), ('the', 'NN'), ('widespread', 'NN'), ...]>>> regexp_tagger.evaluate(brown_tagged_sents)0.20326391789486245
最终的正则表达式«.*»是一个全面捕捉的,标注所有词为名词。这与默认标注器是等效的(只是效率低得多)。除了作为正则表达式标注器的一部分重新指定这个,有没有办法结合这个标注器和默认标注器呢?我们将很快看到如何做到这一点。
注意
轮到你来:看看你能不能想出一些模式,提高上面所示的正则表达式标注器的性能。(请注意1描述部分自动化这类工作的方法。)
