词性标注是对给定句子中的单词进行词性(Parts of Speech,POS)分类的过程。实现标注目的的软件称为词性标注器(tagger)。NLTK支持多种标注器。
1.内置的词性标注器
创建一个新文件,命名为Exploring.py,输入以下代码:
import nltksimpleSentence="Beijing is the capital of China."wordsInSentence=nltk.word_tokenize(simpleSentence)print(wordsInSentence)partsOfSpeechTags=nltk.pos_tag(wordsInSentence)print(partsOfSpeechTags)
第1行代码指示Python解释器将NLTK模块从磁盘加载到内存,并使NLTK库在程序中可用。第2行创建了一个名为simpleSentence的变量,并定义为一个字符串。第3行代码调用了NLTK内置的word_tokenize()函数,它将给定的句子分解成单词并返回一个Python列表数据类型。一旦得到由函数计算的结果,我们就将其分配给wordsInSentence变量。第4行代码调用了Python内置的print()函数,它显示了如屏幕所示的数据结构。在本例中,我们显示了所有标注的单词列表。仔细观察这些输出,屏幕上显示了一个Python列表的数据结构,它由以逗号分隔的所有字符串组成,所有的列表元素都括在方括号内。第5行代码调用了内置的标注器pos_tag(),通过wordsInsentence变量生成一个单词列表,同时也标注了词性。一旦标注完成,就会生成完整的元组列表,每个元组都有标记的单词和相应的词性标注,最后通过第6行代码在屏幕上打印出给定的参数,结果如下:
["Beijing", "is", "the", "capital", "of", "China", "."][("Beijing", "NNP"), ("is", "VBZ"), ("the", "DT"), ("capital", "NN"), ("of", "IN"), ("China", "NNP"), (".", ".")]
在这个实例中,我们可以看到元组列表中的每个元组都由原始单词和POS标注组成。
2.编写自己的词性标注器
创建一个新文件,命名为OwnTagger.py输入以下源代码:
import nltkdef learnDefaultTagger(simpleSentence):wordsInSentence=nltk.word_tokenize(simpleSentence)tagger=nltk.DefaultTagger("NN")posEnabledTags=tagger.tag(wordsInSentence)print(posEnabledTags)def learnRETagger(simpleSentence):customPatterns=[(r".*ing$","ADJECTIVE"),(r".*ly$","ADVERB"),(r".*ion$","NOUN"),(r"(.*ate|.*en|is)$","VERB"),(r"^an$","INDEFINITE-ARTICLE"),(r"^(with|on|at)$","PREPOSITION"),(r"^\-?[0-9]+(\.[0-9]+)$","NUMBER"),(r">*$","None")]tagger=nltk.RegexpTagger(customPatterns)wordsInSentence=nltk.word_tokenize(simpleSentence)posEnabledTags=tagger.tag(wordsI