4

本当に簡単な質問ですが、私はそれを解読できないようです. 次のようにフォーマットされた文字列があります。

["category1",("data","data","data")]
["category2", ("data","data","data")]

さまざまなカテゴリを投稿と呼び、データ セクションから最も頻繁に使用される単語を取得したいと考えています。だから私は試しました:

from nltk.tokenize import wordpunct_tokenize
from collections import defaultdict
freq_dict = defaultdict(int)

for cat, text2 in posts:
   tokens = wordpunct_tokenize(text2)
   for token in tokens:
       if token in freq_dict:
           freq_dict[token] += 1
       else:
           freq_dict[token] = 1
   top = sorted(freq_dict, key=freq_dict.get, reverse=True)
   top = top[:50]
   print top

ただし、これにより、文字列内の投稿ごとに上位の単語が表示されます。

一般的なトップ ワード リストが必要です。
ただし、for ループから print top を取り出すと、最後の投稿の結果しか得られません。
誰にもアイデアはありますか?

4

4 に答える 4

3

これは範囲の問題です。また、 の要素を初期化する必要がないdefaultdictため、コードが簡素化されます。

次のようにしてみてください。

posts = [["category1",("data1 data2 data3")],["category2", ("data1 data3 data5")]]

from nltk.tokenize import wordpunct_tokenize
from collections import defaultdict
freq_dict = defaultdict(int)

for cat, text2 in posts:
   tokens = wordpunct_tokenize(text2)
   for token in tokens:
      freq_dict[token] += 1

top = sorted(freq_dict, key=freq_dict.get, reverse=True)
top = top[:50]
print top

これは、予想どおり、出力します

['data1', 'data3', 'data5', 'data2']

結果として。

あなたが本当にそのようなものを持っているなら

posts = [["category1",("data1","data2","data3")],["category2", ("data1","data3","data5")]]

wordpunct_tokenize()入力データはすでにトークン化されているため、入力としては必要ありません。次に、次のように動作します。

posts = [["category1",("data1","data2","data3")],["category2", ("data1","data3","data5")]]

from collections import defaultdict
freq_dict = defaultdict(int)

for cat, tokens in posts:
   for token in tokens:
      freq_dict[token] += 1

top = sorted(freq_dict, key=freq_dict.get, reverse=True)
top = top[:50]
print top

また、期待される結果も出力します。

['data1', 'data3', 'data5', 'data2']
于 2013-05-04T14:38:18.177 に答える
3

Counterを使用しないのはなぜですか?

In [30]: from collections import Counter

In [31]: data=["category1",("data","data","data")]

In [32]: Counter(data[1])
Out[32]: Counter({'data': 3})

In [33]: Counter(data[1]).most_common()
Out[33]: [('data', 3)]
于 2013-05-04T14:53:26.620 に答える
2
from itertools import chain
from collections import Counter
from nltk.tokenize import wordpunct_tokenize
texts=["a quick brown car", "a fast yellow rose", "a quick night rider", "a yellow officer"]
print Counter(chain.from_iterable(wordpunct_tokenize(x) for x in texts)).most_common(3)

出力:

[('a', 4), ('yellow', 2), ('quick', 2)]

Counter.most_commonのドキュメントでわかるように、返されるリストはソートされています。

コードで使用するには、次のことができます

texts = (x[1] for x in posts)

またはあなたができる

... wordpunct_tokenize(x[1]) for x in texts ...

投稿が実際に次のようになっている場合:

posts=[("category1",["a quick brown car", "a fast yellow rose"]), ("category2",["a quick night rider", "a yellow officer"])]

カテゴリを取り除くことができます:

texts = list(chain.from_iterable(x[1] for x in posts))

textsになります['a quick brown car', 'a fast yellow rose', 'a quick night rider', 'a yellow officer']

その後、この回答の上部のスニペットでそれを使用できます。

于 2013-05-04T14:52:23.923 に答える
1

投稿を処理できるようにコードを変更してから、上位の単語を取得するだけです。

from nltk.tokenize import wordpunct_tokenize
from collections import defaultdict

freq_dict = defaultdict(int)

for cat, text2 in posts:
   tokens = wordpunct_tokenize(text2)
   for token in tokens:
       freq_dict[token] += 1
# get top after all posts have been processed.
top = sorted(freq_dict, key=freq_dict.get, reverse=True)
top = top[:50]
print top
于 2013-05-04T14:38:09.253 に答える