NLTK单词词性标注
NLTK single-word part-of-speech tagging
有没有一种方法可以使用 NLTK 来获取单个字母字符串的一组可能的词性,同时考虑到不同的单词可能具有同音异义词?
例如:report -> {Noun, Verb} , kind -> {Adjective, Noun}
我一直没能找到一个 POS-tokenizer 来标记完整句子上下文之外的单词的词性。这似乎是 NLTK 的一个非常基本的要求,所以我很困惑为什么我很难找到它。
因为 POS 模型是在基于 sentence/document 的数据上训练的,所以预训练模型的预期输入是 sentence/document。当只有一个单词时,它会将其视为一个单词句子,因此在该单词句子上下文中应该只有一个标签。
如果您试图为每个英语单词找到所有可能的 POS 标签,您将需要一个包含许多不同用法的单词的语料库,然后标记语料库和 count/extract 编号。每个单词的标签数。例如
>>> from nltk import pos_tag
>>> sent1 = 'The coaches are going from Singapore to Frankfurt'
>>> sent2 = 'He coaches the football team'
>>> pos_tag(sent1.split())
[('The', 'DT'), ('coaches', 'NNS'), ('are', 'VBP'), ('going', 'VBG'), ('from', 'IN'), ('Singapore', 'NNP'), ('to', 'TO'), ('Frankfurt', 'NNP')]
>>> pos_tag(sent2.split())
[('He', 'PRP'), ('coaches', 'VBZ'), ('the', 'DT'), ('football', 'NN'), ('team', 'NN')]
>>> from collections import defaultdict, Counter
>>> counts = defaultdict(Counter)
>>> tagged_sents = [pos_tag(sent) for sent in [sent1.split(), sent2.split()]]
>>> for word, pos in chain(*tagged_sents):
... counts[word][pos] += 1
...
>>> counts
defaultdict(<class 'collections.Counter'>, {'from': Counter({'IN': 1}), 'to': Counter({'TO': 1}), 'Singapore': Counter({'NNP': 1}), 'football': Counter({'NN': 1}), 'coaches': Counter({'VBZ': 1, 'NNS': 1}), 'going': Counter({'VBG': 1}), 'are': Counter({'VBP': 1}), 'team': Counter({'NN': 1}), 'The': Counter({'DT': 1}), 'Frankfurt': Counter({'NNP': 1}), 'the': Counter({'DT': 1}), 'He': Counter({'PRP': 1})})
>>> counts['coaches']
Counter({'VBZ': 1, 'NNS': 1})
或者,还有 WordNet:
>>> from nltk.corpus import wordnet as wn
>>> wn.synsets('coaches')
[Synset('coach.n.01'), Synset('coach.n.02'), Synset('passenger_car.n.01'), Synset('coach.n.04'), Synset('bus.n.01'), Synset('coach.v.01'), Synset('coach.v.02')]
>>> [ss.pos() for ss in wn.synsets('coaches')]
[u'n', u'n', u'n', u'n', u'n', u'v', u'v']
>>> Counter([ss.pos() for ss in wn.synsets('coaches')])
Counter({u'n': 5, u'v': 2})
但请注意,WordNet 是一种手工制作的资源,因此您不能指望其中包含每个英文单词。
是的。最简单的方法是不使用标注器,而是简单地加载一个或多个语料库并收集您感兴趣的单词的所有标签集。如果您对多个单词感兴趣,最简单的方法是收集标签对于语料库中的所有单词,然后查找您想要的任何内容。我会添加频率计数,因为我可以。例如,使用布朗语料库和简单的 "universal" 标签集:
>>> wordtags = nltk.ConditionalFreqDist((w.lower(), t)
for w, t in nltk.corpus.brown.tagged_words(tagset="universal"))
>>> wordtags["report"]
FreqDist({'NOUN': 135, 'VERB': 39})
>>> list(wordtags["kind"])
['ADJ', 'NOUN']
有没有一种方法可以使用 NLTK 来获取单个字母字符串的一组可能的词性,同时考虑到不同的单词可能具有同音异义词?
例如:report -> {Noun, Verb} , kind -> {Adjective, Noun}
我一直没能找到一个 POS-tokenizer 来标记完整句子上下文之外的单词的词性。这似乎是 NLTK 的一个非常基本的要求,所以我很困惑为什么我很难找到它。
因为 POS 模型是在基于 sentence/document 的数据上训练的,所以预训练模型的预期输入是 sentence/document。当只有一个单词时,它会将其视为一个单词句子,因此在该单词句子上下文中应该只有一个标签。
如果您试图为每个英语单词找到所有可能的 POS 标签,您将需要一个包含许多不同用法的单词的语料库,然后标记语料库和 count/extract 编号。每个单词的标签数。例如
>>> from nltk import pos_tag
>>> sent1 = 'The coaches are going from Singapore to Frankfurt'
>>> sent2 = 'He coaches the football team'
>>> pos_tag(sent1.split())
[('The', 'DT'), ('coaches', 'NNS'), ('are', 'VBP'), ('going', 'VBG'), ('from', 'IN'), ('Singapore', 'NNP'), ('to', 'TO'), ('Frankfurt', 'NNP')]
>>> pos_tag(sent2.split())
[('He', 'PRP'), ('coaches', 'VBZ'), ('the', 'DT'), ('football', 'NN'), ('team', 'NN')]
>>> from collections import defaultdict, Counter
>>> counts = defaultdict(Counter)
>>> tagged_sents = [pos_tag(sent) for sent in [sent1.split(), sent2.split()]]
>>> for word, pos in chain(*tagged_sents):
... counts[word][pos] += 1
...
>>> counts
defaultdict(<class 'collections.Counter'>, {'from': Counter({'IN': 1}), 'to': Counter({'TO': 1}), 'Singapore': Counter({'NNP': 1}), 'football': Counter({'NN': 1}), 'coaches': Counter({'VBZ': 1, 'NNS': 1}), 'going': Counter({'VBG': 1}), 'are': Counter({'VBP': 1}), 'team': Counter({'NN': 1}), 'The': Counter({'DT': 1}), 'Frankfurt': Counter({'NNP': 1}), 'the': Counter({'DT': 1}), 'He': Counter({'PRP': 1})})
>>> counts['coaches']
Counter({'VBZ': 1, 'NNS': 1})
或者,还有 WordNet:
>>> from nltk.corpus import wordnet as wn
>>> wn.synsets('coaches')
[Synset('coach.n.01'), Synset('coach.n.02'), Synset('passenger_car.n.01'), Synset('coach.n.04'), Synset('bus.n.01'), Synset('coach.v.01'), Synset('coach.v.02')]
>>> [ss.pos() for ss in wn.synsets('coaches')]
[u'n', u'n', u'n', u'n', u'n', u'v', u'v']
>>> Counter([ss.pos() for ss in wn.synsets('coaches')])
Counter({u'n': 5, u'v': 2})
但请注意,WordNet 是一种手工制作的资源,因此您不能指望其中包含每个英文单词。
是的。最简单的方法是不使用标注器,而是简单地加载一个或多个语料库并收集您感兴趣的单词的所有标签集。如果您对多个单词感兴趣,最简单的方法是收集标签对于语料库中的所有单词,然后查找您想要的任何内容。我会添加频率计数,因为我可以。例如,使用布朗语料库和简单的 "universal" 标签集:
>>> wordtags = nltk.ConditionalFreqDist((w.lower(), t)
for w, t in nltk.corpus.brown.tagged_words(tagset="universal"))
>>> wordtags["report"]
FreqDist({'NOUN': 135, 'VERB': 39})
>>> list(wordtags["kind"])
['ADJ', 'NOUN']