1. 程式人生 > >中文分詞與詞頻統計例項

中文分詞與詞頻統計例項

http://blog.ourren.com/2014/09/24/chinese_token_and_frequency/

話說近兩年大資料確實火了,帶給我們最直接的視覺感受就是利用圖或者表來展示大資料所隱藏的內容,真是真實而又直觀。然而技術部落格的側邊欄標籤雲就是一種原始雛形,只不過這種標籤是通過作者手動新增而生成的。本文就是想通過自動提取博文標題中的關鍵字,然後通過外掛來進行顯示。核心技術就是:中文分詞與詞頻統計。

關於中文分詞

中文跟英語在分詞技術上差別比較多,中文多個字往往可以組成多個詞語,而且詞語之還可以縮寫。例如:蘇州杭州 可以縮寫為 蘇杭;而英文則相對固定,一個單詞就是一個單詞。也難怪平時在word中的詞語錯誤提醒功能不能完全糾正中文書寫錯誤,而可以糾正所有的英文書寫錯誤。

目前國內針對中文分詞有幾個比較流行的庫:

  • jieba:基於python語言開發,同時最開始接觸的也是這個開源庫,整體而言也不錯,github上關注度也是最高的;
  • Yaha:也是基於python語言開發的,跟jieba差不多,貌似功能方面有所改變;
  • NLPIR:開發語言C/C++/C#/Java;
  • 其它分詞可以參見參考連結1;

可以說這些分詞庫各有差別,選擇一款適合自己的庫就行了,本次選擇的是jieba,主要是由於基於python開發,並且在國內分詞中流行度比較高(V2EX原來的主題tag就是基於jieba做的)。

提取所有標題

將資料庫中的wp-post表中的資料匯出csv格式,然後用excel開啟並提取title列存為txt格式,這樣子所有的標題都存在txt檔案裡面了。

標題分詞

採用jieba給的例項程式進行標題分詞,實際上可以將所有的標題當做一段話進行分詞,但是為了更佳準確,還是選擇了單個標題進行分詞,直接上程式碼,非常簡短:

#encoding=utf-8 import jieba wordsall = {} #define return dic postfile = open(‘title’,’r’) ptitle = postfile.readlines() for ititle in ptitle:  ititle = ititle.replace(‘\n’,”) #clean \n  seg_list = jieba.cut(ititle, cut_all=False)  print ” “.join(seg_list)

這樣子就可以直接吧所有的標題進行分詞並打印出來。其實jieba在分詞的時候有三種模式(可以參考連結2),而本次採用的就是全模式:

  • 精確模式,試圖將句子最精確地切開,適合文字分析;
  • 全模式,把句子中所有的可以成詞的詞語都掃描出來, 速度非常快,但是不能解決歧義;
  • 搜尋引擎模式,在精確模式的基礎上,對長詞再次切分,提高召回率,適合用於搜尋引擎分詞。

其實程式碼還可以寫得更好點,統計關鍵字並統計每個詞語出現的次數,程式碼如下:

#encoding=utf-8 import jieba wordsall = {} #define return dic postfile = open(‘title’,’r’) ptitle = postfile.readlines() for ititle in ptitle: ititle = ititle.replace(‘\n’,”) #clean \n seg_list = jieba.cut(ititle, cut_all=False) rowlist = ” “.join(seg_list) words = rowlist.split(’ ‘) for word in words: if word !=”: if word in wordsall: wordsall[word]+=1 else: wordsall[word] = 1 wordsall = sorted(wordsall.items(), key=lambda d:d[1], reverse = True) for (word, cnt) in wordsall: print “%s:” % word,cnt

文字圖顯示

其實在上面的過程中雖然對標題的詞語進行了分詞,但是一般的人還是看不太懂這個部落格主要寫了什麼內容,而目前很流行的文字圖則更加方便地普通人快速瞭解相關資訊。這類主要採用線上服務實現文字圖的繪畫,線上平臺只需要提供關鍵字即可顯示文字圖,本次採用了worditout的線上服務進行生成;

將上面生成的詞語複製到worditout的文字框中,就生成了文章最前面的圖形,對比下發現這個文字圖的效果和說服力跟我手動標註的標籤雲差不多,也即是說自動的標籤分割技術基本上已經成熟,不需要人工手動新增標籤了。

其實,還有很多其它的線上文字圖生成系統,可以參照這裡的一篇文章;