日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長(zhǎng)提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線(xiàn)咨詢(xún)客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

基于Bert和通用句子編碼的Spark-NLP文本分類(lèi)

 

自然語(yǔ)言處理(NLP)是許多數(shù)據(jù)科學(xué)系統(tǒng)中必須理解或推理文本的關(guān)鍵組成部分。常見(jiàn)的用例包括文本分類(lèi)、問(wèn)答、釋義或總結(jié)、情感分析、自然語(yǔ)言BI、語(yǔ)言建模和消歧。

NLP在越來(lái)越多的人工智能應(yīng)用中是越來(lái)越重要。如果你正在構(gòu)建聊天機(jī)器人、搜索專(zhuān)利數(shù)據(jù)庫(kù)、將患者與臨床試驗(yàn)相匹配、對(duì)客戶(hù)服務(wù)或銷(xiāo)售電話(huà)進(jìn)行分級(jí)、從財(cái)務(wù)報(bào)告中提取摘要,你必須從文本中提取準(zhǔn)確的信息。

文本分類(lèi)是現(xiàn)代自然語(yǔ)言處理的主要任務(wù)之一,它是為句子或文檔指定一個(gè)合適的類(lèi)別的任務(wù)。類(lèi)別取決于所選的數(shù)據(jù)集,并且可以從主題開(kāi)始。

每一個(gè)文本分類(lèi)問(wèn)題都遵循相似的步驟,并用不同的算法來(lái)解決。更不用說(shuō)經(jīng)典和流行的機(jī)器學(xué)習(xí)分類(lèi)器,如隨機(jī)森林或Logistic回歸,有150多個(gè)深度學(xué)習(xí)框架提出了各種文本分類(lèi)問(wèn)題。

文本分類(lèi)問(wèn)題中使用了幾個(gè)基準(zhǔn)數(shù)據(jù)集,可以在nlpprogress.com上跟蹤最新的基準(zhǔn)。以下是關(guān)于這些數(shù)據(jù)集的基本統(tǒng)計(jì)數(shù)據(jù)。

基于Bert和通用句子編碼的Spark-NLP文本分類(lèi)

 

簡(jiǎn)單的文本分類(lèi)應(yīng)用程序通常遵循以下步驟:

  • 文本預(yù)處理和清理
  • 特征工程(手動(dòng)從文本創(chuàng)建特征)
  • 特征向量化(TfIDF、頻數(shù)、編碼)或嵌入(word2vec、doc2vec、Bert、Elmo、句子嵌入等)
  • 用ML和DL算法訓(xùn)練模型。

Spark-NLP中的文本分類(lèi)

在本文中,我們將使用通用句子嵌入(Universal Sentence Embeddings)在Spark NLP中建立一個(gè)文本分類(lèi)模型。然后我們將與其他ML和DL方法以及文本向量化方法進(jìn)行比較。

Spark NLP中有幾個(gè)文本分類(lèi)選項(xiàng):

  • Spark-NLP中的文本預(yù)處理及基于Spark-ML的ML算法
  • Spark-NLP和ML算法中的文本預(yù)處理和單詞嵌入(Glove,Bert,Elmo)
  • Spark-NLP和ML算法中的文本預(yù)處理和句子嵌入(Universal Sentence Encoders)
  • Spark-NLP中的文本預(yù)處理和ClassifierDL模塊(基于TensorFlow)

正如我們?cè)陉P(guān)于Spark NLP的重要文章中所深入討論的,在ClassifierDL之前的所有這些文本處理步驟都可以在指定的管道序列中實(shí)現(xiàn),并且每個(gè)階段都是一個(gè)轉(zhuǎn)換器或估計(jì)器。這些階段按順序運(yùn)行,輸入數(shù)據(jù)幀在通過(guò)每個(gè)階段時(shí)進(jìn)行轉(zhuǎn)換。也就是說(shuō),數(shù)據(jù)按順序通過(guò)各個(gè)管道。每個(gè)階段的transform()方法更新數(shù)據(jù)集并將其傳遞到下一個(gè)階段。借助于管道,我們可以確保訓(xùn)練和測(cè)試數(shù)據(jù)經(jīng)過(guò)相同的特征處理步驟。

