数据挖掘:基于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

文章来源于网络

相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页