2012-12-28 66 views
1

我是NLP和NLTK的新手,我想找到含糊不清的單詞,即至少含有n不同標籤的單詞。我有這種方法,但輸出不是混淆。這是一個標籤列表還是別的嗎?

代碼:

def MostAmbiguousWords(words, n): 
# wordsUniqeTags holds a list of uniqe tags that have been observed for a given word 
wordsUniqeTags = {} 
for (w,t) in words: 
    if wordsUniqeTags.has_key(w): 
     wordsUniqeTags[w] = wordsUniqeTags[w] | set(t) 
    else: 
     wordsUniqeTags[w] = set([t]) 
# Starting to count 
res = [] 
for w in wordsUniqeTags: 
    if len(wordsUniqeTags[w]) >= n: 
     res.append((w, wordsUniqeTags[w])) 

return res 
MostAmbiguousWords(brown.tagged_words(), 13) 

輸出:

[("what's", set(['C', 'B', 'E', 'D', 'H', 'WDT+BEZ', '-', 'N', 'T', 'W', 'V', 'Z', '+'])), 
("who's", set(['C', 'B', 'E', 'WPS+BEZ', 'H', '+', '-', 'N', 'P', 'S', 'W', 'V', 'Z'])), 
("that's", set(['C', 'B', 'E', 'D', 'H', '+', '-', 'N', 'DT+BEZ', 'P', 'S', 'T', 'W', 'V', 'Z'])), 
('that', set(['C', 'D', 'I', 'H', '-', 'L', 'O', 'N', 'Q', 'P', 'S', 'T', 'W', 'CS']))] 

現在,我不知道是什麼BCQ,等。可以代表。所以,我的問題:

  • 這些是什麼?
  • 這是什麼意思? (如果他們是標籤)
  • 我認爲他們不是標籤,因爲whowhats沒有WH標籤,指示「wh問題詞」。

如果有人能發佈包含所有可能標記及其含義映射的鏈接,我會很高興。

+0

你如何給單詞添加標籤?它看起來像你截斷或分裂它們。也許不是添加「WH」,而是添加了「W」和「H」? – Colleen

+0

我不這樣做,我使用[brown corpus](http://nltk.org/api/nltk.corpus.html)可供下載[這裏](http://nltk.org/data的.html)。它廣泛用於從事NLP工作的人員。(至少在我看來,很多人正在使用它) –

+0

嗯。我想知道你是否以我沒有看到的方式截斷標籤?如果你在循環的每次迭代中打印出t會發生什麼? – Colleen

回答

3

它看起來像你有一個錯字。在這一行:

wordsUniqeTags[w] = wordsUniqeTags[w] | set(t) 

你應該有set([t])(不set(t)),就像你在else情況下做的。

這解釋了您看到的行爲,因爲t是一個字符串,並且set(t)正在爲字符串中的每個字符設置一個集合。你想要的是set([t])這使得一組以t爲元素。

>>> t = 'WHQ' 
>>> set(t) 
set(['Q', 'H', 'W']) # bad 
>>> set([t]) 
set(['WHQ'])   # good 

順便說一句,你可以糾正問題只需更改該行把事情簡單化:

wordsUniqeTags[w].add(t) 

但是,真的,你應該利用setdefault方法對dict和列出理解句法來改進整體方法。在set(['A', 'T'])

wordsUniqeTags[w] = wordsUniqeTags[w] | set(t) 

set('AT')結果:那麼試試這個來代替:

def most_ambiguous_words(words, n): 
    # wordsUniqeTags holds a list of uniqe tags that have been observed for a given word 
    wordsUniqeTags = {} 
    for (w,t) in words: 
    wordsUniqeTags.setdefault(w, set()).add(t) 
    # Starting to count 
    return [(word,tags) for word,tags in wordsUniqeTags.iteritems() if len(tags) >= n] 
0

要拆分的POS標籤成單個字符在這條線。

0

如何在集合模塊中使用Counter和defaultdict功能?

from collection import defaultdict, Counter 

def most_ambiguous_words(words, n): 
    counts = defaultdict(Counter) 
    for (word,tag) in words: 
     counts[word][tag] += 1 
    return [(w, counts[w].keys()) for w in counts if len(counts[word]) > n] 
相關問題