机器学习电子邮件优先级-Python
我一直在开发一个Python编码的优先电子邮件收件箱,最终目标是使用机器学习算法将选定的电子邮件标记(或分类)为重要或不重要。我将从一些背景资料开始,然后进入我的问题 到目前为止,我已经开发了从电子邮件中提取数据并对其进行处理以发现最重要的数据的代码。这是通过使用以下电子邮件功能实现的:机器学习电子邮件优先级-Python,python,machine-learning,classification,ranking,scikit-learn,Python,Machine Learning,Classification,Ranking,Scikit Learn,我一直在开发一个Python编码的优先电子邮件收件箱,最终目标是使用机器学习算法将选定的电子邮件标记(或分类)为重要或不重要。我将从一些背景资料开始,然后进入我的问题 到目前为止,我已经开发了从电子邮件中提取数据并对其进行处理以发现最重要的数据的代码。这是通过使用以下电子邮件功能实现的: 发送者地址频率 线程活动 收到日期(答复之间的时间) 正文/主题中的常用词 我目前使用的代码根据每封电子邮件的重要性对其进行排名(或权重)(值0.1-1),然后应用“重要”或“不重要”的标签(在本例中仅为1
- 发送者地址频率
- 线程活动
- 收到日期(答复之间的时间)
- 正文/主题中的常用词
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)
predict\u proba
方法,它会产生电子邮件很重要的可能性,但你不能在等级上训练那些人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)
predict\u proba
方法,它会产生电子邮件很重要的可能性,但你不能在等级上训练那些人(*)我是scikit learn的
DictVectorizer
的作者,所以这不是一个公正的建议。不过,它是从马口中取出来的:)您可能想查看的另一个库:
(我以前使用过)您可能想查看的另一个库:
(我以前用过)您能演示一下如何开发代码从电子邮件中提取数据,并对其进行处理以发现最重要的数据吗 发送者地址频率 线程活动 收到日期(答复之间的时间)
body/subject中的常用词能否演示如何开发代码从电子邮件中提取数据并对其进行处理以发现最重要的数据 发送者地址频率 线程活动 收到日期(答复之间的时间)
body/subject中的常用词我以前从未使用过scikit.learn,但一旦清理数据并获取特征向量,使用分类器可能确实是“简单”的。您示例中的算法似乎是一个SVM分类器。您可能需要检查scikit.learn SVM所期望的特征向量格式。请注意:您可能不想在功能中包含“排名”,因为有关它的信息已经编码在您指定的“优先级”标签中(即,这是您的目标变量)。因此,例如,我的功能可以是:发件人地址频率线程活动接收日期(回复间隔时间)身体/主题和预测目标类中的常用词:PriorityYes,没错。还要确保它们都是数字,即由数字(float,int)组成。如果您当前的代码可以根据电子邮件的特征对其进行排序,那么它已经是一个分类器了。你为什么要再训练一个?是的,很好。但是,目标值(或标签,重要/不重要)是通过当前使用的分类器获得的。因此,每个标签都是有偏见的(而不是事实真相)。那么,您应该如何评估分类错误?我的意思是,你可能想手动标记你的电子邮件重要性。我以前从未使用过scikit.learn,但一旦你清理完邮件,使用分类器确实可能是那么“简单”