zoukankan      html  css  js  c++  java
  • 基于Spark Mllib的Spark NLP库

    SparkNLP的官方文档

    1>sbt引入:

    scala为2.11时   libraryDependencies += "com.johnsnowlabs.nlp" %% "spark-nlp" % "1.4.2"
    scala为2.11之上时
    libraryDependencies += "com.johnsnowlabs.nlp" % "spark-nlp_2.11" % "1.4.2"

    2>maven引入: 

    < dependency >
      < groupId > com.johnsnowlabs.nlp </ groupId >
      < artifactId > spark-nlp_2.11 </ artifactId >
      < version > 1.4.2 </ version >
    </ dependency >

    3>直接下载jar包,然后运行:spark-submit --packages JohnSnowLabs:spark-nlp:1.4.2

    或者提交程序时指定它的具体位置:spark-shell --jars spark-nlp.jar 

    一、该库的主要内容:

    • 标记生成器

    •  规范化

    • 词干提取

    •  Lemmatizer

    • 实体提取器

    • 日期提取器

    • Part of Speech Tagger

    • 命名实体识别

    • 句子边界检测

    • 情感分析

    • 拼写检查器

    Spark ML提供了一套机器学习应用程序,它的逻辑由两个主要组件组成:估计器(Estimators)和 变换器(Transformers)。首先,有一个称为fit()的方法,将一段数据保存并传递给这样的应用程序,Transformer(一般是拟合过程的结果)将更改应用于目标数据集。这些组件已嵌入到适用于Spark NLP。 

    1.注释(Annotation)

    注释是Spark-NLP操作结果的基本形式。它的结构是由:

    • annotatorType: 哪个注释器生成了这个注释

    • begin: 匹配的内容相对于原始文本的开始。

    • end: 匹配的内容相对于原始文本的结尾

    • metadata: 匹配结果的内容和附加信息

    该对象在转换处理结束后由注释器自动生成。不需要手动参与。但为了有效地使用它,必须按照顺序理解。

    2.注解器(Annotators)

    注释器有两种形式

    • 注解器方法:代表Spark ML Estimator并需要一个训练stage。他们有一个称为fit(data)的函数,它根据一些数据来训练一个模型。他们生产第二种类型的注释器,它是一个注释器模型或转换器(transformer)。

    • Annotator模型:它们是spark模型或转换器(transformer),意味着它们具有一个transform(data)函数,它接受一个数据集并添加一个带有这个标注结果的列。所有转换器(transformer)都是附加的,这意味着它们附加到当前数据,决不会替换或删除以前的信息。

    这两种形式的注释器都可以包含在Pipeline中,并且会自动按照提供的顺序遍历所有阶段并相应地转换数据。在fit()阶段之后,Pipeline变成了PipelineModel。无论是之前还是之后,可以随时保存到磁盘并重新从磁盘加载。

    3.公共函数

    setInputCols(column_names):获取此注释器所需的注释列名称

    setOutputCol( column_name):定义包含此注释器结果的列的名称。使用此名称作为其他注释器的输入,需要注释这个注释器。

    二、例子分析

    1 注释器类型

    每个注释器都有一个类型。这些共享类型的注释器可以互换使用,这意味着您可以在需要时使用它们中的任何一个。例如,当另一个注释器(如情感分析注释器)需要令牌类型注释器时,可以提供标normalized token或lemma,因为两者都是类型标记。

    2 使用spark读入数据

    我们例子测试采用的是spark-shell的方式,spark-2.1.1版本以上,本文采用的是spark2.1.2,scala版本2.11.8,启动:

    spark-shell --jars /opt/jars/spark-nlp-1.2.3.jar

    3.我们这里是先把数据赋值为名为data的变量

    val data = spark.read.parquet("/opt/datas/*")

    4 DocumentAssembler:获取数据

    为何贯穿NLP处理过程,我们需要将原始数据进行标注。有一个特殊的transformer为我们做这件事情:DocumentAssembler,它会创建第一个类型为Document的注释,该注释会被以后的注解器使用。

    import com.johnsnowlabs.nlp._
    import com.johnsnowlabs.nlp.annotators._
    import org.apache.spark.ml.Pipeline
    
    val documentAssembler = new DocumentAssembler()
       .setInputCol("text")
       .setOutputCol("document")

    5 句子检测及分词

    在这个快速的例子中,我们现在开始在每个文档行中标识句子。SentenceDetectorModel需要一个由DocumentAssembler输出提供的Document注释,它本身是一个Document类型标记。RegexTokenizer需要一个Document注释类型,这意味着它与DocumentAssemblerSentenceDetector输出一起工作,在这里,我们使用句子输出。

    import com.johnsnowlabs.nlp.annotators.sbd.pragmatic.SentenceDetectorModel
    
    val sentenceDetector = new SentenceDetectorModel()
       .setInputCols(Array("document"))
       .setOutputCol("sentence")
    
    val regexTokenizer = new RegexTokenizer()
       .setInputCols(Array("sentence"))
       .setOutputCol("token")

    6 使用管道(pipeline)

    现在我们要把所有这些放在一起并检索结果,我们使用Pipeline来做到这一点。我们还包含另一个特殊的变形器,称为“ Finisher”,以人类语言显示标记

    val finisher = new Finisher()
       .setInputCols("token")
       .setCleanAnnotations(false)
    
    val pipeline = new Pipeline()
       .setStages(Array(
           documentAssembler,
           sentenceDetector,
           regexTokenizer,
           finisher
       ))
    
    pipeline
       .fit(data)
       .transform(data)
       .show()
  • 相关阅读:
    Golang error 的突围
    深度解密Go语言之 scheduler
    深度解密Go语言之channel
    如何打造一份优雅的简历?
    Go 程序是怎样跑起来的
    曹大谈内存重排
    从零开始使用 Webpack 搭建 Vue 开发环境
    纯样式无脚本无图片自定义单/复选框
    从零开始使用 Webpack 搭建 Vue3 开发环境
    JS遍历对象的几种方法
  • 原文地址:https://www.cnblogs.com/feiyumo/p/8603249.html
Copyright © 2011-2022 走看看