机器学习电子邮件优先级-Python

机器学习电子邮件优先级-Python,python,machine-learning,classification,ranking,scikit-learn,Python,Machine Learning,Classification,Ranking,Scikit Learn,我一直在开发一个Python编码的优先电子邮件收件箱,最终目标是使用机器学习算法将选定的电子邮件标记(或分类)为重要或不重要。我将从一些背景资料开始,然后进入我的问题 到目前为止,我已经开发了从电子邮件中提取数据并对其进行处理以发现最重要的数据的代码。这是通过使用以下电子邮件功能实现的: 发送者地址频率 线程活动 收到日期(答复之间的时间) 正文/主题中的常用词 我目前使用的代码根据每封电子邮件的重要性对其进行排名(或权重)(值0.1-1),然后应用“重要”或“不重要”的标签(在本例中仅为1

我一直在开发一个Python编码的优先电子邮件收件箱,最终目标是使用机器学习算法将选定的电子邮件标记(或分类)为重要或不重要。我将从一些背景资料开始,然后进入我的问题

到目前为止,我已经开发了从电子邮件中提取数据并对其进行处理以发现最重要的数据的代码。这是通过使用以下电子邮件功能实现的:

  • 发送者地址频率
  • 线程活动
  • 收到日期(答复之间的时间)
  • 正文/主题中的常用词
我目前使用的代码根据每封电子邮件的重要性对其进行排名(或权重)(值0.1-1),然后应用“重要”或“不重要”的标签(在本例中仅为1或0)。如果排名>0.5,则授予优先级状态。此数据存储在CSV文件中(如下所示)

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

为此,我一直在研究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
模块读入每个示例,并构建一个
dict
,其中包含
(特性、值)
对,同时保持优先级分开:

# 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_列
,它与
y
一起,可以提供给scikit学习分类器

注意:

  • 当您想要对看不见的数据进行预测时,必须对其应用相同的过程和完全相同的
    矢量器
    对象。也就是说,您必须使用上面的循环构建一个
    test\u dicts
    对象,然后执行
    X\u test=vectorizer.transform(test\u dicts)

  • 我假设你想直接预测优先级。相反,预测“排名”将是一个回归问题,而不是分类问题。一些scikit学习分类器有一个
    predict\u proba
    方法,它会产生电子邮件很重要的可能性,但你不能在等级上训练那些人

  • (*)我是scikit learn的
    DictVectorizer
    的作者,所以这不是一个公正的建议。不过,这是从马口中获得的:)

    最简单(但可能不是最快)的解决方案(*)是使用scikit learn的
    DictVectorizer
    。首先,使用Python的
    csv
    模块读入每个示例,并构建一个
    dict
    ,其中包含
    (特性、值)
    对,同时保持优先级分开:

    # 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_列
    ,它与
    y
    一起,可以提供给scikit学习分类器

    注意:

  • 当您想要对看不见的数据进行预测时,必须对其应用相同的过程和完全相同的
    矢量器
    对象。也就是说,您必须使用上面的循环构建一个
    test\u dicts
    对象,然后执行
    X\u test=vectorizer.transform(test\u dicts)

  • 我假设你想直接预测优先级。相反,预测“排名”将是一个回归问题,而不是分类问题。一些scikit学习分类器有一个
    predict\u proba
    方法,它会产生电子邮件很重要的可能性,但你不能在等级上训练那些人


  • (*)我是scikit learn的
    DictVectorizer
    的作者,所以这不是一个公正的建议。不过,它是从马口中取出来的:)

    您可能想查看的另一个库:
    (我以前使用过)

    您可能想查看的另一个库:
    (我以前用过)

    您能演示一下如何开发代码从电子邮件中提取数据,并对其进行处理以发现最重要的数据吗

    发送者地址频率 线程活动 收到日期(答复之间的时间)
    body/subject中的常用词能否演示如何开发代码从电子邮件中提取数据并对其进行处理以发现最重要的数据

    发送者地址频率 线程活动 收到日期(答复之间的时间)
    body/subject中的常用词

    我以前从未使用过scikit.learn,但一旦清理数据并获取特征向量,使用分类器可能确实是“简单”的。您示例中的算法似乎是一个SVM分类器。您可能需要检查scikit.learn SVM所期望的特征向量格式。请注意:您可能不想在功能中包含“排名”,因为有关它的信息已经编码在您指定的“优先级”标签中(即,这是您的目标变量)。因此,例如,我的功能可以是:发件人地址频率线程活动接收日期(回复间隔时间)身体/主题和预测目标类中的常用词:PriorityYes,没错。还要确保它们都是数字,即由数字(float,int)组成。如果您当前的代码可以根据电子邮件的特征对其进行排序,那么它已经是一个分类器了。你为什么要再训练一个?是的,很好。但是,目标值(或标签,重要/不重要)是通过当前使用的分类器获得的。因此,每个标签都是有偏见的(而不是事实真相)。那么,您应该如何评估分类错误?我的意思是,你可能想手动标记你的电子邮件重要性。我以前从未使用过scikit.learn,但一旦你清理完邮件,使用分类器确实可能是那么“简单”