当我打印nltk.corpus.brown.tagged_words()
时,它打印出大约1161192个带有单词及其相关标签的元组。
我想区分具有不同不同标签的不同字母。一个单词可以有多个标签。
Append list items by number of hyphens available我尝试了这个帖子的每个代码但是我没有得到任何超过3个标签的单词。据我所知,甚至还有8或9个标签。
我的做法哪里错了?怎么解决这个?我有两个不同的问题:
如何在不同的不同标签下找出语料库中不同单词的数量?语料库中的不同单词的数量让我们说出8个不同的标签。
同样,我想知道具有最多不同标签的单词。
而且,我只对单词感兴趣。我正在删除标点符号。
答案 0 :(得分:5)
使用defaultdict(Counter)
跟踪单词及其POS。然后按键排序字典' len(Counter)
:
from collections import defaultdict, Counter
from nltk.corpus import brown
# Keeps words and pos into a dictionary
# where the key is a word and
# the value is a counter of POS and counts
word_tags = defaultdict(Counter)
for word, pos in brown.tagged_words():
word_tags[word][pos] +=1
# To access the POS counter.
print 'Red', word_tags['Red']
print 'Marlowe', word_tags['Marlowe']
print
# Greatest number of distinct tag.
word_with_most_distinct_pos = sorted(word_tags, key=lambda x: len(word_tags[x]), reverse=True)[0]
print word_with_most_distinct_pos
print word_tags[word_with_most_distinct_pos]
print len(word_tags[word_with_most_distinct_pos])
[OUT]:
Red Counter({u'JJ-TL': 49, u'NP': 21, u'JJ': 3, u'NN-TL': 1, u'JJ-TL-HL': 1})
Marlowe Counter({u'NP': 4})
that
Counter({u'CS': 6419, u'DT': 1975, u'WPS': 1638, u'WPO': 135, u'QL': 54, u'DT-NC': 6, u'WPS-NC': 3, u'CS-NC': 2, u'WPS-HL': 2, u'NIL': 1, u'CS-HL': 1, u'WPO-NC': 1})
12
用X号获取单词。不同的POS:
# Words with 8 distinct POS
word_with_eight_pos = filter(lambda x: len(word_tags[x]) == 8, word_tags.keys())
for i in word_with_eight_pos:
print i, word_tags[i]
print
# Words with 9 distinct POS
word_with_nine_pos = filter(lambda x: len(word_tags[x]) == 9, word_tags.keys())
for i in word_with_nine_pos:
print i, word_tags[i]
[OUT]:
a Counter({u'AT': 21824, u'AT-HL': 40, u'AT-NC': 7, u'FW-IN': 4, u'NIL': 3, u'FW-IN-TL': 1, u'AT-TL': 1, u'NN': 1})
: Counter({u':': 1558, u':-HL': 138, u'.': 46, u':-TL': 22, u'IN': 20, u'.-HL': 8, u'NIL': 1, u',': 1, u'NP': 1})
答案 1 :(得分:0)
您可以使用itertools.groupby
来达到您想要的效果。请注意,以下代码很快就会被一起使用,而且很可能不是实现目标的最有效方式(我会让您优化它),但是它可以完成工作......
import itertools
import operator
import nltk
for k, g in itertools.groupby(sorted(nltk.corpus.brown.tagged_words()), key=operator.itemgetter(0)):
print k, set(map(operator.itemgetter(1), g))
<强>输出:强>
...
yonder set([u'RB'])
yongst set([u'JJT'])
yore set([u'NN', u'PP$'])
yori set([u'FW-NNS'])
you set([u'PPSS-NC', u'PPO', u'PPSS', u'PPO-NC', u'PPO-HL', u'PPSS-HL'])
you'd set([u'PPSS+HVD', u'PPSS+MD'])
you'll set([u'PPSS+MD'])
you're set([u'PPSS+BER'])
...
答案 2 :(得分:0)
以两行方式查找具有最多不同标记的单词(及其标记):
word2tags = nltk.Index(set(nltk.corpus.brown.tagged_words()))
print(max(word2tags.items(), key=lambda wt: len(wt[1])))
答案 3 :(得分:0)
NLTK提供了完美的工具来索引用于每个单词的所有标签:
wordtags = nltk.ConditionalFreqDist(nltk.corpus.brown.tagged_words())
或者,如果你想要随意翻译单词:
wordtags = nltk.ConditionalFreqDist((w.lower(), t) for w, t in brown.tagged_words())
我们现在有一个属于每个单词的标签索引(加上他们的频率,OP并不关心):
>>> print(wordtags["clean"].items())
dict_items([('JJ', 48), ('NN-TL', 1), ('RB', 1), ('VB-HL', 1), ('VB', 18)])
要查找标签最多的单词,请回到常规Python排序:
>>> wtlist = sorted(wordtags.items(), key=lambda x: len(x[1]), reverse=True)
>>> for word, freqs in wtlist[:10]:
print(word, "\t", len(freqs), list(freqs))
that 15 ['DT', 'WPS-TL', 'CS-NC', 'DT-NC', 'WPS-NC', 'WPS', 'NIL', 'CS-HL', 'WPS-HL',
'WPO-NC', 'DT-TL', 'DT-HL', 'CS', 'QL', 'WPO']
a 13 ['NN-TL', 'AT-NC', 'NP', 'AT', 'AT-TL-HL', 'NP-HL', 'NIL', 'AT-TL', 'NN',
'NP-TL', 'AT-HL', 'FW-IN-TL', 'FW-IN']
(etc.)