2

我一直在研究Python编码的优先级电子邮件收件箱,最终目标是使用机器学习算法来标记(或分类)选定的电子邮件为重要还是不重要。我将从一些背景资料开始,然后转入我的问题。机器学习电子邮件优先级 - 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  ………………………………………………………………………… 

我有两套电子邮件数据(One Training,One Testing)。以上内容适用于我的培训电子邮件数据。我现在试图训练一个学习算法,以便我可以预测测试数据的重要性。

为此,我一直在寻找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) 
+0

我以前从未使用过scikit.learn 常用词,但它确实可能是“简单”的使用分类器,一旦你清理你的数据并获得你的特征向量。你的例子中的算法似乎是一个SVM分类器。您可能想要检查scikit.learn SVM期望的特征矢量格式。 只是一句话:你可能不希望在你的特性中包含“Rank”,因为它的信息已经在你指定的“Priority”标签中被编码(即那是你的目标变量)。 – herrfz

+0

因此,例如,我的特点可能是: 发件人地址频率 线程活动 接收日期(回复时间)在身体/主题 和目标类预测 常用词: \t优先 – ZeeeeeV

+0

是的,这是正确的。还要确保它们都是数字,即由数字(float,int)组成。 – herrfz

回答

4

最简单的(虽然可能不是最快)解决方案(*)是使用scikit学习的DictVectorizer。首先,阅读与Python的csv模块每个样品中,并建立包含双,同时保持优先级分开:

# UNTESTED CODE, may contain a bug or two; also, you need to decide how to 
# implement split_words 
datareader = 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 
    # etc. 
    dicts.append(d) 

# vectorize! 
vectorizer = DictVectorizer() 
X_train = vectorizer.fit_transform(dicts) 

您现在有一个稀疏矩阵X_train,与y在一起,可以喂到scikit-learn分类器。

注意:

  1. 当你想对看不见的数据预测,则必须采用相同的程序和完全相同的vectorizer反对。即你必须使用上面的循环构建一个test_dicts对象,然后执行X_test = vectorizer.transform(test_dicts)

  2. 我假设你想直接预测优先级。预测“排名”将是一个回归问题,而不是一个分类。一些scikit-learn分类器有一个predict_proba方法,它会产生电子邮件很重要的概率,但是你不能训练这些人。

(*)我是scikit-learn的作者DictVectorizer,所以这并非没有偏见的建议。这是从马的嘴,虽然:)

+0

感谢您的支持。但是,如果CSV数据已在CSV文件中逐字分割,我正在实施。我认为我不会要求'split_words',那么这条线会成为行[1]中的单词吗? – ZeeeeeV

+1

@ZeeeeeV您仍然需要以某种方式拆分字段,因为它将以单个字符串形式出现。 –

+0

好的,谢谢,我已经包括这个了。我能够成功地将数据提供给scikit-learn分类器并进行预测。但是,如果我想将70%的数据用于训练,30%用于测试,这可能吗?我想我会得到一个错误,当预测30%时,X预期每个样本的更多特征? – ZeeeeeV

0

你能证明你是如何开发的代码提取来自电子邮件的数据并对其进行处理以发现最重要的数据。收到

发件人地址频率 线程活动 日期(回复时间)在身体/主题