1. 程式人生 > >資料探勘:基於Spark+HanLP實現影視評論關鍵詞抽取

資料探勘:基於Spark+HanLP實現影視評論關鍵詞抽取

  1. 背景
    近日專案要求基於爬取的影視評論資訊,抽取影視的關鍵字資訊。考慮到影視評論資料量較大,因此採用Spark處理框架。關鍵詞提取的處理主要包含分詞+演算法抽取兩部分。目前分詞工具包較為主流的,包括哈工大的LTP以及HanLP,而關鍵詞的抽取演算法較多,包括TF-IDF、TextRank、互資訊等。本次任務主要基於LTP、HanLP、Ac雙陣列進行分詞,採用TextRank、互資訊以及TF-IDF結合的方式進行關鍵詞抽取。

說明:本專案剛開始接觸,因此效果層面需迭代調優。

  1. 技術選型
    (1) 詞典
  1. 基於HanLP專案提供的詞典資料,具體可參見HanLP的github。

  2. 考慮到影視的垂直領域特性,引入騰訊的嵌入的漢語詞,參考該地址。

(2) 分詞

  1. LTP分詞服務:基於Docker Swarm部署多副本集服務,通過HTTP協議請求,獲取分詞結果(部署方法可百度); 也可以直接在本地載入,放在記憶體中呼叫,效率更高(未嘗試)

  2. AC雙陣列:基於AC雙陣列,採用最長匹配串,採用HanLP中的AC雙陣列分詞器

(3) 抽取

  1. 經典的TF-IDF:基於詞頻統計實現

  2. TextRank:借鑑於PageRank演算法,基於HanLP提供的介面

  3. 互資訊:基於HanLP提供的介面

  1. 實現程式碼
    (1) 程式碼結構
  1. 程式碼將分詞服務進行函式封裝,基於不同的名稱,執行名稱指定的分詞

  2. TextRank、互資訊、LTP、AC雙陣列等提取出分詞或短語,最後均通過TF-IDF進行統計計算

(2) 整體程式碼

  1. 主體程式碼:細節層面與下載的原始評論資料結構有關,因此無需過多關注,只需關注下主體流程即可

View Code
2) 基於HanLP提供的AC雙陣列封裝

View Code
3) HanLP載入HDFS中的自定義詞典

View Code
4. 採坑總結
(1) Spark中實現HanLP自定義詞典的載入

由於引入騰訊的嵌入詞,因此使用HanLP的自定義詞典功能,參考的方法如下:

a. 《基於hanLP的中文分詞詳解-MapReduce實現&自定義詞典檔案》,該方法適用於自定義詞典的數量較少的情況,如果詞典量較大,如騰訊嵌入詞820W+,理論上jar包較為臃腫

b. 《Spark中使用HanLP分詞》,該方法的好處在於無需手工構件詞典的bin檔案,操作簡單

切記:如果想讓自定義詞典生效,需先將data/dictionary/custom中的bin檔案刪除。通過HanLP原始碼得知,如果存在bin檔案,則直接載入該bin檔案,否則會將custom中使用者自定義的詞典重新載入,在指定的環境中(如本地或HDFS)中自動生成bin檔案。

騰訊820W詞典,基於HanLP生成bin檔案的時間大概為30分鐘。

(2) Spark異常

Spark執行過程中的異常資訊:

  1. 異常1

a. 異常資訊:

Job aborted due to stage failure: Total size of serialized results of 3979 tasks (1024.2 MB) is bigger than spark.driver.maxResultSize (1024.0 MB)

b. 解決:通過設定spark.driver.maxResultSize=4G,參考:《Spark排錯與優化》

  1. 異常2

a. 異常資訊:java.lang.OutOfMemoryError: Java heap space

b. 解決:參考https://blog.csdn.net/guohecang/article/details/52088117

文章來源於網路