当前位置:   article > 正文

和hanlp_HanLP分词器整合CVM计数矢量器,实现分组TopN

hanlp 日志

一.HanLP开源框架

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)  }}

三.执行结果

9904e08c61e8b2ea01bf4ae790439187.png

四.CountVertorizer计数矢量器

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)  }}

六.执行结果

默认词汇表:

0de5b3ad3951a0a25bcfab6b4e8cc269.png

自定义词汇表:

41d2d800eae87c0c1cc5c0f085c78138.png

七.代码整合

/**  * 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)  }}

八.执行结果

c6ba3e047d2d497d3634ff688f2c0c62.png

九.应用场景【词云】

a9dec7535eb39c55a69ba80c113ec8cc.png
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/463990
推荐阅读
相关标签
  

闽ICP备14008679号