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']))]

今、私は何がわからないB、、、CなどQ。表すことができます。だから、私の質問:

  • これは何?
  • 彼らはどういう意味ですか?(タグの場合)
  • と「疑問詞」を示すタグがないのでwho、タグではないと思います。whatsWH

可能なすべてのタグとその意味のマッピングを含むリンクを誰かが投稿できれば幸いです。

4

3 に答える 3

3

タイプミスがあるようです。この行で:

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

set([t])この場合のように、 (not 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メソッド ondictとリスト内包表記の構文を使用して、メソッド全体を改善する必要があります。代わりにこれを試してください:

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]
于 2012-12-29T00:27:22.170 に答える
0

この行で POS タグを 1 文字に分割しています。

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

set('AT')になりますset(['A', 'T'])

于 2012-12-29T00:53:16.607 に答える
0

collections モジュールで 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]
于 2012-12-29T20:36:34.197 に答える