基于Bert和通用句子編碼的Spark-NLP文本分類(lèi)

 

Universal Sentence Encoders

在自然語(yǔ)言處理(NLP)中,在建立任何深度學(xué)習(xí)模型之前,文本嵌入起著重要的作用。文本嵌入將文本(單詞或句子)轉(zhuǎn)換為向量。

基本上,文本嵌入方法在固定長(zhǎng)度的向量中對(duì)單詞和句子進(jìn)行編碼,以極大地改進(jìn)文本數(shù)據(jù)的處理。這個(gè)想法很簡(jiǎn)單:出現(xiàn)在相同上下文中的單詞往往有相似的含義。

像Word2vec和Glove這樣的技術(shù)是通過(guò)將一個(gè)單詞轉(zhuǎn)換成向量來(lái)實(shí)現(xiàn)的。因此,對(duì)應(yīng)的向量“貓”比“鷹”更接近“狗”。但是,當(dāng)嵌入一個(gè)句子時(shí),整個(gè)句子的上下文需要被捕獲到這個(gè)向量中。這就是“Universal Sentence Encoders”的功能了。

Universal Sentence Encoders將文本編碼成高維向量,可用于文本分類(lèi)、語(yǔ)義相似性、聚類(lèi)和其他自然語(yǔ)言任務(wù)。在Tensorflow hub中可以公開(kāi)使用預(yù)訓(xùn)練的Universal Sentence Encoders。它有兩種變體,一種是用Transformer編碼器訓(xùn)練的,另一種是用深度平均網(wǎng)絡(luò)(DAN)訓(xùn)練的。

Spark NLP使用Tensorflow hub版本,該版本以一種在Spark環(huán)境中運(yùn)行的方式包裝。也就是說(shuō),你只需在Spark NLP中插入并播放此嵌入,然后以分布式方式訓(xùn)練模型。

為句子生成嵌入,無(wú)需進(jìn)一步計(jì)算,因?yàn)槲覀儾⒉皇瞧骄渥又忻總€(gè)單詞的單詞嵌入來(lái)獲得句子嵌入。

Spark-NLP中ClassifierDL和USE在文本分類(lèi)的應(yīng)用

在本文中,我們將使用AGNews數(shù)據(jù)集(文本分類(lèi)任務(wù)中的基準(zhǔn)數(shù)據(jù)集之一)在Spark NLP中使用USE和ClassifierDL構(gòu)建文本分類(lèi)器,后者是Spark NLP 2.4.4版中添加的最新模塊。

ClassifierDL是Spark NLP中第一個(gè)多類(lèi)文本分類(lèi)器,它使用各種文本嵌入作為文本分類(lèi)的輸入。ClassifierDLAnnotator使用了一個(gè)在TensorFlow內(nèi)部構(gòu)建的深度學(xué)習(xí)模型(DNN),它最多支持50個(gè)類(lèi)。

基于Bert和通用句子編碼的Spark-NLP文本分類(lèi)

 

也就是說(shuō),你可以用這個(gè)classifirdl在Spark NLP中用Bert、Elmo、Glove和Universal Sentence Encoders構(gòu)建一個(gè)文本分類(lèi)器。

我們開(kāi)始寫(xiě)代碼吧!

聲明加載必要的包并啟動(dòng)一個(gè)Spark會(huì)話(huà)。

import sparknlp
spark = sparknlp.start() 
# sparknlp.start(gpu=True) >> 在GPU上訓(xùn)練
from sparknlp.base import *
from sparknlp.annotator import *
from pyspark.ml import Pipeline
import pandas as pd
print("Spark NLP version", sparknlp.version())
print("Apache Spark version:", spark.version)
>> Spark NLP version 2.4.5
>> Apache Spark version: 2.4.4

