NLTK布朗语料库标签

时间:2014-10-08 08:02:45

标签: python nlp nltk corpus

当我打印nltk.corpus.brown.tagged_words()时,它打印出大约1161192个带有单词及其相关标签的元组。

我想区分具有不同不同标签的不同字母。一个单词可以有多个标签。

Append list items by number of hyphens available我尝试了这个帖子的每个代码但是我没有得到任何超过3个标签的单词。据我所知,甚至还有8或9个标签。

我的做法哪里错了?怎么解决这个?我有两个不同的问题:

  1. 如何在不同的不同标签下找出语料库中不同单词的数量?语料库中的不同单词的数量让我们说出8个不同的标签。

  2. 同样,我想知道具有最多不同标签的单词。

  3. 而且,我只对单词感兴趣。我正在删除标点符号。

4 个答案:

答案 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.)