基於Bert和通用句子編碼的Spark-NLP文本分類

2021-01-12 人工智慧遇見磐創

自然語言處理(NLP)是許多數據科學系統中必須理解或推理文本的關鍵組成部分。常見的用例包括文本分類、問答、釋義或總結、情感分析、自然語言BI、語言建模和消歧。

NLP在越來越多的人工智慧應用中是越來越重要。如果你正在構建聊天機器人、搜索專利資料庫、將患者與臨床試驗相匹配、對客戶服務或銷售電話進行分級、從財務報告中提取摘要,你必須從文本中提取準確的信息。

文本分類是現代自然語言處理的主要任務之一,它是為句子或文檔指定一個合適的類別的任務。類別取決於所選的數據集,並且可以從主題開始。

每一個文本分類問題都遵循相似的步驟,並用不同的算法來解決。更不用說經典和流行的機器學習分類器,如隨機森林或Logistic回歸,有150多個深度學習框架提出了各種文本分類問題。

文本分類問題中使用了幾個基準數據集,可以在nlpprogress.com上跟蹤最新的基準。以下是關於這些數據集的基本統計數據。

簡單的文本分類應用程式通常遵循以下步驟:

文本預處理和清理特徵工程(手動從文本創建特徵)特徵向量化(TfIDF、頻數、編碼)或嵌入(word2vec、doc2vec、Bert、Elmo、句子嵌入等)用ML和DL算法訓練模型。Spark-NLP中的文本分類

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

Spark NLP中有幾個文本分類選項:

Spark-NLP中的文本預處理及基於Spark-ML的ML算法Spark-NLP和ML算法中的文本預處理和單詞嵌入(Glove,Bert,Elmo)Spark-NLP和ML算法中的文本預處理和句子嵌入(Universal Sentence Encoders)Spark-NLP中的文本預處理和ClassifierDL模塊(基於TensorFlow)正如我們在關於Spark NLP的重要文章中所深入討論的,在ClassifierDL之前的所有這些文本處理步驟都可以在指定的管道序列中實現,並且每個階段都是一個轉換器或估計器。這些階段按順序運行,輸入數據幀在通過每個階段時進行轉換。也就是說,數據按順序通過各個管道。每個階段的transform()方法更新數據集並將其傳遞到下一個階段。藉助於管道,我們可以確保訓練和測試數據經過相同的特徵處理步驟。

Universal Sentence Encoders

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

基本上,文本嵌入方法在固定長度的向量中對單詞和句子進行編碼,以極大地改進文本數據的處理。這個想法很簡單:出現在相同上下文中的單詞往往有相似的含義。

像Word2vec和Glove這樣的技術是通過將一個單詞轉換成向量來實現的。因此,對應的向量「貓」比「鷹」更接近「狗」。但是,當嵌入一個句子時,整個句子的上下文需要被捕獲到這個向量中。這就是「Universal Sentence Encoders」的功能了。

Universal Sentence Encoders將文本編碼成高維向量,可用於文本分類、語義相似性、聚類和其他自然語言任務。在Tensorflow hub中可以公開使用預訓練的Universal Sentence Encoders。它有兩種變體,一種是用Transformer編碼器訓練的,另一種是用深度平均網絡(DAN)訓練的。

Spark NLP使用Tensorflow hub版本,該版本以一種在Spark環境中運行的方式包裝。也就是說,你只需在Spark NLP中插入並播放此嵌入,然後以分布式方式訓練模型。

為句子生成嵌入,無需進一步計算,因為我們並不是平均句子中每個單詞的單詞嵌入來獲得句子嵌入。

Spark-NLP中ClassifierDL和USE在文本分類的應用

在本文中,我們將使用AGNews數據集(文本分類任務中的基準數據集之一)在Spark NLP中使用USE和ClassifierDL構建文本分類器,後者是Spark NLP 2.4.4版中添加的最新模塊。

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

也就是說,你可以用這個classifirdl在Spark NLP中用Bert、Elmo、Glove和Universal Sentence Encoders構建一個文本分類器。

我們開始寫代碼吧!

聲明加載必要的包並啟動一個Spark會話。

import sparknlpspark = sparknlp.start() # sparknlp.start(gpu=True) >> 在GPU上訓練from sparknlp.base import *from sparknlp.annotator import *from pyspark.ml import Pipelineimport pandas as pdprint("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數據集(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.csvtrainDataset = 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 rowsAGNews數據集有4個類:World、Sci/Tech、Sports、Business

from pyspark.sql.functions import coltrainDataset.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|+---++現在,我們可以將這個數據提供給Spark NLP DocumentAssembler,它是任何Spark datagram的Spark NLP的入口點。

