1

私はファイルを読み、それらを単語の配列に分割しました:

file1 = File.open("spam1.txt","rb")
file1_contents = file1.read
file1 = file1_contents.split(' ')

ハッシュを使用して単語の頻度を数え、単語の頻度に従って並べ替えることができます。

freqs1 = Hash.new(0)
file1.each { |word| freqs1[word] +=1}
freqs1 = freqs1.sort_by {|x,y| y}
freqs1.reverse!

次のように結果をユーザーに出力することもできます。

freqs.each{|word, freq| puts word + ' ' + freq.to_s}

file1配列またはハッシュfreqs1特定の単語が複数回含まれている場合、ユーザーにメッセージを表示したい。

freqs1ハッシュをループして適切なメッセージをユーザーに表示するという (悪い) アイデアがありました。

freqs1.each{|word,freq|
    if ((word == ('business' || 'fund' || 'funds' || 'account' ||'transfer' || 'money')) && freq > 2)  || (word == 'Iraq' && freq > 1 )  then
      puts "File 1 is suspected as spam mail - suspicious word frequency"
    else
      puts "File 1 does not appear to be spam email"
    end
}

ただし、これはの各要素に作用するため、これはばかげていましたhash

business, fund, funds, accountetc のような単語が 2 回以上表示される場合、特定のメッセージをユーザーに表示するにはどうすればよいですか?

助けてくれてありがとう。

4

2 に答える 2

1

その最終的なステートメントを改善したいだけなら、これを試してください(テストされていませんが、行くべきです):

bad_words = %w{business fund funds account transfer money}
is_spam = freqs1.any? do |word, freq| 
  (freq > 2 && bad_words.include?(word)) || (word == 'Iraq' && freq > 1)
end

if is_spam
  puts "File 1 is suspected as spam mail - suspicious word frequency"
else
  puts "File 1 does not appear to be spam email"
end

Enumerable#any?ほとんどの作業は が行いますが、不適切な単語のリストを抽出して読みやすくします。

于 2013-10-30T21:20:05.350 に答える