mbox Unix 的入門級郵箱

2022-02-12 00:09:04 字數 3132 閱讀 5714

雖然老套卻很好用本章介紹一些基本的郵件(雖然社交網路有很多優點,但是在未來的幾年中,郵件仍將是網際網路的主打產品)分析工具和技術,以回答以下問題:

誰傳送的郵件最多?

一天中是否存在某個特定的時間(或是一周中的某天),這時候發件人最可能收到對乙個問題的回覆?

幾個人之間,誰傳送的訊息最多?

討論最熱烈的話題是什麼?

雖然社交****積累了越來越多的準實時社交資料,但它還是存在重大的缺點。和email 不同,社交網路資料是由服務提供者集中管理的,服務提供者可以建立規則,規定訪問它的方式,以及你能做什麼、不能做什麼注1。另一方面,郵件資料主要是分 散管理的,它以富郵件列表的形式分散在web 上,是對一連串有趣話題的討論。如果你使用google 和yahoo! 這類服務提供商提供的服務來檢索郵件列表,它們就會限制郵件列表資料的使用,但可以用稍微簡單的方法來挖掘內容,這會提高成功率:可以通過訂閱列

趨勢。注1:

你可能已經猜到了,要想找到作為例證的真實的社交資料集並不容易(如果還能找到的話),但幸運的是,本章有最為真實的資料集:公開的enron 郵件資料集(http://www. cs.cmu.edu/~enron/ )。

mbox:unix 的入門級郵箱(1)

假如你之前還沒有見過mbox 檔案,那麼我可以告訴你,從根本上說它是大型的串聯郵件訊息文字,很容易由基於文字的工具獲取。每封郵件的開頭都是由特殊的from_line 標記的,並將它格式化為"from [email protected] fri dec 25 00:06:42 2009" 模式,其中日期/時間戳是asctime( )格式,它是一種標準的固定長度的時間戳表示。

注意:mbox 格式是很常見的,大多數郵件客戶端都提供了「匯出」或者「另存為」選項,可以將資料匯出為此格式,而不關心底層實現。

在mobox 檔案中,兩封郵件之間的邊界是由兩個新行前面的(除了第一次出現)from_ line 決定的。示例3-1 是乙個虛構的mbox 的一小部分,它包含兩條訊息。

示例3-1 :示例mbox 檔案的一小部分

但是可以證明mbox 中至少還存在另一封郵件,在示例3-1 中,我們可以看到兩封郵件。按時間先後來說,第一封郵件是由buddy 撰寫的,傳送給[email protected]. org ,告訴他玩具已經裝好了。mbox 中的另一封郵件是santa 對rudolph 的回覆。示例mbox 中沒有顯示的是一封中間郵件,rudolph 給santa **了buddy 的郵件,解釋了他遲到的原因。雖然我們可以通過閱讀這些郵件文字推斷出發生的事情,但是我們也可以從message-id 、references 和in-reply-to 標頭中得到重要線索。這些標頭非常直觀,為顯示執行緒化討論和那類事情的演算法提供了基礎。稍後我們會研究在「電子郵件執行緒化」中使用了這些欄位的乙個著名算 法,但是重點是每封郵件都有唯一的郵件id ,包含了對這封正在被回覆的確切郵件是乙個回覆的情況的引用,而且可以在答覆鏈中引用多封其他郵件,它們是正在進行的討論程序的一部分。

注意:除了使用一些python 模組來幹這些沒有技術含量的活之外,我們不會討論電子郵件訊息的相關細節,如多部分郵件、mime( )、7位內容傳輸編碼等。如果你想仔細研究一下的話,毫不費力就能找到全面涵蓋這些主題的極好的參考資料。

示例3-2 :示例3-1 的訊息流

幸運的是,有很多可以做的,而你不必從根本上重新實現乙個郵件客戶端。而且,如果

你只是想要瀏覽郵箱,可以簡單地將它匯入到郵件客戶端並瀏覽它,對吧!雖然只是固定的套路,但也值得花一點時間來研究你的郵件客戶端是否有乙個「以mbox 格式匯入/ 匯出資料」的選項,這樣你才可以使用本章的工具來對它進行交叉分析。

python 提供了一些解析mbox 資料的基本工具,示例3-3 的指令碼介紹了一種將mbox 資料轉換為一系列json 物件的基本方法。

警告:請注意,示例3-3 的好幾個地方包含了decode('utf-8', 'ignore') 函式。當使用email 或網頁這些基於文字的資料時,由於特別的字元編碼,很容易會遇到臭名昭著的unicodedecodeerror ,發生了什麼或者如何解決這個問題通常並不明顯。簡略的回答是可以在任何字串值中執行decode() 函式,並且把它傳遞給第二個引數,該引數指定了在碰到unicodedecodeerror 時應該怎麼辦。預設值是'strict' ,它會引發異常,但是也可以根據需要使用'ignore' 或'replace' 來代替它。

示例3-3 :將mbox 轉換為更為方便的json 結構(mailboxes_jsonify_mbox.py)

警告:從python 2.6.x 開始,jsonlib2 (可以通過easy_install 獲得)這類基於c語言的第三方模組要比標準庫模組快得多,但是python 2.7 附帶了與jsonlib2 這類模組等同的更新(http:// bugs.python.org/issue4136 )。為了便於說明,就不多介紹在相當大的json 結構(大約為100mb )使用標準庫和jsonlib2 之間的區別了。

這段指令碼解析出了email 中最相關的資訊,並構建出了可移植的json 物件。我們能做的還有很多,但是它解決了最常見的問題,包括解碼quoted-printable(qp )文字(http:// en.wikipedia.org/wiki/quoted-printable )和去除html 標籤的簡單機制。quopri 模組用於解決qp 格式,它是一種用於將8位內容轉換為7位通道的編碼注2。示例3-3 的簡略的示例輸出如示例3-4 所示。

示例3-4 :來自示例3-1 的示例mbox ,由示例3-3 產生的示例json 輸出

入門級演算法

今天我想記錄的是一些關於入門級別的演算法。將乙個字串s對映為乙個整數,使得該整數可以唯一的代表字串s。先假設字串均由大寫字母a z構成,不妨設a z為0 25,即將26個大寫字母對應到了二十六進製制中。按照將二十六進製制轉換為十進位制的思路,即可實現將字串對映為整數的需求。題目 給出n個字串 恰好由...

線段樹的入門級

線段樹是一種二叉搜尋樹,與區間樹相似,它將乙個區間劃分成一些單元區間,每個單元區間對應線段樹中的乙個葉結點。對於線段樹中的每乙個非葉子節點 a,b 它的左兒子表示的區間為 a,a b 2 右兒子表示的區間為 a b 2 1,b 因此線段樹是平衡二叉樹,最後的子節點數目為n,即整個線段區間的長度。使用...

ansible的入門級使用

author headsen chen date 2018 08 02 11 46 35 yum install epel release yum y install ansible 另一種安裝方法 yum y install epel release yum y install python36 ...