就像標題所說,我該如何檢查兩個POS標籤是否屬於同一類別?如何檢查NLTK中的兩個POS標籤是否屬於同一類別?
例如,
go -> VB
goes -> VBZ
這兩個詞都是動詞。或者,
bag -> NN
bags -> NNS
這兩個都是名詞。 所以我的問題是,NLTK中是否存在任何函數來檢查兩個給定標籤是否在同一類別中?
就像標題所說,我該如何檢查兩個POS標籤是否屬於同一類別?如何檢查NLTK中的兩個POS標籤是否屬於同一類別?
例如,
go -> VB
goes -> VBZ
這兩個詞都是動詞。或者,
bag -> NN
bags -> NNS
這兩個都是名詞。 所以我的問題是,NLTK中是否存在任何函數來檢查兩個給定標籤是否在同一類別中?
不知道這是你在找什麼,但你可以用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']}
注意如何bag
和bags
落入NOUN
類別和go
和goes
屬於VERB
。
讓我們先來簡單的例子:你的陰莖被打上了布朗標記集(這就是它的樣子),而且你會很高興與中定義的簡單標籤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 ])
非常感謝您的詳細解釋。這正是我需要的。 –
非常感謝!這是一個好方法,但是我的情況有點不同。我得到的信息是一組標籤。我需要將它們聚類到不同的集合中。 –