使用nltk进行无上下文的词性标注

4
有没有一种简单的方法,可以在没有上下文的情况下使用nltk确定给定单词的最可能的词性标记?或者如果不使用任何其他工具/数据集。
我尝试使用WordNet,但似乎sysnets没有按可能性排序。
>>> wn.synsets('says')

[Synset('say.n.01'), Synset('state.v.01'), ...]
1个回答

6
如果你想尝试没有上下文的标记,你需要一个单元标记器,也称为looup tagger单元标记器仅基于给定单词的标签频率来标记单词。因此,它避免了上下文启发式方法,但对于任何标记任务,您必须拥有数据。对于unigrams,您需要注释数据进行训练。请参见nltk教程中的lookup taggerhttp://nltk.googlecode.com/svn/trunk/doc/book/ch05.html
下面是在NLTK中训练/测试单元标记器的另一种方式。
>>> from nltk.corpus import brown
>>> from nltk import UnigramTagger as ut
>>> brown_sents = brown.tagged_sents()
# Split the data into train and test sets.
>>> train = int(len(brown_sents)*90/100) # use 90% for training
# Trains the tagger
>>> uni_tag = ut(brown_sents[:train]) # this will take some time, ~1-2 mins
# Tags a random sentence
>>> uni_tag.tag ("this is a foo bar sentence .".split())
[('this', 'DT'), ('is', 'BEZ'), ('a', 'AT'), ('foo', None), ('bar', 'NN'), ('sentence', 'NN'), ('.', '.')]
# Test the taggers accuracy.
>>> uni_tag.evaluate(brown_sents[train+1:]) # evaluate on 10%, will also take ~1-2 mins
0.8851469586629643

我不建议使用WordNet进行词性标注,因为仍有许多单词在WordNet中没有条目。但是,您可以查看WordNet中的词元频率,详情请见如何在NLTK中获取synset的WordNet语义频率?。这些频率基于SemCor语料库(http://www.cse.unt.edu/~rada/downloads.html)。

1
一个unigram标注器仅基于给定单词的标记频率来标记单词。理想情况下,它还会考虑单词结尾以进行平滑处理。 - Maarten

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接