1

ポイントシステムを使ってジャンクメールからメールを仕分けるプログラムを作りたいです。

メールのいくつかの単語について
、プログラムで「ジャンクワード」として分類された単語ごとに異なるポイントをプログラムに与えて、各単語に異なるポイントを割り当てて、各単語にある程度の価値があるようにしたいポイントの。

私の疑似コード:

  1. ファイルからテキストを読み取る
  2. 「ジャンクワード」を探す
    • 出てくる単語ごとに、その単語の価値を示します。
  3. 各ジャンクワードの合計ポイントが 10 の場合は、"SPAM" と続けて、ファイル内にあり、ジャンクワードとして分類された単語のリストとそのポイントを出力します。

例 (テキストファイル):

Hello!  
Do you have trouble sleeping? 
Do you need to rest?
Then dont hesitate call us for the absolute solution- without charge!

したがって、プログラムを実行して上記のテキストを分析すると、次のようになります。

SPAM 14p
trouble 6p
charge 3p 
solution 5p 

だから私が書くつもりだったのは、このマナーでした:

class junk(object):
    fil = open("filnamne.txt","r")
    junkwords = {"trouble":"6p","solution":"3p","virus":"4p"}
    words = junkwords

    if words in fil:
        print("SPAM")
    else:
        print("The file doesn't contain any junk")

だから今私の問題は、ファイルに出てくるリストの各単語にどのようにポイントを与えるかということです? そして、プログラムがすべき
ように合計ポイントを合計する方法、 ファイル内にある「ジャンクワード」のリストと各単語の合計ポイントが続きます..if total_points are > 10print "SPAM"

4

3 に答える 3

0

以下は、それに近づくための簡単なスクリプトです。

MAXPOINTS = 10
JUNKWORDS={"trouble":6,"solution":5,"charge":3,"virus":7}
fil = open("filnamne.txt", "r")

foundwords = {}

points = 0

for word in fil.read().split():
   if word in JUNKWORDS:
       if word not in foundwords:
           foundwords[word] = 0
       points += JUNKWORDS[word]
       foundwords[word] += 1

if points > 10:
    print "SPAM"
    for word in foundwords:
        print word, foundwords[word]*JUNKWORDS[word]
else:
    print "The file doesn't contain any junk"

.lower()単語に使用して、すべての辞書キーを小文字にしたい場合があります。たぶん、英数字以外の文字もすべて削除します。

于 2013-03-04T13:31:14.893 に答える
0

別のアプローチを次に示します。

from collections import Counter

word_points = {'trouble': 6, 'solution': 5, 'charge': 3, 'virus': 7}

words = []

with open('ham.txt') as f:
   for line in f:
      if line.strip(): # weed out empty lines
         for word in line.split():
             words.append(word)

count_of_words = Counter(words)

total_points = {}
for word in word_points:
    if word in count_of_words:
       total_points[word] = word_points[word] * count_of_words[word]

if sum(i[0] for i in total_points.iteritems()) > 10:
   print 'SPAM {}'.format(sum(i[0] for i in total_points.iteritems()))
   for i in total_points.iteritems():
      print 'Word: {} Points: {}'.format(*i)

実行できる最適化がいくつかありますが、一般的なロジックのアイデアが得られるはずです。CounterPython 2.7 以降で使用できます。

于 2013-03-04T13:38:06.323 に答える