- 背景
近日项目要求基于爬取的影视评论信息,抽取影视的关键字信息。考虑到影视评论数据量较大,因此采用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
文章来源于网络