SparkNLP的官方文檔html
1>sbt引入:python
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引入: shell
< 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
apache
或者提交程序時指定它的具體位置:spark-shell --jars spark-nlp.jar
標記生成器機器學習
規範化maven
詞幹提取函數
Lemmatizer學習
實體提取器測試
日期提取器spa
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註釋類型,這意味着它與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()