「spaCyを使用したNLPパイプラインの強化」

Enhancing NLP Pipeline with spaCy

はじめに

spaCyは、自然言語処理(NLP)のためのPythonライブラリです。spaCyを使用したNLPパイプラインは無料でオープンソースです。開発者は、Cythonのように情報抽出や自然言語理解システムを作成するためにそれを使用します。このツールは、コンパクトで使いやすいAPIを持つ製品のために使用します。

テキストを大量に扱う場合は、それについてもっと学びたいと思うでしょう。例えば、それは何についてですか?どの文脈で用語は意味を持ちますか?誰に対して何が行われていますか?どのビジネスや商品が言及されていますか?どのテキストが互いに比較できますか?

spaCyは、本番使用を想定しており、膨大な量のテキストを処理して「理解」するアプリケーションの開発を支援します。情報抽出システム、自然言語解釈、深層学習のためのテキストの前処理など、さまざまなタスクに対応できます。

学習目標

  • トークン化、品詞タグ付け、固有名詞の識別など、spaCyの基礎を学ぶ。
  • 効率的かつ高速なテキスト処理アーキテクチャであるspaCyのテキスト処理アーキテクチャを理解し、大規模なNLPジョブに適している。
  • spaCyでは、NLPパイプラインを探索し、特定のタスクに特化したカスタムパイプラインを作成できます。
  • ルールベースのマッチング、構文解析、エンティティリンクなど、spaCyの高度な機能を探索する。
  • spaCyで利用可能な多数の事前学習済み言語モデルについて学び、さまざまなNLPアプリケーションでそれらを利用する方法を学ぶ。
  • spaCyを使用してテキスト内のエンティティを識別し、分類するための固有名詞認識(NER)戦略を学ぶ。

この記事は、データサイエンスブログマラソンの一環として公開されました。

統計モデル

一部のspaCyの機能は自律的に機能しますが、他の機能は統計モデルのロードが必要です。これらのモデルにより、spaCyは単語が動詞か名詞かを決定するなど、言語の注釈を予測することができます。現在、spaCyはさまざまな言語の統計モデルを提供しており、それらを個別のPythonモジュールとしてインストールすることができます。通常、以下の要素を組み込んでいます:

  • 品詞タガー、依存パーサー、固有名詞認識器に対してバイナリの重みを割り当てることで、それらの注釈を文脈で予測します。
  • 語彙中の形態素とその文脈に依存しない特徴(形式や綴りなど)を含む語彙項目
  • レンマ化のルールやルックアップテーブルなどのデータファイル
  • 単語の多次元の意味表現である単語ベクトルで、単語間の類似性を特定することができます。
  • モデルのロード時に、言語や処理パイプラインの設定などの設定オプションを使用してspaCyを適切な状態にすることができます。

モデルをインポートするには、以下のようにspacy.load(‘モデル名’)を実行します:

!python -m spacy download en_core_web_lg

!python -m spacy download en_core_web_sm

import spacy
nlp = spacy.load('en_core_web_sm')

言語注釈

spaCyは、文書の文法的構造を理解するのに役立つさまざまな言語注釈を提供しています。これには、品詞などの単語の種類や、単語の接続方法などが含まれます。たとえば、テキストを分析する際に、名詞が文の主語なのか句の目的語なのか、または「Google」が動詞として使用されるのか、特定のウェブサイトや企業を指すのかによって、大きな違いがあります。

import spacy
nlp = spacy.load("en_core_web_sm")

doc = nlp("Company Y is planning to acquire stake in X company for $23 billion")
for token in doc:
    print(token.text, token.pos_, token.dep_)

ドキュメントが処理された後でも(たとえば、個々の単語に分割され、注釈が付けられた後でも)、元のテキストのメタデータ(空白文字など)をすべて保持しています。トークンのオフセットを元の文字列内で常に取得したり、トークンとその後に続く空白文字をマージして再構築したりすることができます。このようにして、spaCyを使用してテキストを解析する際に情報が失われることはありません。

spaCyの処理パイプライン

spaCyを使用する際の最初のステップは、テキスト文字列をNLPオブジェクトに与えることです。このオブジェクトは、入力テキスト文字列が通過するテキスト前処理の一連の活動のパイプラインです。

上の図に示されているように、NLPパイプラインには、トークナイザー、タガー、パーサー、NERなどのいくつかのコンポーネントがあります。したがって、入力テキスト文字列で何かをする前に、すべてのコンポーネントを通過する必要があります。

nlpオブジェクトを作成する方法を示しましょう:

