作者|Veysel Kocaman コンパイラ|VK ソース|Towards Data Science
自然言語処理は、テキストを理解または推論する必要がある多くのデータサイエンス・システムの重要なコンポーネントです。一般的な使用例としては、テキストの分類、質問と回答、言い換えや要約、感情分析、自然言語BI、言語モデリング、曖昧性解消などがあります。
NLPは、ますます多くのAIアプリケーションで重要性を増しています。チャットボットの構築、特許データベースの検索、患者と臨床試験のマッチング、カスタマーサービスやセールスの電話の採点、財務報告書からの要約の抽出など、テキストから正確な情報を抽出する必要があります。
テキスト分類は、現代の自然言語処理の主要なタスクの1つで、文や文書に適切なカテゴリを割り当てるタスクです。カテゴリは選択されたデータセットに依存し、トピックから開始することができます。
どのテキスト分類問題も似たようなステップを踏み、異なるアルゴリズムで解かれます。ランダムフォレストやロジスティック回帰のような古典的で人気のある機械学習分類器はもちろんのこと、様々なテキスト分類問題を提案する150以上の深層学習フレームワークがあります。
テキスト分類問題にはいくつかのベンチマークデータセットがあり、最新のベンチマークはnlpprogress.comで追跡できます。以下はこれらのデータセットに関する基本的な統計です。
単純なテキスト分類アプリケーションは、通常、次のようなステップを踏みます:
- テキストの前処理とクリーンアップ
- フィーチャーエンジニアリング
- 特徴ベクトル化または埋め込み
- MLとDLアルゴリズムによるモデルのトレーニング
Spark-NLPのテキスト分類
この論文では、Spark NLPで一般的な文埋め込みを用いてテキスト分類モデルを構築します。そして、他のMLやDL手法、テキストベクトル化手法と比較します。
Spark NLPにはいくつかのテキスト分類オプションがあります:
- Spark-NLPにおけるテキスト前処理とSpark-MLに基づくMLアルゴリズム
- Spark-NLPとMLアルゴリズムにおけるテキストの前処理と単語の埋め込み
Universal Sentence EncodersSpark-NLPとMLアルゴリズムにおけるテキストの前処理と文の埋め込み ( )- Spark-NLPのテキスト前処理と分類器DLモジュール
Spark NLPに関する重要な記事で詳しく説明したように、ClassifierDLにおけるこれらのテキスト処理ステップはすべて、指定されたパイプラインシーケンスで実装することができ、各ステージはコンバータまたは推定器です。これらのステージは順次実行され、入力データフレームは各ステージを通過する際に変換されます。つまり、データは各パイプラインを順次通過します。各ステージのtransform()メソッドはデータセットを更新し、次のステージに渡します。パイプラインの助けを借りて、トレーニングデータとテストデータが同じ特徴処理ステップを通過することが保証されます。
Universal Sentence Encoders
自然言語処理において、テキスト埋め込みはあらゆる深層学習モデルを構築する上で重要な役割を果たします。テキスト埋め込みはテキストをベクトルに変換します。
基本的に、テキスト埋め込み法は、テキストデータの処理を大幅に改善するために、固定長のベクトルで単語や文をエンコードします。考え方は簡単で、同じ文脈に現れる単語は似たような意味を持つ傾向があるということです。
Word2vecやGloveのような技術は、単語をベクトルに変換することでこれを行います。したがって、対応するベクトル "cat "は、"eagle "よりも "dog "に近いということになります。しかし、文を埋め込む場合、文の文脈全体をこのベクトルに取り込む必要があります。Universal Sentence Encodersそこで登場するのが" "です。
Universal Sentence Encodersテキストを高次元ベクトルにエンコードし、テキスト分類、意味類似度、クラスタリング、その他の自然言語タスクに使用できます。Universal Sentence EncodersプリトレーニングはTensorflow hubで公開されています。Transformerエンコーダでトレーニングされたものと、ディープ平均化ネットワークでトレーニングされたものの2種類があります。
Spark NLPは、Tensorflowのハブ版を使用し、Spark環境で動作するようにパッケージ化されています。つまり、Spark NLPにこの埋め込みを挿入して再生するだけで、分散方式でモデルをトレーニングすることができます。
文の埋め込みを得るためには、文中の各単語の埋め込みを平均する必要がないため、それ以上の計算をすることなく文の埋め込みを生成します。
Spark-NLPにおけるテキスト分類のためのClassifierDLとUSE
この記事では、USEとClassifierDL(後者はSpark NLPバージョン2.4.4で追加された最新のモジュール)を使用して、AGNewsデータセットを使用してSpark NLPでテキスト分類器を構築します。
ClassifierDLは、Spark NLP初のマルチクラステキスト分類器で、テキスト分類の入力として様々なテキスト埋め込みを使用します。ClassifierDLAnnotatorは、TensorFlow内に構築されたディープラーニングモデルを使用し、最大50クラスをサポートします。
Universal Sentence Encodersつまり、この classifirdl を使って、Spark NLP で Bert、Elmo、Glove、.NET を使ったテキスト分類器を構築することができます。
コードを書き始めましょう!
ステートメントは必要なパッケージをロードし、Sparkセッションを開始します。
import sparknlp
spark = sparknlp.start()
# sparknlp.start(gpu=True) >> GPUでのトレーニング
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
AGNewsデータセットはGithubリポジトリからダウンロードできます。" title="https://github.com/JohnSnowLabs/spark-nlp-workshop/tree/master/tutorials/Certification_Trainings/Public)からダウンロードできます。">github.com/JohnSnowLab...
! wget https://..com/JohnSnowLabs/spark-nlp-workshop/master/tutorials/Certification_Trainings/Public/data/news_category_.csv
! wget https://..com/JohnSnowLabs/spark-nlp-workshop/master/tutorials/Certification_Trainings/Public/data/news_category_.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データセットには4つのカテゴリがあります: 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|
+--------+-----+
# 実際の内容は説明欄にある
document = DocumentAssembler()\
.setInputCol("description")\
.setOutputCol("document")
#事前に学習されたエンベッディングがダウンロードできる
use = UniversalSentenceEncoder.pretrained()\
.setInputCols(["document"])\
.setOutputCol("sentence_embeddings")
# classes/labels/categories カテゴリー欄に
classsifierdl = ClassifierDLApproach()\
.setInputCols(["sentence_embeddings"])\
.setOutputCol("class")\
.setLabelColumn("category")\
.setMaxEpochs(5)\
.setEnableOutputLogs(True)
use_clf_pipeline = Pipeline(
stages = [
document,
use,
classsifierdl
])
上記で、データセットを取得し、入力し、useから文埋め込みを取得し、ClassifierDLで学習します。
トレーニングを開始します。ClassiferDLの.setMaxEpochs()を使って5エポックを学習します。Colab環境では10分程度で完了します。
use_pipelineModel = use_clf_pipeline.fit(trainDataset)
このコマンドを実行すると、Spark NLPはホームディレクトリのannotator_logsフォルダにトレーニングログを書き込みます。以下がそのログです。
ご覧のように、通常、あらゆる自然言語処理モデリングにおいて最も時間と手間のかかるステップであるテキストの前処理を行うことなく、10分未満で90%以上の検証精度を達成しました。
では、早速予測をしてみましょう。上記でダウンロードしたテストセットを使用します。
classification_reportsklearnライブラリのテスト結果です。
テストセットの精度は89.3%!良さそうです!
バートとグローブ埋め込みに基づくSpark-NLPテキスト前処理分類
他のテキスト分類問題と同様に、ステミング、ステミング分析、スペルチェック、非活性化単語の除去など、テキストの前処理には有用な技法が数多くあり、スペルチェックを除いて、Python のほぼすべての NLP ライブラリにはこれらの技法を適用するツールがあります。現在、Spark NLP ライブラリは、スペルチェック機能を備えた唯一の NLP ライブラリです。
これらのステップをSpark NLPパイプラインで適用し、グローブ埋め込みを使用してテキスト分類器を学習します。まず、いくつかのテキスト前処理ステップを適用し、各トークンの単語埋め込みを取得し、各文の単語埋め込みを平均して、各行の文埋め込みを取得します。
Spark NLPにおけるこれらのテキスト前処理ツールやその他のツールについては、このColabノートブックに詳細な説明とコード例があります。" title="https://github.com/JohnSnowLabs/spark-nlp-workshop/blob/master/tutorials/Certification_Trainings/Public/2.Text_Preprocessing_with_SparkNLP_Annotators_Transformers.ipynb)にあります。" title="">github.com/JohnSnowLab...
それならトレーニングができます。
clf_pipelineModel = clf_pipeline.fit(trainDataset)
検査結果を入手
現在、テストセットでの精度は88%です!Universal Sentence Embeddingsこれらのテキストクリーニングステップの後でも、+ClassifierDLを打ち負かすことは不可能です。これは主に、USEがデータクリーニングバージョンと比較して生のテキストでより良いパフォーマンスを発揮するためです。
BERT と同じ分類器を訓練するには、上記で構築した同じパイプラインで glove_embeddings を BERT_embedding に置き換えることができます。
word_embeddings = BertEmbeddings\
.pretrained('bert_base_cased', 'en') \
.setInputCols(["document",'lemma'])\
.setOutputCol("embeddings")\
.setPoolingLayer(-2) # default 0
エルモの埋め込みも可能です。
word_embeddings = ElmoEmbeddings\
.pretrained('elmo', 'en')\
.setInputCols(["document",'lemma'])\
.setOutputCol("embeddings")
LightPipelineによる高速推論
以前の記事で詳しく説明したように、LightPipelines は Spark ML パイプラインと同等の Spark NLP 専用パイプラインですが、少量のデータを処理するように設計されています。少量のデータセットを扱うとき、結果をデバッグするとき、1回限りのリクエストに対応するAPIからトレーニングや予測を実行するときに便利です。
Spark NLP LightPipelinesこれはSpark MLパイプラインを別のマシン上のマルチスレッドタスクに変換したもので、データ量が少ない場合は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"
ClassifierDLModel.load()また、この学習済みモデルをディスクに保存して、後で別のSparkパイプラインで.
結論
Universal Sentence Encoders,この論文では、Spark-NLPで単語埋め込みと、10分未満の学習時間で良好なモデル精度を得る、マルチクラスのテキスト分類モデルを学習しました。コード全体はこのGithubレポ(Colab互換、github.com/JohnSnowLab... NLPとSpark MLにおけるテキスト分類の可能なすべての組み合わせ:github.com/JohnSnowLab...
また、Spark NLPのオンライントレーニングの提供も開始しました。すべての公開Colab Notebooksへのリンクはこちらです。
ジョン・スノウ・ラボはバーチャル・スパークNLPトレーニングを開催します:
上記コードのスクリーンショット
パンチャンAIブログサイトへようこそ:
Panchuangのブログリソースラウンドアップへようこそ:





