机器学习电子邮件优先级排序 – 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        …………………………………………………………………………

我有两组电子邮件数据(一组用于训练,一组用于测试)。上述内容适用于我的训练电子邮件数据。现在,我正在尝试训练一个学习算法,以便我可以预测测试数据的重要性。

为此,我一直在研究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分类器中。

请注意以下几点:

  1. 当您想对未见数据进行预测时,必须应用相同的方法和完全相同的vectorizer对象。即,您必须使用上面的循环构建一个test_dicts对象,然后执行X_test = vectorizer.transform(test_dicts)

  2. 我假设您想直接预测优先级。预测“排名”则是一个回归问题,而不是分类问题。一些scikit-learn分类器有一个predict_proba方法,可以生成邮件重要的概率,但您不能用排名来训练这些方法。

(*) 我是scikit-learn的DictVectorizer的作者,所以这不是无偏见的建议。不过,这是来自权威人士的建议 🙂

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注