import spacy
nlp = spacy.load('en_core_web_sm')

# nlpオブジェクトを作成する
doc = nlp("彼は友達と一緒にスタジアムでクリケットをしに行った")

アクティブなパイプラインコンポーネントを確認するために、次のコードを使用します:

nlp.pipe_names

トークナイザーのみを実行したい場合は、次のコードを使用してパイプラインコンポーネントを無効にします:

nlp.disable_pipes('tagger', 'parser')

再度アクティブなパイプラインコンポーネントを確認します:

nlp.pipe_names

トークン化

SpaCyは、テキストをトークン化して処理を開始します。これは、単語、句読点などにセグメント化することを意味します。これは、言語固有のルールを使用して行われます。テキストを単語、句読点などに分割すること。

#import cimport spacy

nlp = spacy.load("en_core_web_sm")
doc = nlp("Reliance is looking at buying U.K. based 
analytics startup for $7 billion")
for token in doc:
    print(token.text)sv

まず、生のテキストは空白文字で区切られ、text.split(’ ’)のようになります。トークナイザーはテキストを左から右に読み取ります。各サブストリングに対して2つのテストを実行します:

  • サブストリングはトークナイザーの例外ルールと一致しますか?例えば、「Don’t」は空白を含まず、2つのトークン「do」と「n’t」に分割されるべきですが、「U.K.」は常に単一のトークンのままであるべきです。
  • プレフィックス、サフィックス、またはインフィックスを分離できますか?例えば、コンマ、ピリオド、ハイフン、引用符など。

一致が見つかった場合、ルールを適用し、分割されたばかりのサブストリングからトークナイザーループを再開します。SpaCyは、略語や複数の句読点などの複雑なネストされたトークンを区別するために、このメソッドを使用する場合があります。

品詞(POS)タグ付け

品詞(POS)は、特定の単語が文中でどのように使用されるかを示す文法的な役割です。この分類には8つの異なる部分が含まれます。

  • 名詞
  • 代名詞
  • 形容詞
  • 動詞
  • 副詞
  • 前置詞
  • 接続詞
  • 感嘆詞

品詞タグ付けは、文中の各トークンにPOSタグを割り当てることです。POSタグは、各単語に名詞や動詞などの構文カテゴリを割り当てるために役立ちます。

品詞タグ付けは、文中のすべての単語に自動的にPOSタグを割り当てます。特徴エンジニアリング、言語解釈、情報抽出などのさまざまな下流のNLPタスクに使用できます。

POSタギングはspaCyでは簡単です。spaCyでは、POSタグはTokenオブジェクトの属性として利用できます:

import spacy 
nlp = spacy.load('en_core_web_sm')

# nlpオブジェクトを作成する
doc = nlp("Reliance is looking at buying U.K. based 
analytics startup for $7 billion")
 
# トークンを繰り返し処理する
for token in doc:
    # トークンとその品詞タグを表示する
    print(token, token.tag_, token.pos_, spacy.explain(token.tag_))

Docを視覚化する最も簡単な方法は、displacy.serveを使用することです。これはspaCyに簡単に統合できるシンプルなWebサーバーを起動し、結果をブラウザで表示することができます。displaCyの最初のパラメータとして、単一のDocオブジェクトまたはDocオブジェクトのリストを取ることができます。これにより、任意のモデルや変更を使用して、望むようにビルドすることができます。以下は、サンプルステートメントとその依存関係の表示方法です:

import spacy
from spacy import displacy

doc = nlp("board member meet with senior manager")
displacy.render(doc, style="dep", jupyter=True)

エンティティ検出

エンティティ検出、またはエンティティ認識とも呼ばれるものは、テキスト文字列の重要な特徴、場所、個人、組織、言語などを区別する高度な言語処理の一種です。これはテキストから情報を迅速に抽出するのに特に役立ちます。重要な主題やテキストの重要な部分をすぐに特定できます。

最近のワシントンポストの記事からこれらの抜粋を使用してエンティティの検出を試してみましょう。.entsを使用して、テキスト内の各認識されたものに対してラベルを取得し、spaCyのdisplaCyビジュアライザを使用してこれらのエンティティをより視覚的に分析します。

import spacy
from spacy import displacy
nlp = spacy.load("en_core_web_sm")
doc= nlp(u"""The Amazon rainforest,[a] alternatively, 
the Amazon Jungle, also known in English as Amazonia, 
is a moist broadleaf tropical rainforest in the Amazon
 biome that covers most of the Amazon basin of South America.
  This basin encompasses 7,000,000 km2 (2,700,000 sq mi), of
   which 5,500,000 km2 (2,100,000 sq mi) are covered by the rainforest. 
   This region includes territory belonging to nine nations.""")

entities=[(i, i.label_, i.label) for i in doc.ents]
entities

displacyを使用すると、入力テキストを表示し、検出されたオブジェクトごとに色でハイライトして名前を付けることもできます。この場合、style=”ent”を使用してエンティティを表示するようにdisplaCyに指示します。

displacy.render(doc, style="ent", jupyter=True)

類似度

類似度を評価するために、単語のベクトルまたは「単語埋め込み」と呼ばれる多次元の意味表現を比較します。通常、word2vecなどのアルゴリズムを使用して単語のベクトルを作成し、次のように表示されます

Spacyは、分散類似情報を伝える密な実数値ベクトルも組み込んでいます。

import spacy

nlp = spacy.load("en_core_web_lg")
tokens = nlp("dog cat banana afskfsd")

for token in tokens:
    print(token.text, token.has_vector, token.vector_norm, token.is_oov)

import spacy

nlp = spacy.load("en_core_web_lg")  # より大きなモデルを使用することを確認してください!
tokens = nlp("dog cat banana")

for token1 in tokens:
    for token2 in tokens:
        print(token1.text, token2.text, token1.similarity(token2))

この状況では、モデルの予測はかなり正確です。犬は猫に非常に似ています。しかし、バナナはまったく似ていません。同一のトークンは同一です(ただし、ベクトル演算と浮動小数点の誤差のため、必ずしも正確な1.0ではありません)。

結論

spaCyは、効率的で堅牢なテキスト処理を可能にする、よく知られたオープンソースの自然言語処理(NLP)プログラムです。スケーラビリティ、多言語サポート、利用準備が整っている機能により、spaCyは学術および産業の両方で広く受け入れられています。深層学習フレームワークとの簡単な連携、柔軟なパイプライン、アクティブなコミュニティにより、さまざまなNLP活動のための良い選択肢となっており、ユーザーは正確かつ効果的な言語処理結果を提供することができます。

  • 高速かつスケーラブルなテキスト処理機能を持っています。
  • 複数の言語がサポートされ、事前学習済みモデルが利用可能です。
  • 標準的なNLPタスクに利用できる準備が整った機能があります。
  • ドメイン固有のモデルをカスタマイズしてトレーニングできます。
  • 深層学習フレームワークとの統合がシームレスです。
  • 実世界のNLPアプリケーションで広く使用されています。

最後に、spaCyは、さまざまな言語でのテキスト処理のための多機能で事前学習済みモデルを提供する、非常に効率的で適応性のあるユーザーフレンドリーなNLPライブラリです。その速度、スケーラビリティ、カスタマイズの可能性から、研究および本番レベルのNLPアプリケーションで人気の選択肢です。

よくある質問

この記事に表示されているメディアはAnalytics Vidhyaの所有ではなく、著者の裁量で使用されています。

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

人工知能

「マーク・A・レムリー教授による生成AIと法律について」

データサイエンス内で新しい分野が現れ、研究内容が理解しにくい場合は、専門家やパイオニアと話すことが最善です最近、私た...

人工知能

『DeepHowのCEO兼共同創業者、サム・ジェン氏によるインタビューシリーズ』

ディープハウのCEO兼共同創設者であるサム・ジェンは、著名な投資家から支持される急速に進化するスタートアップを率いていま...

人工知能

「Kognitosの創設者兼CEO、ビニー・ギル- インタビューシリーズ」

ビニー・ギルは、複数の役職と企業を横断する多様で幅広い業務経験を持っていますビニーは現在、Kognitosの創設者兼CEOであり...

人工知能

「Zenの共同創設者兼CTO、イオン・アレクサンドル・セカラ氏によるインタビューシリーズ」

創業者兼CTOであるIon-Alexandru Secaraは、Zen(PostureHealth Inc.)の開発を牽引しており、画期的な姿勢矯正ソフトウェア...

データサイエンス

アステラソフトウェアのCOO、ジェイ・ミシュラ - インタビューシリーズ

ジェイ・ミシュラは、急速に成長しているエンタープライズ向けデータソリューションの提供企業であるAstera Softwareの最高執...

人工知能

ジョナサン・ダムブロット、Cranium AIのCEO兼共同創設者- インタビューシリーズ

ジョナサン・ダムブロットは、Cranium AIのCEO兼共同創業者ですCranium AIは、サイバーセキュリティおよびデータサイエンスチ...