1

束やメールからデータを読み取り、各単語の頻度を数えます。最初に 2 つのカウンターを作成します。

counters.form = collections.defaultdict(dict)

によって周波数を取得します

for word in re.findall('[a-zA-Z]\w*', data):
    counters.form[word][file_name] += 1

各フォームには、この単語が含まれるすべてのメールと、このメールでのフォームの頻度を格納するカウンターがあります。例えば

form = {'a':   {'email1':4, 'email2':3}, 
        'the': {'email1':2, 'email3':4},
        'or':  {'email1':2, 'email3':1}}

特定のメールで特定のフォームの頻度を取得する方法は? ainの度数email2は 3 です。

4

2 に答える 2

2

の代わりにCounterクラスを使用することをお勧めしますdefaultdict

Counter は、ハッシュ可能なオブジェクトをカウントするための dict サブクラスです。これは、要素がディクショナリ キーとして格納され、そのカウントがディクショナリ値として格納される順序付けられていないコレクションです。カウントは、ゼロまたは負のカウントを含む任意の整数値にすることができます。Counter クラスは、他の言語のバッグまたはマルチセットに似ています。

于 2012-05-10T03:15:42.060 に答える
2

IR (情報検索) コミュニティが逆索引と呼ぶものを作成しているようです。その場合、私はあなたが取っている全体的なアプローチに同意しますが、デフォルトの辞書と組み合わせてカウンタークラスを使用することもお勧めします...

counters.form = collections.defaultdict(collections.Counter)

counters.form圧縮された世界モデルの一種のインデックスとして機能し、観測がないことはエラー (または False) ではなく、単に 0 です。

例としてデータを使用するformと、次のように逆インデックスを設定します...

#-- Build the example data into the proposed structure...
counters.form['a'].update({'email1':4, 'email2':3})
counters.form['the'].update({'email1':2, 'email3':4})
counters.form['or'].update({'email1':2, 'email3':1}})

ここで、このデータのフォームの頻度を取得するために、2 次元配列のように逆参照します...

print counters.form['a']['email2']

...これは印刷3され、現在使用している構造と多かれ少なかれ同じです。これら 2 つのアプローチの本当の違いは、観察がない場合です。例えば...

print counters.form['noword']['some-email']

...現在の構造 ( collections.defaultdict(dict)) を使用すると、 の 'noword' の get はcounters.form'miss' になり、defaultdict は自動的に新しく構築された空の辞書を に関連付けcounters.form['noword']ます。ただし、この空の dict に対してキー「some-email」を照会すると、空の dict にはそのようなキーがないKeyErrorため、「some-email」の例外が発生します。

代わりに提案された構造 ( collections.defaultdict(collections.Counter)) を使用すると、「noword」の get が失敗counters.formし、newcollections.Counterがキー「noword」に関連付けられます。その後、カウンターが「some-email」について (2 番目の逆参照で) 照会されると、カウンターは 0 を返します。これは (私が信じている) 望ましい動作です。

他のレシピをいくつか...

#-- Show distinct emails which contain 'someword'
emails = list(counters.form['someword'])

#-- Show tally of all observations of 'someword'
tally = sum(counters.form['someword'].values( ))
于 2012-05-10T04:55:08.660 に答える