然后我們可以從Github repo下載AGNews數(shù)據(jù)集(https://github.com/JohnSnowLabs/spark-nlp-workshop/tree/master/tutorials/Certification_Trainings/Public)。

! wget https://raw.githubusercontent.com/JohnSnowLabs/spark-nlp-workshop/master/tutorials/Certification_Trainings/Public/data/news_category_train.csv
! wget https://raw.githubusercontent.com/JohnSnowLabs/spark-nlp-workshop/master/tutorials/Certification_Trainings/Public/data/news_category_test.csv
trainDataset = spark.read 
      .option("header", True) 
      .csv("news_category_train.csv")
trainDataset.show(10, truncate=50)
>> 
+--------+--------------------------------------------------+
|category|                                       description|
+--------+--------------------------------------------------+
|Business| Short sellers, Wall Street's dwindling band of...|
|Business| Private investment firm Carlyle Group, which h...|
|Business| Soaring crude prices plus worries about the ec...|
|Business| Authorities have halted oil export flows from ...|
|Business| Tearaway world oil prices, toppling records an...|
|Business| Stocks ended slightly higher on Friday but sta...|
|Business| Assets of the nation's retail money market mut...|
|Business| Retail sales bounced back a bit in July, and n...|
|Business|" After earning a PH.D. in Sociology, Danny Baz...|
|Business| Short sellers, Wall Street's dwindling  band o...|
+--------+--------------------------------------------------+
only showing top 10 rows

AGNews數(shù)據(jù)集有4個(gè)類(lèi):World、Sci/Tech、Sports、Business

from pyspark.sql.functions import col
trainDataset.groupBy("category") 
    .count() 
    .orderBy(col("count").desc()) 
    .show()
>>
+--------+-----+
|category|count|
+--------+-----+
|   World|30000|
|Sci/Tech|30000|
|  Sports|30000|
|Business|30000|
+--------+-----+
testDataset = spark.read 
      .option("header", True) 
      .csv("news_category_test.csv")
testDataset.groupBy("category") 
    .count() 
    .orderBy(col("count").desc()) 
    .show()
>>
+--------+-----+
|category|count|
+--------+-----+
|Sci/Tech| 1900|
|  Sports| 1900|
|   World| 1900|
|Business| 1900|
+--------+-----+

現(xiàn)在,我們可以將這個(gè)數(shù)據(jù)提供給Spark NLP DocumentAssembler,它是任何Spark datagram的Spark NLP的入口點(diǎn)。

# 實(shí)際內(nèi)容在description列
document = DocumentAssembler()
    .setInputCol("description")
    .setOutputCol("document")

#我們可以下載預(yù)先訓(xùn)練好的嵌入
use = UniversalSentenceEncoder.pretrained()
 .setInputCols(["document"])
 .setOutputCol("sentence_embeddings")
# classes/labels/categories 在category列
classsifierdl = ClassifierDLApproach()
  .setInputCols(["sentence_embeddings"])
  .setOutputCol("class")
  .setLabelColumn("category")
  .setMaxEpochs(5)
  .setEnableOutputLogs(True)
use_clf_pipeline = Pipeline(
    stages = [
        document,
        use,
        classsifierdl
    ])

以上,我們獲取數(shù)據(jù)集,輸入,然后從使用中獲取句子嵌入,然后在ClassifierDL中進(jìn)行訓(xùn)練

現(xiàn)在我們開(kāi)始訓(xùn)練。我們將使用ClassiferDL中的.setMaxEpochs()訓(xùn)練5個(gè)epoch。在Colab環(huán)境下,這大約需要10分鐘才能完成。

use_pipelineModel = use_clf_pipeline.fit(trainDataset)

運(yùn)行此命令時(shí),Spark NLP會(huì)將訓(xùn)練日志寫(xiě)入主目錄中的annotator_logs文件夾。下面是得到的日志。

基于Bert和通用句子編碼的Spark-NLP文本分類(lèi)

 

如你所見(jiàn),我們?cè)诓坏?0分鐘的時(shí)間內(nèi)就實(shí)現(xiàn)了90%以上的驗(yàn)證精度,而無(wú)需進(jìn)行文本預(yù)處理,這通常是任何NLP建模中最耗時(shí)、最費(fèi)力的一步。

