資料探勘:基於Spark+HanLP實現影視評論關鍵詞抽取
- 背景
近日專案要求基於爬取的影視評論資訊,抽取影視的關鍵字資訊。考慮到影視評論資料量較大,因此採用Spark處理框架。關鍵詞提取的處理主要包含分詞+演算法抽取兩部分。目前分詞工具包較為主流的,包括哈工大的LTP以及HanLP,而關鍵詞的抽取演算法較多,包括TF-IDF、TextRank、互資訊等。本次任務主要基於LTP、HanLP、Ac雙陣列進行分詞,採用TextRank、互資訊以及TF-IDF結合的方式進行關鍵詞抽取。
說明:本專案剛開始接觸,因此效果層面需迭代調優。
- 技術選型
(1) 詞典
-
基於HanLP專案提供的詞典資料,具體可參見HanLP的github。
-
考慮到影視的垂直領域特性,引入騰訊的嵌入的漢語詞,參考該地址。
(2) 分詞
-
LTP分詞服務:基於Docker Swarm部署多副本集服務,通過HTTP協議請求,獲取分詞結果(部署方法可百度); 也可以直接在本地載入,放在記憶體中呼叫,效率更高(未嘗試)
-
AC雙陣列:基於AC雙陣列,採用最長匹配串,採用HanLP中的AC雙陣列分詞器
(3) 抽取
-
經典的TF-IDF:基於詞頻統計實現
-
TextRank:借鑑於PageRank演算法,基於HanLP提供的介面
-
互資訊:基於HanLP提供的介面
- 實現程式碼
(1) 程式碼結構
-
程式碼將分詞服務進行函式封裝,基於不同的名稱,執行名稱指定的分詞
-
TextRank、互資訊、LTP、AC雙陣列等提取出分詞或短語,最後均通過TF-IDF進行統計計算
(2) 整體程式碼
- 主體程式碼:細節層面與下載的原始評論資料結構有關,因此無需過多關注,只需關注下主體流程即可
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
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排錯與優化》
- 異常2
a. 異常資訊:java.lang.OutOfMemoryError: Java heap space
b. 解決:參考https://blog.csdn.net/guohecang/article/details/52088117
文章來源於網路