# 實際內容在description列document = DocumentAssembler()\ .setInputCol("description")\ .setOutputCol("document")#我們可以下載預先訓練好的嵌入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 ])以上,我們獲取數據集,輸入,然後從使用中獲取句子嵌入,然後在ClassifierDL中進行訓練

現在我們開始訓練。我們將使用ClassiferDL中的.setMaxEpochs()訓練5個epoch。在Colab環境下,這大約需要10分鐘才能完成。

use_pipelineModel = use_clf_pipeline.fit(trainDataset)運行此命令時,Spark NLP會將訓練日誌寫入主目錄中的annotator_logs文件夾。下面是得到的日誌。

如你所見,我們在不到10分鐘的時間內就實現了90%以上的驗證精度,而無需進行文本預處理,這通常是任何NLP建模中最耗時、最費力的一步。

現在讓我們在最早的時候得到預測。我們將使用上面下載的測試集。

下面是通過sklearn庫中的classification_report獲得測試結果。

我們達到了89.3%的測試集精度!看起來不錯!

基於Bert和globe嵌入的Spark-NLP文本預處理分類

與任何文本分類問題一樣,有很多有用的文本預處理技術,包括詞幹、詞幹分析、拼寫檢查和停用詞刪除,而且除了拼寫檢查之外,Python中幾乎所有的NLP庫都有應用這些技術的工具。目前,Spark NLP庫是唯一一個具備拼寫檢查功能的可用NLP庫。

讓我們在Spark NLP管道中應用這些步驟,然後使用glove嵌入來訓練文本分類器。我們將首先應用幾個文本預處理步驟(僅通過保留字母順序進行標準化,刪除停用詞字和詞幹化),然後獲取每個標記的單詞嵌入(標記的詞幹),然後平均每個句子中的單詞嵌入以獲得每行的句子嵌入。

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

那我們就可以訓練了。

clf_pipelineModel = clf_pipeline.fit(trainDataset)得到測試結果。

現在我們有88%的測試集精度!即使在所有這些文本清理步驟之後,我們仍然無法擊敗Universal Sentence Embeddings+ClassifierDL,這主要是因為USE相對於數據清理後的版本,它在原始文本上執行得更好。

為了訓練與BERT相同的分類器,我們可以在上面構建的同一管道中用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進行快速推理

正如我們在前面的一篇文章中深入討論的,LightPipelines是Spark NLP特有的管道,相當於Spark ML管道,但其目的是處理少量的數據。它們在處理小數據集、調試結果或從服務一次性請求的API運行訓練或預測時非常有用。

Spark NLP LightPipelines是Spark ML管道轉換成在單獨的機器上,變成多線程的任務,對於較小的數據量(較小的是相對的,但5萬個句子大致最大值)來說,速度快了10倍以上。要使用它們,我們只需插入一個經過訓練的管道,我們甚至不需要將輸入文本轉換為DataFrame,就可以將其輸入到一個管道中,該管道首先接受DataFrame作為輸入。當需要從經過訓練的ML模型中獲得幾行文本的預測時,這個功能將非常有用。

LightPipelines很容易創建,而且可以避免處理Spark數據集。它們的速度也非常快,當只在驅動節點上工作時,它們執行並行計算。讓我們看看它是如何適用於我們上面描述的案例的:

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"你還可以將這個經過訓練的模型保存到磁碟中,然後稍後在另一個Spark管道中與ClassifierDLModel.load()一起使用。

結論

