使用Python的垃圾邮件过滤器

使用Python的垃圾邮件过滤器,python,machine-learning,scikit-learn,vectorization,Python,Machine Learning,Scikit Learn,Vectorization,我正在尝试使用Python2.7和scikit learn制作一个简单的垃圾邮件过滤器。所以,我有一套火车用的字母和一套考试用的字母。首先,我想对训练集进行向量化,并使用它拟合logistic回归,然后对测试集中的每个字母进行向量化,并将它们分别放入分类器中 import codecs import json import os from sklearn.feature_extraction.text import CountVectorizer from sklearn import line

我正在尝试使用Python2.7和scikit learn制作一个简单的垃圾邮件过滤器。所以,我有一套火车用的字母和一套考试用的字母。首先,我想对训练集进行向量化,并使用它拟合logistic回归,然后对测试集中的每个字母进行向量化,并将它们分别放入分类器中

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)
返回一个列表,而不是一个含义。所以,我想,predictor解释的
vect\u-mail
就像一个单词的文档样本,而不像一个有很多单词的文档。我应该如何重写这段代码?

根据sklearn的文档,它接受的不是要转换的单个文档,而是可转换的文档。由于Python中的字符串是其字符的一部分,
transform
生成的“文档”数量与字符串中的字符数量相同

要解决此问题,请将单个元素列表传递给
转换

vect_mail = vectorizer.transform([mail])