1. 程式人生 > >使用Spark框架中文分詞統計

使用Spark框架中文分詞統計

  • 技術
    Spark+中文分詞
  • 演算法
    對爬取的網站文章的關鍵詞進行統計,是進行主題分類,判斷相似性的一個基礎步驟。例如,一篇文章大量出現“風景”和“酒店”之類的詞語,那麼這篇文章歸類為“旅遊”類的概率就比較大。而在關於“美食”的文章中,“餐廳”和“美味”等詞語出現的頻率一般也會比較大。
    分詞使用語言云http://www.ltp-cloud.com實現對一段中文先進行分詞,然後通過Spark streaming 對分詞後的內容進行詞頻統計。
  • 通過ltp-cloud進行中文分詞
    目前國內有不少科研機構開發了中文分詞系統,例如中科院、哈工大、科大訊飛等,本次體驗的是哈工大的語言云。

  • Rest API呼叫,
    例如(YourAPIKey替換成你的APIKey):

curl -i"http://api.ltp-cloud.com/analysis/?api_key=YourAPIKey&text=認知商業需要認知技術&pattern=ws&format=plain"
HTTP/1.1 200 OK
Server: nginx
Date: Tue, 22Mar 2016 14:18:39 GMT
Content-Type:text/plain;charset=utf-8
Transfer-Encoding:chunked
Connection:keep-alive
X-Powered-By-360WZB:wangzhan.360.cn
Vary:Accept-Encoding
  • Spark Streaming進行詞頻統計
    Spark Streaming是基於Spark平臺上提供的流計算引擎,可以處理多種資料來源的流資料,並進行統計分析。在Spark Streaming的sample程式中,就提供了從MQTT,Kafka,Network socket等來源讀取資料的word count。本次測試NetworkWordCount,即SparkStreaming從TCPIP Socket讀取資料,然後對內容進行詞頻統計。
// 建立Streaming上下文,使用2個執行緒,流處理時間視窗1秒
valconf=newSparkConf.setMaster("local[2]"
).setAppName("NetworkWordCount")valssc=newStreamingContext(conf,Seconds(1)) // 建立監聽9999埠的流 vallines=ssc.socketTextStream("localhost",9999) // 將行拆分成單詞 valwords=lines.flatMap(_.split(" ")) // 統計詞頻 valpairs=words.map(word=>(word,1))valwordCounts=pairs.reduceByKey(_+_) // 列印統計結果 wordCounts.print // 啟動流,開始計算 ssc.start ssc.awaitTermination
  1. 執行程式
    cd $SPARK_HOME目錄,
    輸入:
    ./bin/run-example streaming.NetworkWordCount llhost 9999

    Spark會啟動一個Spark Streaming的WordCount範例程式,在9999埠監聽,並進行詞頻統計。然後,通過另外一個指令碼,用curl呼叫哈工大語言云進行分詞,並通過linux命令nc將結果寫入埠9999的socket:
  2. 總結
    因為其中頻度最高的詞彙就是“**”。當然,真正應用中需要結合權重演算法,將一些常用詞如“的”,“然後”,“因此”之類的詞彙排除。哈工大語言云服務和SparkStreaming構建了一個簡單的實時中文詞頻統計框架,下一步可以考慮結合爬蟲獲取實時新聞,然後通過上述框架進行中文分詞和詞頻統計,並判斷新聞的熱點關鍵字。也可以構建基於關鍵字的權重向量,再呼叫聚類模型對新聞進行實時主題分類。可以使用Nutch這個高大上的東西,使用deploy模式將爬取的內容儲存在HDFS中。
  3. Nutch

    這裡寫圖片描述
    Nutch搭建其實很簡單,可以選用2.x版本,可以用deploy模式或者local模式都是可以的,當然最好是用deploy模式,執行nutch指令碼,注意你可以使用索引,加上solr,當爬取內容需要做搜尋管理時,索引是必須的。

  4. 下步想法
    可以使用spring mvc解決平臺顯示,後臺提供分詞統計的結果。