spark CountVectorizer+IDF提取中文关键词(scala)

2024-08-28 20:18

本文主要是介绍spark CountVectorizer+IDF提取中文关键词(scala),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在提取关键词中,TF-IDF是比较常用的算法,spark mlib中也提供了TF以及IDF的方法,但是由于spark提供的TF算法是不可逆的,即无法获取TF的结果对应的原句子的文字,所以需要采用 CountVectorizer。提取关键词的过程如下:

1、中文分词以及去掉停用词:

中文分词使用的是ansj:maven如下:

    <!--ansj--><dependency><groupId>org.ansj</groupId><artifactId>ansj_seg</artifactId><version>5.1.3</version></dependency>

分词代码(其中数据有id,content两列,id为文档id,content为文档内容):

        val filter = new StopRecognition();//val stopWords = List("/","·", ";",""",".","%",":","]","[","-");//过滤停用词val stopWords = com.lina.utils.StopWords.getStopWords("E:\\\\scalaworkspace\\\\stopword.txt");stopWords.foreach((a:String)=>filter.insertStopWords(a));val cgFun = udf((a:String)=>{ToAnalysis.parse(a.toString.replaceAll(",","")).recognition(filter).toStringWithOutNature("/").split("/", 0);});val pplDf = sqlResDf.withColumn("content",cgFun(col("content")));

2、CountVectorizer算法输出词频向量(如果只需要向量,不需要对应的词,也可以使用TF算法):

        val cvModel: CountVectorizerModel = new CountVectorizer().setInputCol("content").setOutputCol("feature").setVocabSize(10000) //向量长度.setMinDF(2) //词汇出现次数必须大于等于2.fit(pplDf)val cvDf = cvModel.transform(pplDf);

3、使用IDF算法输出逆词频向量:

        val idf = new IDF().setInputCol("feature").setOutputCol("features");val idfModel = idf.fit(cvDf);val idfDf = idfModel.transform(cvDf).drop("content").drop("feature")idfDf.show(false);

4、通过结果向量解析出关键词,注意cvModel.vocabulary中存储有向量索引与原句子的词的对应关系:

        val voc= cvModel.vocabulary;val getKeyWordsFun = udf((fea:Vector)=>{var arrW = ArrayBuffer[String]();var arrV = ArrayBuffer[Double]();fea.foreachActive((index:Int,value:Double)=>{arrW += voc(index);arrV += value;});(arrW zip arrV).toList.sortBy(-_._2).take(25).toMap.map(_._1).toArray;});val keyWordsDf = idfDf.withColumn("keywords",getKeyWordsFun(col("features"))).drop("features");

 

这篇关于spark CountVectorizer+IDF提取中文关键词(scala)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1115774

相关文章

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

vscode中文乱码问题,注释,终端,调试乱码一劳永逸版

忘记咋回事突然出现了乱码问题,很多方法都试了,注释乱码解决了,终端又乱码,调试窗口也乱码,最后经过本人不懈努力,终于全部解决了,现在分享给大家我的方法。 乱码的原因是各个地方用的编码格式不统一,所以把他们设成统一的utf8. 1.电脑的编码格式 开始-设置-时间和语言-语言和区域 管理语言设置-更改系统区域设置-勾选Bata版:使用utf8-确定-然后按指示重启 2.vscode

Spark MLlib模型训练—聚类算法 PIC(Power Iteration Clustering)

Spark MLlib模型训练—聚类算法 PIC(Power Iteration Clustering) Power Iteration Clustering (PIC) 是一种基于图的聚类算法,用于在大规模数据集上进行高效的社区检测。PIC 算法的核心思想是通过迭代图的幂运算来发现数据中的潜在簇。该算法适用于处理大规模图数据,特别是在社交网络分析、推荐系统和生物信息学等领域具有广泛应用。Spa

解决Office Word不能切换中文输入

我们在使用WORD的时可能会经常碰到WORD中无法输入中文的情况。因为,虽然我们安装了搜狗输入法,但是到我们在WORD中使用搜狗的输入法的切换中英文的按键的时候会发现根本没有效果,无法将输入法切换成中文的。下面我就介绍一下如何在WORD中把搜狗输入法切换到中文。

ROS - C++实现RosBag包回放/提取

文章目录 1. 回放原理2. 回放/提取 多个话题3. 回放/提取数据包,并实时发布 1. 回放原理 #include <ros/ros.h>#include <rosbag/bag.h>#include <std_msgs/String.h>int main(int argc, char** argv){// 初始化ROS节点ros::init(argc, argv,

sqlite不支持中文排序,采用java排序

方式一 不支持含有重复字段进行排序 /*** sqlite不支持中文排序,改用java排序* 根据指定的对象属性字段,排序对象集合,顺序* @param list* @param field* @return*/public static List sortListByField(List<?> list,String field){List temp = new ArrayList(

zblog自定义关键词和描述,zblog做seo优化必备插件

zblog自定义关键词和描述,zblog做seo优化必备插件     首先说下用到的一款插件:CustomMeta自定义数据字段 ,我们这里用到的版本是1.1,1.1+版增加了列表页标签支持!     插件介绍:文章,分类等添加自定义数据字段。1.1+版适用于 Z-Blog 2.0 B2以上版本。     在zblog2.0beta1里面,这个插件是集成到了程序里面,beta2里面默认没有了

彻底解决win10系统Tomcat10控制台输出中文乱码

彻底解决Tomcat10控制台输出中文乱码 首先乱码问题的原因通俗的讲就是读的编码格式和写的解码格式不一致,比如最常见的两种中文编码UTF-8和GBK,UTF-8一个汉字占三个字节,GBK一个汉字占两个字节,所以当编码与解码格式不一致时,输出端当然无法识别这是啥,所以只能以乱码代替。 值得一提的是GBK不是国家标准编码,常用的国标有两,一个是GB2312,一个是GB18030 GB1

HalconDotNet中的图像特征与提取详解

文章目录 简介一、边缘特征提取二、角点特征提取三、区域特征提取四、纹理特征提取五、形状特征提取 简介   图像特征提取是图像处理中的一个重要步骤,用于从图像中提取有意义的特征,以便进行进一步的分析和处理。HalconDotNet提供了多种图像特征提取方法,每种方法都有其特定的应用场景和优缺点。 一、边缘特征提取   边缘特征提取是图像处理中最基本的特征提取方法之一,通过检

如何根据相同分隔符提取间隔数据?

最近遇到很多提问怎么提取字符的,而这些问题都有一个相同的特征,就是要提取的内容与内容之间,都有着相同的分隔符。当然,这种问题直接用“数据” →  “分列”功能就可以一步到位实现的,但有人喜欢折腾,而更多的人又非得指定函数公式的方法,或者更多的是要保持数据的同步性。   下面,我们就来讲讲用函数公式应该怎么实现这个提取,首先来个数据和要求,如下图,将 - 号间隔的内容依次提取到右边单元格内: