6.7 标注词性
问题描述
为文本数据中的每个单词或字符标注词性。
解决方案
使用NLTK预训练的词性标注器:
上述代码输出一个包含单词和其词性的元组列表。NLTK使用Penn Treebank的词性标签进行标注。这里给出一部分Penn Treebank标签的例子,如下表所示。
一旦为文本添加了词性标签,就能依据标签找到特定词性的单词了。例如,找到所有的名词:
现实中更可能遇到的情况是,有一份数据,其中每个观察值都包含一条推文,我们想将这些句子转换成用词性表示的特征(例如,如果是专有名词,特征值就是1,否则为ʘ):
使用classes_就能发现每个特征都是一个词性标签:
讨论
如果文本是英文的,而且不是关于某个特定主题的(例如医学),那么标注词性最简单的做法就是使用NLTK预训练的词性标注器。但是,如果pos_tag不是很准确,NLTK也提供了自行训练标注器的机制。训练标注器的主要缺点就是需要一个很大的文本语料库,并且其中每个单词的词性标签都是已知的。构建这样的带标签的语料库显然是一件很烦琐的工作,所以只能作为最后没有办法的办法。
说了这么多,如果你想要用带标签的语料库来训练标注器,可以参照下面例子的做法。我们使用的语料库是Brown Copus(布朗语料库),它是最流行的带标签的文本语料库之一。我们使用的是回退n元模型(back n-gram)标注器,n表示在预测一个单词的词性时需要考虑多少个前面的单词(其实是n-1个)。首先,考虑这个单词的前两个单词(使用TrigramTagger),如果它前面没有两个单词,则“回退”到只考虑它前面的一个单词,这时候使用BigramTagger。如果这个单词前面一个单词都没有,就通过UnigramTagger只考虑这个单词本身。为了检测标注器的准确率,我们将文本数据分成两个部分,一部分用来训练标注器,另一部分用来测试标注器的效果:
延伸阅读
● Penn Treebank(http://bit.ly/2HROPo5)
● 布朗语料库(http://bit.ly/2FzgMTx)
本书评论