【hadoop】大規模中文網站聚類kmeans的mapreduce實現(上)

       由於前段時間期末考和放假,這篇文章推後了很多纔出來。這是一個課程設計,主要是應用mapreduce對大規模的中文網站使用kmeans進行聚類,最後將相關的網站標記爲同一類輸出。

       輸入的每一行是網站的全局編號,對應有該網站的所有內容,包括未經處理的html等格式標記,輸出爲網站的全局編號,對應該網站屬於的聚類編號。主要代碼已經同步到github中,https://github.com/shenguojun/hadoop/tree/master/WebKmeans具體處理如下。

一 概述

        大規模中文網站聚類可以應用在檢測相似內容網頁,以及對大量網頁進行分類的應用中由於在互聯網中有大量的中文的網頁,普通的計算機無法對百萬數量級以上的網頁進行處理,因此使用 Hadoop 分佈式計算平臺對這些大規模的網頁進行存儲以及Mapreduce計算模型進行聚類分析處理。

      編程環境

       Hadoop 版本是 1.0.4,編程環境是 Eclipse Indigo,測試使用 pseudo 僞分佈模式,運行機器使用四核 Intel(R) Core(TM)2 Quad Q6600 @ 2.40GHz CPU,4G 內存。

     輸入數據說明(未經處理的原始網頁):

     Key (LongWritable) 每一個網頁的全局 ID 號
     Value (Text) 網頁內容


     輸出數據說明(對每一個網頁進行聚類標註):
     Key (LongWritable) 每一個網頁的全局 ID 號
     Value (IntWritable) 該網頁所屬聚類中心編號

      實現流程

        

        主要的流程分別爲:提取中文字符,分詞,去除停用詞,統計每個單詞在每個網頁中出現的次數以及在多少個網頁中出現、每個網頁的總詞數以及總共有多少個網頁並計算 Tfidf值,生成網頁向量,建立詞表,隨機選取 k 個網頁作爲中心點,迭代進行 kmeans 計算,經過最大的迭代次數或者中心點不再改變時輸出最終的中心點,最後根據最終的中心點判斷一次每個網頁屬於哪個哪一類並輸出最後結果。關鍵的流程如下圖所示。

     項目類說明(代碼請見https://github.com/shenguojun/hadoop/tree/master/WebKmeans

     WordFrequenceInDocument:提取中文,分詞,去停詞,統計詞頻
    WordCountsInDocuments:統計每個網頁的單詞數目
    WordsInCorpusTFIDF:統計單詞在多少個網頁出現,計算 TFIDF,建立詞表
    DocumentVetorBuid:建立網頁向量,隨機選取 K 個網頁作爲中心點
    Kmeans:判斷網頁屬於哪一類,更新中心點,最後輸出網頁所屬中心標號
    KmeansDriver:控制 Mapreduc 的 Job 順序,以及 Kmeans 迭代流程,設置參數
    DocTool:根據網頁向量以及所有中心點向量輸出網頁所屬的中心編號

    下面對每個類進行具體的說明。

二 輸入數據前期處理

數據的前期處理分爲提取中文、分詞以及去除停用詞三個部分。這些功能主要在WordFrequenceInDocument 類中的 Mapper 部分進行。

在其中提取中文使用正則表達式完成,主要代碼如下:

// 匹配中文正則表達式
private static final Pattern PATTERN = Pattern.compile("[\u4e00-\u9fa5]");
Matcher m = PATTERN.matcher(value.toString());
while (m.find()) {
    String matchkey = m.group();
    valueBuilder.append(matchkey);
}

分詞和去除停用詞使用開源的 IKanayzer 工具包實現,詳見:
http://code.google.com/p/ik-analyzer/
項目中主要代碼如下:

StringReader retext = new StringReader(text);
IKSegmenter ikseg = new IKSegmenter(retext, false);
Lexeme lex = null
while ((lex = ikseg.next()) != null ){
  // 在每個單詞後面加上對應的所在網站
  this.word.set(lex.getLexemeText() + "@" + key.toString());
}

三 計 算 Tfidf(Term Frequency Inverse Document Frequency)及詞表建立

計算 TFIDF 主要由 WordFrequenceInDocument(提取中文,分詞,去停詞,統計詞頻) WordCountsInDocuments、(統計每個網頁的單詞數目) WordsInCorpusTFIDF、(統計單詞在多少個網頁出現,計算 TFIDF,建立詞表)這三個類進行。
三個類中的 Mapreduce 工作如下表所示。

輸出類似如下:
中國公民@783          4
中國共產黨@36        2
中國共產黨@519      7


輸出類似如下:
中國公民@783   4/1232
中國共產黨@36  2/2895
中國共產黨@519  7/3240


輸出類似如下:
中國公民@783   0.02922078
中國共產黨@36   0.00563378
中國共產黨@519  0.01761862
詞表:
中國公民   1859
中國共產黨   1860


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章