現(xiàn)在讓我們?cè)谧钤绲臅r(shí)候得到預(yù)測(cè)。我們將使用上面下載的測(cè)試集。

基于Bert和通用句子編碼的Spark-NLP文本分類(lèi)

 

下面是通過(guò)sklearn庫(kù)中的classification_report獲得測(cè)試結(jié)果。

基于Bert和通用句子編碼的Spark-NLP文本分類(lèi)

 

我們達(dá)到了89.3%的測(cè)試集精度!看起來(lái)不錯(cuò)!

基于Bert和globe嵌入的Spark-NLP文本預(yù)處理分類(lèi)

與任何文本分類(lèi)問(wèn)題一樣,有很多有用的文本預(yù)處理技術(shù),包括詞干、詞干分析、拼寫(xiě)檢查和停用詞刪除,而且除了拼寫(xiě)檢查之外,Python中幾乎所有的NLP庫(kù)都有應(yīng)用這些技術(shù)的工具。目前,Spark NLP庫(kù)是唯一一個(gè)具備拼寫(xiě)檢查功能的可用NLP庫(kù)。

讓我們?cè)赟park NLP管道中應(yīng)用這些步驟,然后使用glove嵌入來(lái)訓(xùn)練文本分類(lèi)器。我們將首先應(yīng)用幾個(gè)文本預(yù)處理步驟(僅通過(guò)保留字母順序進(jìn)行標(biāo)準(zhǔn)化,刪除停用詞字和詞干化),然后獲取每個(gè)標(biāo)記的單詞嵌入(標(biāo)記的詞干),然后平均每個(gè)句子中的單詞嵌入以獲得每行的句子嵌入。

基于Bert和通用句子編碼的Spark-NLP文本分類(lèi)

 

關(guān)于Spark NLP中的所有這些文本預(yù)處理工具以及更多內(nèi)容,你可以在這個(gè)Colab筆記本中找到詳細(xì)的說(shuō)明和代碼示例(https://github.com/JohnSnowLabs/spark-nlp-workshop/blob/master/tutorials/Certification_Trainings/Public/2.Text_Preprocessing_with_SparkNLP_Annotators_Transformers.ipynb)。

那我們就可以訓(xùn)練了。

clf_pipelineModel = clf_pipeline.fit(trainDataset)

得到測(cè)試結(jié)果。

基于Bert和通用句子編碼的Spark-NLP文本分類(lèi)

 

現(xiàn)在我們有88%的測(cè)試集精度!即使在所有這些文本清理步驟之后,我們?nèi)匀粺o(wú)法擊敗Universal Sentence Embeddings+ClassifierDL,這主要是因?yàn)閁SE相對(duì)于數(shù)據(jù)清理后的版本,它在原始文本上執(zhí)行得更好。

為了訓(xùn)練與BERT相同的分類(lèi)器,我們可以在上面構(gòu)建的同一管道中用BERT_embedding替換glove_embeddings。

word_embeddings = BertEmbeddings
    .pretrained('bert_base_cased', 'en') 
    .setInputCols(["document",'lemma'])
    .setOutputCol("embeddings")
    .setPoolingLayer(-2) # default 0

我們也可以使用Elmo嵌入。

word_embeddings = ElmoEmbeddings
      .pretrained('elmo', 'en')
      .setInputCols(["document",'lemma'])
      .setOutputCol("embeddings")

使用LightPipeline進(jìn)行快速推理

