2016-09-21 67 views
1

就像標題所說,我該如何檢查兩個POS標籤是否屬於同一類別?如何檢查NLTK中的兩個POS標籤是否屬於同一類別?

例如,

go -> VB 
goes -> VBZ 

這兩個詞都是動詞。或者,

bag -> NN 
bags -> NNS 

這兩個都是名詞。 所以我的問題是,NLTK中是否存在任何函數來檢查兩個給定標籤是否在同一類別中?

回答

0

不知道這是你在找什麼,但你可以用universal tagset標籤:

from pprint import pprint 
from collections import defaultdict 

from nltk import pos_tag 
from nltk.tokenize import sent_tokenize, word_tokenize 

s = "I go. He goes. This bag is brown. These bags are brown." 

d = defaultdict(list) 
for sent in sent_tokenize(s): 
    text = word_tokenize(sent) 
    for value, tag in pos_tag(text, tagset='universal'): 
     d[tag].append(value) 

pprint(dict(d)) 

打印:

{'.': ['.', '.', '.', '.'], 
'ADJ': ['brown'], 
'DET': ['This', 'These'], 
'NOUN': ['bag', 'bags'], 
'PRON': ['I', 'He'], 
'VERB': ['go', 'goes', 'is', 'brown', 'are']} 

注意如何bagbags落入NOUN類別和gogoes屬於VERB

+0

非常感謝!這是一個好方法,但是我的情況有點不同。我得到的信息是一組標籤。我需要將它們聚類到不同的集合中。 –

1

讓我們先來簡單的例子:你的陰莖被打上了布朗標記集(這就是它的樣子),而且你會很高興與中定義的簡單標籤NLTK的"universal" tagset., ADJ, ADP, ADV, CONJ, DET, NOUN, NUM, PRON, PRT, VERB, X,其中圓點代表「標點」。在這種情況下,只需裝入NLTK的地圖,並與您的數據使用它:如果這不是你的使用情況

tagmap = nltk.tag.mapping.tagset_mapping("en-brown", "universal") 
if tagmap[tag1] == tagmap[tag2]: 
    print("The two words have the same part of speech") 

,你需要手動上的映射決定從各個變量的簡單範疇你想分配給它。如果你與布朗語料庫標記集工作,你可以看到蟒蛇中的標記及其含義here,或者是這樣的:

print(nltk.help.brown_tagset()) 

研究你的標記,並定義每個POS標籤你選擇的類別映射字典;人們有時會發現將Brown語料庫標籤按其前兩個字母分組在一起,將「NN」,「NN $」,「NNS-HL」等放在一起會很有用。您可以自動創建此特定映射,如下所示:

from nltk.corpus import brown 
alltags = set(t for w, t in brown.tagged_words()) 
tagmap = dict(t[:2] for t in alltags) 

然後你可以根據你的需要定製這張地圖;例如,把所有的標點標籤一起類別中的「」:

for tag in tagmap: 
    if not tag.isalpha(): 
     tagmap[tag] = "." 

一旦你的tagmap是根據自己的喜好,使用它像一個我從nltk進口。

最後,您可能會發現方便地將您的整個語料庫一次性重新標記,以便您可以簡單比較分配的標記。如果corpus是標記的句子在NLTK的<corpus>.tagged_sents()命令的格式列表(所以語料庫讀者對象)時,你可以重新生成代碼,一切都像這樣:

newcorpus = [] 
for sent in corpus: 
    newcorpus.append([ (w, tagmap[t]) for w, t in sent ]) 
+0

非常感謝您的詳細解釋。這正是我需要的。 –

相關問題