我一直在开发一个使用Python编写的优先级电子邮件收件箱,目标是使用机器学习算法对一系列电子邮件进行标记(或分类),将其分为重要或不重要的邮件。我将先介绍一些背景信息,然后再提出我的问题。
到目前为止,我已经开发了从电子邮件中提取数据并处理这些数据以找出最重要邮件的代码。这通过以下电子邮件特征实现:
- 发件人地址频率
- 线程活动
- 接收日期(回复之间的时间)
- 邮件正文/主题中的常用词
我目前的代码会根据邮件的重要性为每封邮件分配一个排名(或权重)(值在0.1到1之间),然后标记为‘重要’或‘不重要’(在这种情况下,标记为1或0)。如果排名大于0.5,则授予优先级状态。这些数据存储在CSV文件中(如下所示)。
From Subject Body Date Rank Priority [email protected] HelloWorld Body Words 10/10/2012 0.67 1 [email protected] ByeWorld Body Words 10/10/2012 0.21 0 [email protected] SayWorld Body Words 10/10/2012 0.91 1 [email protected] HeyWorld Body Words 10/10/2012 0.48 0 etc …………………………………………………………………………
我有两组电子邮件数据(一组用于训练,一组用于测试)。上述内容适用于我的训练电子邮件数据。现在,我正在尝试训练一个学习算法,以便我可以预测测试数据的重要性。
为此,我一直在研究SCIKIT和NLTK。然而,我在将教程中学到的信息应用到我的项目中时遇到了困难。我对使用哪种学习算法没有特别的要求。这是否像应用以下内容一样简单?如果是的话,该如何做?
X, y = email.data, email.target from sklearn.svm import LinearSVC clf = LinearSVC() clf = clf.fit(X, y) X_new = [Testing Email Data] clf.predict(X_new)
回答:
最简单(虽然可能不是最快)的解决方案(*)是使用scikit-learn的DictVectorizer
。首先,使用Python的csv
模块读取每个样本,并构建一个包含(feature, value)
对的dict
,同时将优先级单独保存:
# 未经测试的代码,可能包含一两个错误;此外,您需要决定如何实现split_wordsdatareader = csv.reader(csvfile)dicts = []y = []for row in datareader: y.append(row[-1]) d = {"From": row[0]} for word in split_words(row[1]): d["Subject_" + word] = 1 for word in split_words(row[2]): d["Body_" + word] = 1 # 等等 dicts.append(d)# 向量化!vectorizer = DictVectorizer()X_train = vectorizer.fit_transform(dicts)
现在,您有一个稀疏矩阵X_train
,您可以将其与y
一起输入到scikit-learn分类器中。
请注意以下几点:
-
当您想对未见数据进行预测时,必须应用相同的方法和完全相同的
vectorizer
对象。即,您必须使用上面的循环构建一个test_dicts
对象,然后执行X_test = vectorizer.transform(test_dicts)
。 -
我假设您想直接预测优先级。预测“排名”则是一个回归问题,而不是分类问题。一些scikit-learn分类器有一个
predict_proba
方法,可以生成邮件重要的概率,但您不能用排名来训练这些方法。
(*) 我是scikit-learn的DictVectorizer
的作者,所以这不是无偏见的建议。不过,这是来自权威人士的建议 🙂