赞
踩
HanLP是Hankcs主持并开源的一系列模型和算法组成的工具包,具有功能完善、性能高效、架构清晰、语料时新、可自定义词库等特点,提供词法分析、句法分析、文本分析和情感分析等功能,已被广泛的应用在工业、科研、教育等领域中。
不同于一些简陋的分词类库,HanLP精心优化了内部数据结构和IO接口,做到了毫秒级的冷启动、千万字符每秒的处理速度,而内存最低仅需120MB。无论是移动设备还是大型集群,都能获得良好的体验。同时HanLP提供训练模块,可以在用户的语料上训练模型并替换默认模型,以适应不同的领域。
/** * Created by zhen on 2020/11/20. * Hanlp分词器 */object HanlpWordAnalyse { /** * 设置日志级别 */ Logger.getLogger("org").setLevel(Level.WARN) def main(args: Array[String]) { val spark = SparkSession.builder().appName("HanlpWordAnalyse") .master("local[2]") .getOrCreate() val rdd = spark.createDataFrame(Seq( (1, "我们从一组文档开始,每个文档都由一个单词序列表示。"), (2, "对于每个文档,我们将文档转换为特征向量。") )).rdd.map(v=>{ var res = "" val id = v.getAs[Int](0) val word = v.getAs[String](1) if(v.length>0){ val termList = StandardTokenizer.segment(word) for(i 1){ res += term.word + " " } } } } (id, res.split(" ")) }) .filter(_._2.length > 0) // 过滤空值 val df = spark.createDataFrame(rdd).toDF("id", "words") df.count() df.show(false) }}
CountVectorizer和CountVectorizerModel转换文本文档【需预先分词】为对应的词数集合。当词汇表不可用时,CountVectorizer可以用作Estimator提取词汇表并生成CountVectorizerModel【即根据全部词生成词汇表,所有词有效,默认效果】。该模型在词汇表上生成文档的稀疏表示,可以作为其他算法的输入,例如LDA。
在拟合过程中,CountVectorizer按词频排列,选取前vocabSize个词。可选参数minDF指定一个单词在词汇表中的最小出现次数【如果小于1.0,则为小数】,以此来影响拟合过程。另一个可选的二进制切换参数控制输出向量。如果将其设置为true,则所有非零计数都将设置为1。这对于模拟二进制而不是整数计数的离散概率模型特别有用。
/** * Created by zhen on 2020/11/20. */object CountVectorizerAnalyse { /** * 设置日志级别 */ Logger.getLogger("org").setLevel(Level.WARN) def main(args: Array[String]) { val spark = SparkSession.builder().appName("CountVectorizerAnalyse") .master("local[2]") .getOrCreate() val df = spark.createDataFrame(Seq( (0, Array("A", "B", "C", "D")), (1, Array("A", "B", "C", "D", "A", "D", "A")) )).toDF("id", "words") // 训练CountVectorizer模型 val cvModel: CountVectorizerModel = new CountVectorizer() .setInputCol("words") .setOutputCol("features") .setVocabSize(3) // 最大选取特征数 .setMinDF(2) // 最小出现次数 .fit(df) val cv_result = cvModel.transform(df) cv_result.show(false) // 分析 val cvm = new CountVectorizerModel(Array("A", "B")) // 词汇表,限定仅词汇表中存在的,并遵循其顺序 .setInputCol("words") .setOutputCol("features") val cvm_result = cvm.transform(df) cvm_result.show(false) }}
默认词汇表:
自定义词汇表:
/** * Created by zhen on 2020/11/20. */object GroupTopN { /** * 设置日志级别 */ Logger.getLogger("org").setLevel(Level.WARN) def main(args: Array[String]) { val spark = SparkSession.builder().appName("GroupTopN") .master("local[2]") .getOrCreate() val rdd = spark.createDataFrame(Seq( (1, "我们从一组文档开始,每个文档都由一个单词序列表示。"), (2, "对于每个文档,我们将文档转换为特征向量。") )).rdd.map(v=>{ var res = "" val id = v.getAs[Int](0) val word = v.getAs[String](1) if(v.length>0){ val termList = StandardTokenizer.segment(word) for(i 1){ res += term.word + " " } } } } (id, res.split(" ")) }) .filter(_._2.length > 0) // 过滤空值 val df = spark.createDataFrame(rdd).toDF("id", "words") df.count() df.show(false) // 训练CountVectorizer模型 val cvModel: CountVectorizerModel = new CountVectorizer() .setInputCol("words") .setOutputCol("features") .setVocabSize(3) // 最大选取特征数 .setMinDF(2) // 最小出现次数 .fit(df) val cv_result = cvModel.transform(df) cv_result.show(false) // 分析 val cvm = new CountVectorizerModel(Array("文档", "我们")) // 词汇表,限定仅词汇表中存在的,并遵循其顺序 .setInputCol("words") .setOutputCol("features") val cvm_result = cvm.transform(df) cvm_result.show(false) }}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。