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

你能證明你是如何開發的代碼提取來自電子郵件的數據並對其進行處理以發現最重要的數據。收到

發件人地址頻率 線程活動 日期(回覆時間)在身體/主題