本文在Spark-NLP中利用詞嵌入和Universal Sentence Encoders,訓練了一個多類文本分類模型,在不到10min的訓練時間內獲得了較好的模型精度。整個代碼都可以在這個Github repo中找到(Colab兼容,https://github.com/JohnSnowLabs/spark-nlp-workshop/blob/master/tutorials/Certification_Trainings/Public/5.Text_Classification_with_ClassifierDL.ipynb)。我們還準備了另一個Notebook,幾乎涵蓋了Spark NLP和Spark ML中所有可能的文本分類組合(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。

我們還開始為公共和企業(醫療)版本提供在線Spark NLP訓練。這裡是所有公共Colab Notebook的連結(https://github.com/JohnSnowLabs/spark-nlp-workshop/tree/master/tutorials/Certification_Trainings/Public)

John Snow實驗室將組織虛擬Spark NLP訓練,以下是下一次訓練的連結:

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

以上代碼截圖

相關焦點

  • NLP之文本分類:「Tf-Idf、Word2Vec和BERT」三種模型比較
    ,我將使用NLP和Python來解釋3種不同的文本多分類策略:老式的詞袋法(tf-ldf),著名的詞嵌入法(Word2Vec)和最先進的語言模型(BERT)。NLP(自然語言處理)是人工智慧的一個領域,它研究計算機和人類語言之間的交互作用,特別是如何通過計算機編程來處理和分析大量的自然語言數據。NLP常用於文本數據的分類。
  • 搞定NLP領域的「變形金剛」!教你用BERT進行多標籤文本分類
    預訓練模型在研究領域的應用已經令許多NLP項目的最新成果產生了巨大的飛躍,例如文本分類,自然語言推理和問答。ELMo,ULMFiT 和OpenAI Transformer是其中幾個關鍵的裡程碑。所有這些算法都允許我們在大型資料庫(例如所有維基百科文章)上預先訓練無監督語言模型,然後在下遊任務上對這些預先訓練的模型進行微調。
  • 前沿|通用句子語義編碼器,谷歌在語義文本相似性上的探索
    這項工作中,我們希望通過給回答分類的方式學習語義相似性:給定一個對話輸入,我們希望從一批隨機選擇的回覆中分類得到正確的答案。但是,任務的最終目標是學習一個可以返回表示各種自然語言關係(包括相似性和相關性)的編碼模型。我們提出了另一預測任務(此處是指 SNLI 蘊含數據集),並通過共享的編碼層同時推進兩項任務。
  • 專欄| NLP概述和文本自動分類算法詳解
    序列到類別的例子包括文本分類和情感分析。類別(對象)到序列的例子包括文本生成和形象描述。 2.文檔建模 要使計算機能夠高效地處理真實文本,就必須找到一種理想的形式化表示方法,這個過程就是文檔建模。文檔建模一方面要能夠真實地反映文檔的內容,另一方面又要對不同文檔具有區分能力。文檔建模比較通用的方法包括布爾模型、向量空間模型(VSM)和概率模型。其中最為廣泛使用的是向量空間模型。
  • PTMs|2020最新NLP預訓練模型綜述
    但是相反,nlp領域的優勢在於,存在大量的無監督數據集,如果能夠充分利用這類數據進行訓練,那麼勢必能夠提升模型的能力以及在下遊任務中的表現。nlp中的預訓練模型就是這樣一類能夠在大規模語料上進行無監督訓練,學習得到通用的語言表徵,有助於解決下遊任務的nlp模型。「那麼什麼是好的語言表徵呢」?
  • 大神教程乾貨:使用BERT的多類別情感分析!(附代碼)
    使用BERT輕鬆快速地實現針對Yelp評論的多類別文本情感分析。在本文中,我們將使用BERT在Yelp評論上開發多類文本分類。BERT概述BERT是用於通用「語言理解」 的深度雙向表示模型,可從左至右和從右至左學習信息。
  • 詞向量詳解:從word2vec、glove、ELMo到BERT
    各種詞向量的特點:One-hot:維度災難 and 語義鴻溝矩陣分解(LSA):利用全局語料特徵,但SVD求解計算複雜度大基於NNLM/RNNLM的詞向量:詞向量為副產物,存在效率不高等問題word2vec、fastText:優化效率高,但是基於局部語料glove:基於全局預料,結合了LSA和word2vec的優點elmo、GPT、bert:動態特徵從one-hot到word2vec
  • 文本嵌入的經典模型與最新進展
    雷鋒網 AI 科技評論編譯如下。詞嵌入和句子嵌入已成為所有基於深度學習的自然語言處理(NLP)系統的重要組成部分。它們在定長的密集向量中編碼單詞和句子,以大幅度提高文本數據的處理性能。(http://nlp.fast.ai/classification/2018/05/15/introducting-ulmfit.html)雖然句子的無監督表示學習已經成為很長一段時間的規範,但最近幾個月,隨著 2017年末、 2018 年初提出了一些非常有趣的提議,無監督學習已經有轉向有監督和多任務學習方案的趨勢。
  • NLP 新手必看!這是一份覆蓋全面的基於 PyTorch 和 keras 的 NLP...
    最近,小編在 github 上發現了一份基於 PyTorch 和 keras 的 NLP 學習教程。這份教程內容相當豐富,內容涵蓋神經網絡機器翻譯、問答匹配、電影評價分類、新聞分類等多個領域。項目的 GitHub 地址為:https://github.com/lyeoni/nlp-tutorial。
  • 使用BERT和TensorFlow構建搜尋引擎
    這些特徵還可以用於基於實例的學習,其依賴於計算查詢與訓練樣本的相似性。為了證明這一點,將使用BERT特徵提取為文本構建最近鄰搜尋引擎。 對於每個文本樣本,BERT編碼層輸出一個形狀的張量[ sequence_len,encoder_dim ],每個標記有一個向量。如果要獲得固定的表示,需要應用某種池。 POOL_STRAT參數定義應用於編碼層編號POOL_LAYER的池策略。默認值' REDUCE_MEAN '平均序列中所有標記的向量。
  • NLP中的預處理:使用python進行文本歸一化
    儘管有許多有趣的通用工具箱和預製管道,但更精確的系統是針對上下文量身定製的系統。因此,不應將本文歸一化的步驟列表作為硬性規則,而應將其作為對某些文章進行文本歸一化的準則。 還必須指出的是,在極少數情況下,您可能不想歸一化輸入-文本中其中更多變化和錯誤很重要時(例如,考慮測試校正算法)。
  • 谷歌最強NLP模型BERT,為何炫酷又強大?騰訊程式設計師給你從頭講起
    query-title 分檔任務要求針對 query 和 title 按文本相關性進行 5 個檔位的分類(1~5 檔),各檔位從需求滿足及語義匹配這兩方面對 query-doc 的相關度進行衡量,檔位越大表示相關性越高,如 1 檔表示文本和語義完全不相關,而 5 檔表示文本和語義高度相關,完全符合 query 的需求。
  • 科大訊飛:基於中斷循環神經網絡的文本分類
    ACL 2018基於中斷循環神經網絡的文本分類Disconnected Recurrent Neural Networks for,例如情感分類、主題分類和問題分類等。很多機器學習的新方法都會先嘗試在文本分類任務上進行實驗驗證。例如深度學習中最常見的兩大類模型,卷積神經網絡(CNN)和循環神經網絡(RNN)及其變體,在文本分類中有很多應用。RNN模型擅長對整個句子進行建模,捕捉長距離依賴信息。
  • 文本匹配模型TextMatching
    寫在前面本次分享一篇NLP文本匹配的經典文章,主要思路是借鑑圖像識別的思路來解決NLP文本匹配問題,畢竟計算機視覺技術的發展在當時異常迅猛。個人心得:文本匹配問題可轉化為二分類問題,輸出概率則為相似度將圖像識別的思路應用於文本匹配任務中,利用卷積抽取文本特徵論文地址:https://arxiv.org/pdf/1602.06359.pdf1.
  • 李偉:輿情事件等級評估及基於語義理解實現文本精細化分類
    與會的數據建模、計算機技術應用、輿情領域專家學者就如何有效地利用新技術完善重大風險評估體系建設進行了分享和探討。人民網輿情數據中心主任數據分析師李偉分享的主題是:輿情事件等級評估及基於語義理解實現文本精細化分類。
  • 文本分類六十年
    因此,大多數文本分類研究工作都是基於數據驅動且計算複雜度較高的DNNs來進行的。也正因為如此,如今很少有文章去關注如何使用淺層學習模型來緩和模型計算和構建數據時的局限性。此後,湧現出了更多通用的分類模型(習慣上稱之為分類器),比如KNN,SVM和RF,它們在文本分類任務上都運用很廣泛。最近,XGBoost和LightGBM這兩類模型表現出優異的分類性能。對於深度學習類模型,到目前為止TextCNN仍然佔據這類模型的最高引用量,其首次使用卷積神經網絡來解決文本分類問題。
  • 超越BERT 和 GPT,微軟亞洲研究院開源新模型 MASS!
    通過利用 BERT、GPT 和 XLNet 等通用語言模型,該領域的研究者們在自然語言理解方面已經取得了許多重大的突破。然而,對於序列到序列的自然語言生成任務,這些主流的預訓練方法並沒有帶來顯著的改進,對此,微軟亞洲研究院提出了一個全新的通用預訓練方法——MASS,在該任務中可以得到比 BERT 和 GPT 更好的效果。
  • NeuralNLP-NeuralClassifier:騰訊開源深度學習文本分類工具
    NeuralNLP是騰訊廣告(Tencent Marketing Solution,TMS)(https://e.qq.com/)數據算法團隊搭建的一個基於PyTorch的深度學習NLP公共實驗平臺,主要涵蓋文本分類、序列標註、語義匹配、BERT微調和文本生成等,目前已經廣泛應用於騰訊廣告業務文本相關的需求場景中,如廣告定向、相關性計算、LookAlike、動態創意、點擊率/轉化率預估等
  • 超越BERT、GPT,微軟提出通用預訓練模型MASS
    藉助於BERT和GPT等預訓練模型,人類在多個自然語言理解任務中取得了重大突破。然而,在序列到序列的自然語言生成任務中,目前主流預訓練模型並沒有取得顯著效果。為此,微軟亞洲研究院的研究員在ICML 2019上提出了一個全新的通用預訓練方法MASS,在序列到序列的自然語言生成任務中全面超越BERT和GPT。
  • 性能媲美BERT,參數量僅為1/300,谷歌最新的NLP模型
    機器之心編輯部在最新的博客文章中,谷歌公布了一個新的 NLP 模型,在文本分類任務上可以達到 BERT 級別的性能,但參數量僅為 BERT 的 1/300。在過去的十年中,深度神經網絡從根本上變革了自然語言處理(NLP)領域的發展,但移動端有限的內存和處理能力對模型提出了更高的要求。人們希望它們可以變得更小,但性能不打折扣。