跟着大神重寫的KNN 文檔歸類小工具

·背景 html

在知道KNN以前,樓主有時候會粗糙地作一些分類模型的計算。在拜讀了Orisun大神[http://www.cnblogs.com/zhangchaoyang/articles/2162393.html]的一些文章從中獲得了一些啓發,這些天突發奇想決定把N年前的分類模型按照KNN的思路重寫,從新把大神的思路形象地再回溯一下,方便後人更加清晰的認識整個過程。不少時候,歷史的進步來源於前輩們的傳道、授業、解惑。既然大神給JAVA,不材這邊就繼續補充一個C++的,爲陷在JAVA中的鬥士們吹一曲老革命之歌。linux

·設計思路 c++

    像大多數的ML體系一下,向量和機率學幾乎是整個ML體系的基礎,但從歷史經驗的推斷又是ML的命門,人類與機器之間的戰爭從未體質。文檔分類工具的設計初衷是但願拿到的這邊文章可以準確的歸爲某一類,大神是經過KNN把復旦的語料分個類。樓主這邊就簡單地把公司投訴內容也簡單歸個類。KNN的最先設計模型以下圖所示:算法

 

如上面左所示,X在K的定義範圍內(規則半徑或規則圖形內)與其周圍鄰居屬性歸類最多的一項,則歸爲某類。具體到與鄰居的類似是如何計算的,則是採用最基本的向量空間算法,Cos夾角。而SVM則是利用兩個向量至理想邊界的最大距離來分類,因此對於向量的理解相當重要。不少人KNN很簡單,可是越是簡單的,要用好反而更難。centos

 

在得知了最基本的計算思路後,作文檔分類就能迎刃而解。把用天然分詞分類,把每個文檔設置成一個向量,把每一個詞彙出現機率增益做爲向量的維度,這樣每個向量就有了本身的標尺。有了標尺以後,就能夠回到了上面有圖的理論部分。剩下的工做就是遍歷計算夾角,以下圖所示,一目瞭然吧。網絡

 

 

·編碼中的可能碰到問題 工具

  1. 文檔分詞工具,按目前漢字系來講其實都差很少,看我的喜愛,樓主喜歡用SCWS開源加自定義詞彙,惟獨在編譯時會碰到const char*的警告問題,這個與會不一樣的編譯器有關。有潔癖者,請變量前加const。
  2. 計算文檔向量原始矩陣:原著中推薦使用了berkleyDB+MR,可是實際操做過程當中,並無原著中那麼複雜,通過實踐,64位下c++ String和Map,真的隱祕而強大。
  3. 從流行的角度,在真正分類時,能夠推薦使用Spark,幾乎完爆hadoop了,後續樓主會補充pyspark的代碼。惋惜了分詞的時候不能發揮外部API的特點。
  4. 因爲出於我的興趣,未追求程序計算量的性能極限,有一些聲明和全局的處理比較粗糙。有該癖好的者,請多用指針。
  5. 下面是代碼和工具截圖,方便期間僅作了.a文件。其中涉及到部分公司的商業數據,樓主作了敏感處理,請僅作學術以後。如派爲他用,請自行接受法律制裁。
  6. 僅適用linux/centos kernel2.6

 

·測試的結果 oop

把投訴內容按網絡質量、終端銷售、服務質量進行分類。如以前所述樓主把cos值作了直接相加,相加最大值爲最類似斷定。在測試樣本的隨機結果中命中仍是OK的。固然,話說回來,任何ML算是的弊端仍是"歷史經驗和人的因素。性能

 

相關文章
相關標籤/搜索