3

わかりました、値のリストと、その値のリストに関する情報を送信しようとしています。データを操作しながらそれをやろうとしています。何が起こっているかをお見せしましょう:

worddictlist2 = []
for innertweet in namelist:
        worddictlist = []
        for tweet in innertweet[0]:
                worddict = {word: tweet.count(word) for word in wordlist}
                worddictlist.append(worddict)
                worddictlist2.append(worddictlist)

namelist は、次の情報を持つ変数です。

[[['blah blah blah string blah blah blah blah blah blah', 'another string, blah blah blah, string string', 'string string string'], category], ['string string another string, blah', 'more words, more words, etc', 'yet again, here we go'], category2]

各フレーズで特定の単語が出現する回数を数えています。ただし、何らかの方法でカテゴリの割り当てを維持したいと考えています。

さまざまなループ全体でさまざまなリストを追加しようとしましたが、さまざまなリスト内包表記を試しましたが、必要な結果が表示されません。次のようになります。

[[{word1: 0, word2: 7, word3: 12, word4: 6}, category], {word1: 3, word2: 9, word3: 1, word4: 2}, category2]]

この出力を取得するにはどうすればよいですか? 私はこれを非効率的にやっていますか?私がこのデータを苦しめている方法は、このプロセスを非効率的に行っているように感じさせます.

4

3 に答える 3

1

まず、現在のコードでは、worddictツイートごとに が新しく作成されますが、これはおそらくあなたが望むものではありません。また、この方法str.count()を使用すると、ツイートに含まれる単語を別の単語の一部としてカウントするリスクがあります。たとえば、部分文字列として単語に表示される'as is the case'.count('as')ため、1 ではなく 2 となります。ツイートを空白で分割し、代わりにその分割内の一意の単語を反復するよりも、単語を単純に反復し、単語が出現するたびに辞書のカウントを増やすことをお勧めします。どちらがより多いかわかりません効率的。ascasewords = tweet.split(){word: words.count(word) for word in list(set(words))

だから、私の提案は

worddictlist2 = []
for innertweet in namelist:
    worddict = {}
    for tweet in innertweet[0]:
        words = tweet.split()
        for word in words:
            if not worddict.has_key(word):
                worddict[word] = 1
            else:
                worddict[word] += 1
    worddictlist2.append([worddict, innertweet[1]])

与えられた入力

namelist = [[['blah blah blah string blah blah blah blah blah blah', 'another string, blah blah blah, string string', 'string string string'], 'category'], [['string string another string, blah', 'more words, more words, etc', 'yet again, here we go'], 'category2']]

このコードは生成します

[[{'blah,': 1, 'blah': 11, 'string,': 1, 'string': 6, 'another': 1}, 'category'], [{'string,': 1, 'string': 2, 'again,': 1, 'etc': 1, 'we': 1, 'here': 1, 'blah': 1, 'words,': 2, 'another': 1, 'go': 1, 'yet': 1, 'more': 2}, 'category2']]

カンマが付いた単語を取り除くには、単語を数える前に句読点を削除する必要があります。たとえば、tweet = re.sub(r'[^a-zA-Z0-9]', ' ', tweet)上記のコードに次のように追加します。

import re

worddictlist2 = []
for innertweet in namelist:
    worddict = {}
    for tweet in innertweet[0]:
        tweet = re.sub(r'[^a-zA-Z0-9]', ' ', tweet)
        words = tweet.split()
        for word in words:
            if not worddict.has_key(word):
                worddict[word] = 1
            else:
                worddict[word] += 1
    worddictlist2.append([worddict, innertweet[1]])

print worddictlist2

それがもたらす

[[{'blah': 12, 'string': 7, 'another': 1}, 'category'], [{'again': 1, 'we': 1, 'string': 3, 'etc': 1, 'here': 1, 'blah': 1, 'another': 1, 'words': 2, 'go': 1, 'yet': 1, 'more': 2}, 'category2']]
于 2012-07-31T10:49:08.867 に答える
1

与えられたデータ:

category = "C"
category2 = "C2"

namelist = [
  [['blah blah blah string blah blah blah blah blah blah', 'another string, blah blah blah, string string', 'string string string'],
   category
  ],
  [['string string another string, blah', 'more words, more words, etc', 'yet again, here we go'],
   category2
  ]
]

wordlist = "blah string words".split()

次に、これは説明どおりに機能するはずです。

from collections import defaultdict

worddictlist2 = []
for innertweet in namelist:
    worddict = defaultdict(lambda: 0)
    category = innertweet[1]
    for tweet in innertweet[0]:
        for word in wordlist:
            worddict[word] += tweet.count(word)

    # optional - transform defaultdict into standard dict to make it printable
    worddictClean = {}
    worddictClean.update(worddict)

    worddictlist2.append([worddictClean, category])

print worddictlist2

そしてそれは出力します:

[[{'blah': 12, 'string': 7, 'words': 0}, 'C'], [{'blah': 1, 'string': 3, 'words': 2}, 'C2']]
于 2012-07-31T10:58:49.830 に答える
0

おそらく次のようになります。

worddictlist2 = []
wdlist = {}
for innertweet,cat in namelist:
   for i in innertweet:
      for j in i.split():
         j = j.strip(',') # strip comma
         wdlist.setdefault(j,0) # if 'j' unknown key
         wdlist[j] += 1
   worddictlist2.append(wdlist, cat)
   wdlist = {}


print(worddictlist2)

与えます:

[
 [{'another': 1, 'blah': 12, 'string': 7}, 'category'],
 [{'again': 1, 'another': 1, 'blah': 1, 'etc': 1, 'go': 1, 'here': 1, 'more': 2, 'string': 3, 'we': 1, 'words': 2, 'yet': 1}, 'category2']
]
于 2012-07-31T11:22:57.077 に答える