正如我們?cè)谇懊娴囊黄恼轮猩钊胗懻摰模琇ightPipelines是Spark NLP特有的管道,相當(dāng)于Spark ML管道,但其目的是處理少量的數(shù)據(jù)。它們?cè)谔幚硇?shù)據(jù)集、調(diào)試結(jié)果或從服務(wù)一次性請(qǐng)求的API運(yùn)行訓(xùn)練或預(yù)測(cè)時(shí)非常有用。

Spark NLP LightPipelines是Spark ML管道轉(zhuǎn)換成在單獨(dú)的機(jī)器上,變成多線(xiàn)程的任務(wù),對(duì)于較小的數(shù)據(jù)量(較小的是相對(duì)的,但5萬(wàn)個(gè)句子大致最大值)來(lái)說(shuō),速度快了10倍以上。要使用它們,我們只需插入一個(gè)經(jīng)過(guò)訓(xùn)練的管道,我們甚至不需要將輸入文本轉(zhuǎn)換為DataFrame,就可以將其輸入到一個(gè)管道中,該管道首先接受DataFrame作為輸入。當(dāng)需要從經(jīng)過(guò)訓(xùn)練的ML模型中獲得幾行文本的預(yù)測(cè)時(shí),這個(gè)功能將非常有用。

LightPipelines很容易創(chuàng)建,而且可以避免處理Spark數(shù)據(jù)集。它們的速度也非常快,當(dāng)只在驅(qū)動(dòng)節(jié)點(diǎn)上工作時(shí),它們執(zhí)行并行計(jì)算。讓我們看看它是如何適用于我們上面描述的案例的:

light_model = LightPipeline(clf_pipelineModel)
text="Euro 2020 and the Copa America have both been moved to the summer of 2021 due to the coronavirus outbreak."
light_model.annotate(text)['class'][0]
>> "Sports"

你還可以將這個(gè)經(jīng)過(guò)訓(xùn)練的模型保存到磁盤(pán)中,然后稍后在另一個(gè)Spark管道中與ClassifierDLModel.load()一起使用。

基于Bert和通用句子編碼的Spark-NLP文本分類(lèi)

 

結(jié)論

本文在Spark-NLP中利用詞嵌入和Universal Sentence Encoders,訓(xùn)練了一個(gè)多類(lèi)文本分類(lèi)模型,在不到10min的訓(xùn)練時(shí)間內(nèi)獲得了較好的模型精度。整個(gè)代碼都可以在這個(gè)Github repo中找到(Colab兼容,https://github.com/JohnSnowLabs/spark-nlp-workshop/blob/master/tutorials/Certification_Trainings/Public/5.Text_Classification_with_ClassifierDL.ipynb)。我們還準(zhǔn)備了另一個(gè)Notebook,幾乎涵蓋了Spark NLP和Spark ML中所有可能的文本分類(lèi)組合(CV、TfIdf、Glove、Bert、Elmo、USE、LR、RF、ClassifierDL、DocClassifier):https://github.com/JohnSnowLabs/spark-nlp-workshop/blob/master/tutorials/Certification_Trainings/Public/5.1_Text_classification_examples_in_SparkML_SparkNLP.ipynb。

我們還開(kāi)始為公共和企業(yè)(醫(yī)療)版本提供在線(xiàn)Spark NLP訓(xùn)練。這里是所有公共Colab Notebook的鏈接(https://github.com/JohnSnowLabs/spark-nlp-workshop/tree/master/tutorials/Certification_Trainings/Public)

John Snow實(shí)驗(yàn)室將組織虛擬Spark NLP訓(xùn)練,以下是下一次訓(xùn)練的鏈接:

https://events.johnsnowlabs.com/online-training-spark-nlp

以上代碼截圖

基于Bert和通用句子編碼的Spark-NLP文本分類(lèi)

 

分享到:
標(biāo)簽:Spark NLP
用戶(hù)無(wú)頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過(guò)答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫(kù),初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定