1

lingspam dataset現在、600ファイル(400通のメールと200通のスパムメール)の単語の出現をカウントして処理しようとしています。Porter StemmerAglorithmを使用して各単語をユニバーサルにしました。また、結果を各ファイル全体で標準化して、さらに処理できるようにしたいと思います。しかし、どうすればこれを達成できるかわかりません。

これまでのリソース

以下の出力を取得するには、ファイル内に存在しない可能性のあるアイテムを昇順で追加できる必要があります。

printing from ./../lingspam_results/spmsgb164.txt.out
[('money', 0, 'univers', 0,  'sales', 0)]
printing from ./../lingspam_results/spmsgb166.txt.out
[('money', 2, 'univers', 0,  'sales', 0)]
printing from ./../lingspam_results/spmsgb167.txt.out
[('money', 0, 'univers', 0,  'sales', 1)]

次に、をvectors使用するように変換する予定numpyです。

[0,0,0]
[2,0,0]
[0,0,0]

それ以外の..

printing from ./../lingspam_results/spmsgb165.txt.out
[]
printing from ./../lingspam_results/spmsgb166.txt.out
[('univers', 2)]
printing from ./../lingspam_results/spmsgb167.txt.out
[('sale', 1)]

Counterモジュールからの結果をに標準化するにはどうすればよいですかAscending Order(カウンター結果に、自分からは存在しない可能性のある項目を追加することもできますsearch_list)?各テキストファイルから読み取り、に基づいてリストを作成する、以下の何かを試しましたsearch_list

import numpy as np, os
from collections import Counter

def parse_bag(directory, search_list):
    words = []
    for (dirpath, dirnames, filenames) in os.walk(directory):
        for f in filenames:
            path = directory + "/" + f
            count_words(path, search_list)
    return;

def count_words(filename, search_list):
    textwords = open(filename, 'r').read().split()
    filteredwords = [t for t in textwords if t in search_list]
    wordfreq = Counter(filteredwords).most_common(5)
    print "printing from " + filename
    print wordfreq

search_list = ['sale', 'univers', 'money']
parse_bag("./../lingspam_results", search_list)

ありがとう

4

3 に答える 3

3

あなたの質問から、あなたの要件は、カウントを使用して、すべてのファイルにわたって一貫した順序で同じ単語が必要であるように思われます。これはあなたのためにそれをするはずです:

def count_words(filename, search_list):
    textwords = open(filename, 'r').read().split()
    filteredwords = [t for t in textwords if t in search_list]
    counter = Counter(filteredwords)
    for w in search_list:
        counter[w] += 0        # ensure exists
    wordfreq = sorted(counter.items())
    print "printing from " + filename
    print wordfreq

search_list = ['sale', 'univers', 'money']

サンプル出力:

printing from ./../lingspam_results/spmsgb164.txt.out
[('money', 0), ('sale', 0), ('univers', 0)]
printing from ./../lingspam_results/spmsgb166.txt.out
[('money', 2), ('sale', 0), ('univers', 0)]
printing from ./../lingspam_results/spmsgb167.txt.out
[('money', 0), ('sale', 1), ('univers', 0)]

most_common各ファイルの内容が順序やリストの長さに影響を与えたくないので、まったく使用したくないと思います。

于 2012-10-05T05:39:46.040 に答える
1

例で使用する呼び出しCounter(filteredwords)は、意図したとおりにすべての単語をカウントできます-それが行わないのは、最も使用されている単語を提供することです-つまり、「most_common」メソッドはありません-そのためには、すべてを再処理する必要があります(頻度、単語)を含むタプルのシーケンスを作成し、それを並べ替えるために、カウンター内のアイテム:

def most_common(counter, n=5):
     freq = sorted (((value ,item) for item, value in counter.viewitems() ), reverse=True)
     return [item[1] for item in freq[:n]]
于 2012-10-05T04:54:50.960 に答える
1

jsbuenoとMuMindの両方の組み合わせ

def count_words_SO(filename, search_list):
    textwords = open(filename, 'r').read().split()
    filteredwords = [t for t in textwords if t in search_list]
    counter = Counter(filteredwords)
    for w in search_list:
        counter[w] += 0        # ensure exists
    wordfreq = number_parse(counter)
    print "printing from " + filename
    print wordfreq

def number_parse(counter, n=5):
     freq = sorted (((value ,item) for item, value in counter.viewitems() ),    reverse=True)
     return [item[0] for item in freq[:n]]

出てきて、もう少し作業をして、Neurel Network感謝の気持ちを込めて準備します:)

printing from ./../lingspam_results/spmsgb19.txt.out
[0, 0, 0]
printing from ./../lingspam_results/spmsgb2.txt.out
[4, 0, 0]
printing from ./../lingspam_results/spmsgb20.txt.out
[10, 0, 0]
于 2012-10-05T05:57:35.973 に答える