簡體   English   中英

使用Python的垃圾郵件過濾器

[英]Spam filter using Python

我正在嘗試使用python 2.7和scikit-learn創建一個簡單的垃圾郵件過濾器。 因此,我有一組用於火車的字母和一組用於測試的字母。 首先,我想向量化訓練集並使用它進行邏輯回歸,然后向量化測試集中的每個字母並將它們分別放入分類器中。

import codecs
import json
import os
from sklearn.feature_extraction.text import CountVectorizer
from sklearn import linear_model

def classify(mail, vectorizer, logreg):
    vect_mail = vectorizer.transform(mail)
    res = logreg.predict(vect_mail)
    return res

def make_output(test_dir, vectorizer, logreg):
   with codecs.open('test.txt', 'w', 'utf-8') as out:
       for f in os.listdir(test_dir):
           mail = json.load(open(os.path.join(test_dir, f)), 'utf-8')
           result = classify(mail['body'].encode('ascii','ignore'), vectorizer, logreg)
           out.write(u'%s\t%s\n' % (f, result))

def read_train(train_dir):
    for f in os.listdir(train_dir):
        with open(os.path.join(train_dir, f), 'r') as fo:
            mail = json.load(fo, 'utf-8')
            yield mail

if __name__ == '__main__':
    train_mails = list(read_train('spam_data/train'))
    corpus = list()
    is_spam = list()

    for mail in train_mails:
        corpus.append(mail['body'].encode('ascii','ignore'))
        is_spam.append(mail['is_spam'])
    vectorizer = CountVectorizer()
    cnt_vect = vectorizer.fit_transform(corpus)
    logreg = linear_model.LogisticRegression()
    logreg.fit(cnt_vect, is_spam)
    make_output('spam_data/test', vectorizer, logreg)

但是res = logreg.predict(vect_mail)返回一個列表,而不是一個含義。 因此,我想,預測變量將vect_mail解釋為一個單詞的文檔樣本,而不是包含多個單詞的文檔。 我應該如何重寫此代碼?

根據sklearn的文檔, CountVectorizer.transform不接受要轉換的單個文檔,而是接受可迭代的文檔。 由於Python中的字符串是可重復使用的字符,因此transform生成的“文檔”與字符串中包含的字符一樣多。

為了解決此問題,請將單元素列表傳遞給transform

vect_mail = vectorizer.transform([mail])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM