乾貨:基於Spark Mllib的SparkNLP庫。

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

引言php

這是來自John Snow Labs工程團隊的社區博客和工做,解釋了他們對開源Apache Spark天然語言處理(NLP)庫的貢獻。python

Apache Spark是一個通用的集羣計算框架,它支持分佈式SQL,流式處理,圖處理和機器學習。如今,Spark生態系統還有一個Spark Natural Language Processing庫。shell

John Snow Labs NLP庫是在Scala編寫的Apache 2.0以上,不依賴於其餘NLP或ML庫。它本地擴展了Spark ML管道API。該框架提供了註釋器的概念,並帶出瞭如下內容:apache

  • 標記生成器安全

  •  規範化框架

  • 詞幹提取運維

  •  Lemmatizer機器學習

  • 實體提取器分佈式

  • 日期提取器ide

  • Part of Speech Tagger

  • 命名實體識別

  • 句子邊界檢測

  • 情感分析

  • 拼寫檢查器

另外,因爲與Spark ML的緊密集成,在構建NLP管道時,您能夠直接使用Spark的更多功能。這包括詞語嵌入,主題建模,停用詞移除,各類特徵工程功能(tf-idf,n-gram,類似性度量等)以及在機器學習工做流中使用NLP註釋做爲特徵。若是您不熟悉這些術語,那麼理解NLP任務的指南是一個好的開始。

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

Spark ML提供了一套機器學習應用程序,它的邏輯由兩個主要組件組成:估計器(Estimators)和 變換器(Transformers)。首先,有一個稱爲fit()的方法,將一段數據保存並傳遞給這樣的應用程序,Transformer(通常是擬合過程的結果)將更改應用於目標數據集。這些組件已嵌入到適用於Spark NLP。 管道是容許單個工做流程中包含多個估計器和變換器的機制,容許沿機器學習任務進行多個連接轉換。

註釋(Annotation)

註釋是Spark-NLP操做結果的基本形式。它的結構是由:

  • annotatorType: 哪一個註釋器生成了這個註釋

  • begin: 匹配的內容相對於原始文本的開始。

  • end: 匹配的內容相對於原始文本的結尾

  • metadata: 匹配結果的內容和附加信息

該對象在轉換處理結束後由註釋器自動生成。不須要手動參與。但爲了有效地使用它,必須按照順序理解。

註解器(Annotators)

註解器是SparkNLP中NLP功能的先鋒。有兩種形式的註釋器:

  • 註解器方法:表明Spark ML Estimator並須要一個訓練stage。他們有一個稱爲fit(data)的函數,它根據一些數據來訓練一個模型。他們生產第二種類型的註釋器,它是一個註釋器模型或轉換器(transformer)。

  • Annotator模型:它們是spark模型或轉換器(transformer),意味着它們具備一個transform(data)函數,它接受一個數據集並添加一個帶有這個標註結果的列。全部轉換器(transformer)都是附加的,這意味着它們附加到當前數據,決不會替換或刪除之前的信息。

這兩種形式的註釋器均可以包含在Pipeline中,而且會自動按照提供的順序遍歷全部階段並相應地轉換數據。在fit()階段以後,Pipeline變成了PipelineModel。不管是以前仍是以後,能夠隨時保存到磁盤並從新從磁盤加載。

公共函數

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 加載數據並測試,

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

咱們這裏是先把數據賦值爲名爲data的變量

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

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

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註釋類型,這意味着它與DocumentAssembler或SentenceDetector輸出一塊兒工做,在這裏,咱們使用句子輸出。

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

 

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

也能夠按照spark的輸出文件的格式保存結果,好比:

pipeline.fit(data).transform(data).toJSON.write.text("file:///opt/output")

7 輸出爲

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

 

 

 

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

關於Spark高級玩法

kafka,hbase,spark,Flink等入門到深刻源碼,spark機器學習,大數據安全,大數據運維,看高質量文章。

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

更多文章,敬請期待

相關文章
相關標籤/搜索