[NLP Python ライブラリ (02/4)]: Spacy

1. 説明

        洗練された NLP ライブラリである Spacy を使用すると、さまざまな NLP タスクにさまざまなトレーニング済みモデルを使用できます。トークン化から品詞タグ付け、エンティティ認識まで、Spatiy は適切に設計された Python データ構造と強力な視覚化も生成します。最も重要なことは、さまざまな言語モデルをロードして、ドメイン固有の NLP タスクに合わせて微調整できることです。最後に、Spatiy は、組み込みおよびカスタムのトークナイザー、パーサー、トークナイザー、その他のコンポーネントを容易に混合して、必要なすべての NLP タスクをサポートする言語モデルを作成できる強力なパイプライン オブジェクトを提供します。

        この記事ではスペースについて説明します。ライブラリのインストール、モデルの読み込み、テキスト処理およびテキスト セマンティクス タスクの適用方法、そして最後に空間モデルのカスタマイズ方法を学びます。

この記事の技術的な内容は と です すべての例は、新しいバージョンでも同様に動作するはずです。Python v3.11Spacy v3.5.3

この記事はもともとブログ admantium.comに掲載されたものです。

2、スペイシーライブラリのインストール

Spacy ライブラリは pip 経由でインストールできます。

python3 -m pip install spacy 

        すべての NLP タスクでは、最初にモデルをロードする必要があります。Spacy は、さまざまなコーパスとさまざまな言語に基づいたモデルを提供します。モデルの完全なリストを表示します一般に、モデルは、NLP タスク中に異なる結果をもたらすコーパスのサイズと、未知の内部形式であるモデルの構築に使用される手法、または Berta などの Transformer ベースのモデルによって区別できます。

        特定のモデルをロードするには、次のコード スニペットを使用できます。

python -m spacy download en_core_web_lg 

3. 自然言語処理タスク

Spacy は次のタスクをサポートします。

テキスト処理

  • トークン化
  • 見出し語化

テキスト文法

  • 品詞タグ

テキストのセマンティクス

  • 依存関係の解決
  • 固有表現認識

ドキュメントのセマンティクス

  • 分類

さらに、Spatiy は次の追加機能をサポートしています。

  • コーパス管理
  • 単語ベクトル
  • カスタム NLP パイプライン
  • モデルトレーニング

3.1 テキスト処理

        Spacy は、事前トレーニングされた言語モデルの 1 つを使用するときに、テキスト処理の必須機能を自動的に適用します。技術的には、テキスト処理は、SciKit Learn パイプライン オブジェクトに似た抽象化である、構成可能なパイプライン オブジェクトを中心に展開します。この処理は常にトークン化から始まり、その後、解析されたテキストを情報で充実させるために他のデータ構造を追加します。これらすべてのタスクは、トークナイザー コンポーネントの交換など、カスタマイズすることもできます。以下の手順は、事前トレーニングされたモデルを使用する場合の組み込み機能のみに焦点を当てています。

3.2 トークン化

        トークン化は最初のステップであり、適用は簡単です。ロードされたモデルをテキストに適用すると、トークンが表示されます。

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

# Source: Wikipedia, Artificial Intelligence, https://en.wikipedia.org/wiki/Artificial_intelligence
paragraph = '''Artificial intelligence was founded as an academic discipline in 1956, and in the years since it has experienced several waves of optimism, followed by disappointment and the loss of funding (known as an "AI winter"), followed by new approaches, success, and renewed funding. AI research has tried and discarded many different approaches, including simulating the brain, modeling human problem solving, formal logic, large databases of knowledge, and imitating animal behavior. In the first decades of the 21st century, highly mathematical and statistical machine learning has dominated the field, and this technique has proved highly successful, helping to solve many challenging problems throughout industry and academia.'''
doc = nlp(paragraph)
tokens = [token for token in doc]
print(tokens)
# [Artificial, intelligence, was, founded, as, an, academic, discipline

3.3レマ化

        Lem は自動的に生成され、トークンのプロパティです。

doc = nlp(paragraph)

lemmas = [token.lemma_ for token in doc]
print(lemmas)
# ['artificial', 'intelligence', 'be', 'found', 'as', 'an', 'academic',

構成可能なコンポーネントは、ルールまたはルックアップに見出し語化を適用します。組み込みモデルが使用するモードを確認するには、次のコードを実行します。

lemmatizer = nlp.get_pipe("lemmatizer")

print(lemmatizer.mode)
# 'rule'

空間には幹はありません。

3.4、テキスト文法

3.4.1 品詞のタグ付け

        Spacy では、品詞タグには 2 つの形式があります。この属性は、トークンが属する絶対的なカテゴリであり、汎用 POS トークンとして特徴付けられます。この属性は、依存関係分析と名前付きエンティティ認識に基づいて構築された、より詳細なカテゴリです。POSTAG

次の表にこれらのクラスを示します。POS

        トークンの説明 ADJ 形容詞 ADP 付加 ADV 副詞 AUX 補助 CCONJ 等位接続詞 DET 決定詞 INTJ 間投詞 名詞 NUM 数字部助詞 PRON 代名詞 PROP 固有名詞 句読点 SCONJ 従属接続詞 記号 動詞 動詞 X その他

        これらのクラスのドキュメントには明確な説明が見つかりません。ただし、この Stackoverflow スレッドは、依存関係の解決に関する学術論文で使用されるクラスについて言及しています。TAGTAG

        トークンに関連付けられた合計を確認するには、次のコードを実行します。POSTAG

doc = nlp(paragraph)
for token in doc:
    print(f'{token.text:<20}{token.pos_:>5}{token.tag_:>5}')

#Artificial            ADJ   JJ
#intelligence         NOUN   NN
#was                   AUX  VBD
#founded              VERB  VBN
#as                    ADP   IN
#an                    DET   DT
#academic              ADJ   JJ
#discipline           NOUN   NN

3.5 テキストのセマンティクス

3.5.1 依存関係の解決

        依存関係分析では、単語および単語のチャンクの文脈上の関係を調べます。このステップにより、マシンがテキストから取得できる意味情報が大幅に強化されます。

        Spacy は、依存関係のテキスト表現とグラフィック表現の両方を提供します。

doc = nlp(paragraph)
for token in doc:
    print(f'{token.text:<20}{token.dep_:<15}{token.head.text:<20}')

# Artificial          amod           intelligence
# intelligence        nsubjpass      founded
# was                 auxpass        founded
# founded             ROOT           founded
# as                  prep           founded
# an                  det            discipline
# academic            amod           discipline
# discipline          pobj           as
# in                  prep           founded

        これらの関係をグラフィカルに視覚化するには、次のコマンドを実行します。

from spacy import displacy

nlp = spacy.load("en_core_web_lg")
displacy.serve(doc, style="dep", options={"fine_grained": True, "compact": True})

        次のような構造が出力されます。

        この処理ステップの能力は、言語モデルの生のトレーニング コーパスに限定されることに注意してください。Spacy は、解析を強化する 2 つの方法を提供します。まず、モデルを最初からトレーニングできます。第 2 に、最近リリースされた Spacy は、よりドメイン固有のコーパスで使用するために微調整できるトランスフォーマー モデルを提供します。

3.6 固有表現の認識

        テキスト内のエンティティは人、組織、またはオブジェクトであり、Spacy は処理されたドキュメントに対してこれらを検出できます。

        認識されたエンティティは解析されたドキュメントの一部であり、プロパティによってアクセスできます。ents

doc = nlp(paragraph)
for token in doc.ents:
    print(f'{token.text:<40}{token.label_:<15}')

# 1956                                    DATE
# the years                               DATE
# AI                                      ORG
# the first decades of the 21st century   DATE

あるいは、視覚化することもできます。

        依存関係の解決と同様に、このステップの結果はトレーニング データに大きく依存します。たとえば、本の本文で使用すると、登場人物の名前が認識されない可能性があります。この状況に対処するために、テキスト処理中に名前付きエンティティの候補を識別するために使用されるカスタムナレッジ ベース オブジェクトを作成できます。

3.7 ドキュメントのセマンティクス

3.7.1 分類

        Spacy 自体には分類や分類アルゴリズムは含まれていませんが、他のオープンソース プロジェクトは機械学習タスクを実行するために Spacy を拡張しています。

ほんの一例です。Berttopic拡張 機能は、視覚的な表現も提供する、すぐに使える文書分類プロジェクトです。

このプロジェクトは実行するとインストールされます。このプロジェクトを 200 件の記事セットに適用すると、次の結果が得られます。pip install "bertopic[spacy]"

import numpy as np
import pandas as pd
from bertopic import BERTopic

X = pd.read_pickle('ml29_01.pkl')

docs = X['preprocessed'].values

topic_model = BERTopic()
topics, probs = topic_model.fit_transform(docs)

print(topic_model.get_topic_info())
# Topic Count Name
# -1 30 -1_artificial_intelligence_machine
# 1 22 49_space_lunar_mission

3.8 追加機能

3.8.1 コーパス管理

        Spacy はオブジェクトを定義しますが、カスタム Spacy 言語モデルをトレーニングするためにJSON またはプレーン テキスト ファイルを読み取るために使用されます。Corpus

        ドキュメント内で私が見つけることができるすべての処理済みテキストの唯一のプロパティは、処理済みテキスト内で見つかったすべての単語の検索テーブルです。vocab

3.8.2 テキストベクトル

        カテゴリ または のすべての組み込みモデルには、ワード ベクトルが含まれます。Spacy では、個々のトークン、スパン (ユーザー定義のドキュメント スライス)、または完全なドキュメントをベクトルとして表すことができます。mdlg

以下に例を示します。

nlp = spacy.load("en_core_web_lg")

vectors = [(token.text, token.vector_norm) for token in doc if token.has_vector]

print(vectors)
# [('Artificial', 8.92717), ('intelligence', 6.9436903), ('was', 10.1967945), ('founded', 8.210244), ('as', 7.7554812), ('an', 8.042635), ('academic', 8.340115), ('discipline', 6.620854),

span = doc[0:10]

print(span)
# Artificial intelligence was founded as an academic discipline in 1956

print(span.vector_norm)
# 3.0066288

print(doc.vector_norm)
# 2.037331438809547

        ドキュメントでは、どの特定のトークン化方法が使用されているかは明らかにされていません。正規化されていないトークンの次元は 300 であり、FastText トークン化メソッドが使用されていることを示唆している可能性があります。

token = doc[0]

print(token.vector.dtype, token.vector.shape)
# float32 (300,)

print((token.text, token.vector))
#'Artificial',
# array([-1.6952  , -1.5868  ,  2.6415  ,  1.4848  ,  2.3921  , -1.8911  ,
#         1.0618  ,  1.4815  , -2.4829  , -0.6737  ,  4.7181  ,  0.92018 ,
#        -3.1759  , -1.7126  ,  1.8738  ,  3.9971  ,  4.8884  ,  1.2651  ,
#         0.067348, -2.0842  , -0.91348 ,  2.5103  , -2.8926  ,  0.92028 ,
#         0.24271 ,  0.65422 ,  0.98157 , -2.7082  ,  0.055832,  2.2011  ,
#        -1.8091  ,  0.10762 ,  0.58432 ,  0.18175 ,  0.8636  , -2.9986  ,
#         4.1576  ,  0.69078 , -1.641   , -0.9626  ,  2.6582  ,  1.2442  ,
#        -1.7863  ,  2.621   , -5.8022  ,  3.4996  ,  2.2065  , -0.6505  ,
#         0.87368 , -4.4462  , -0.47228 ,  1.7362  , -2.1957  , -1.4855  ,
#        -3.2305  ,  4.9904  , -0.99718 ,  0.52584 ,  1.0741  , -0.53208 ,
#         3.2444  ,  1.8493  ,  0.22784 ,  0.67526 ,  2.5435  , -0.54488 ,
#        -1.3659  , -4.7399  ,  1.8076  , -1.4879  , -1.1604  ,  0.82441 ,

最後に、Spatiy はパイプラインにユーザー定義のワード ベクトルを提供するオプションを提供します

4. NLP パイプラインをカスタマイズする

        パイプラインの参照モデルは、事前トレーニングされた言語モデルに含まれています。それらには次のものが含まれます。

  • トークナイザー
  • トークナイザー
  • 依存関係リゾルバー
  • エンティティ認識装置
  • レンマタイザー

        パイプライン ステップは、プロジェクト固有の構成ファイルで定義する必要があります。これらすべてのステップの完全なパイプライン定義は次のとおりです。

[nlp]
pipeline = ["tok2vec", "tagger", "parser", "ner", "lemmatizer"]

        このパイプラインは拡張できます。たとえば、テキスト分類ステップを追加するには、パイプライン宣言を追加して実装を提供するだけです。textcat

        いくつかのパイプライン コンポーネントが利用可能であるほか、Paccy によって実装されたドキュメント表現と対話して強化するカスタムコンポーネントを追加するオプションも利用できます。

        さらに、ワードベクトル表現を交換したり、PyTorch または外部トランスフォーマーライブラリに基づくトランスフォーマー ベースのモデルを使用したりするなど、外部のカスタムモデルまたはモデル コンポーネントを Spacy に組み込むことができます。

5. モデルのトレーニング

        パイプライン オブジェクトと広範な構成ファイルに基づいて、新しいモデルをトレーニングできます。クイックスタート ガイドには、必要なパイプライン ステップとローカル ファイル パスを対話的に作成できる UI ウィジェットが含まれています。トレーニング データは、トレーニングする必要がある属性を含む Python データ オブジェクトの形式である必要があります。以下は、名前付きエンティティ認識のトレーニングに関する公式ドキュメントの例です。

# Source: Spacy, Training Pipelines & Models, https://spacy.io/usage/training#training-data

nlp = spacy.blank("en")
training_data = [
  ("Tokyo Tower is 333m tall.", [(0, 11, "BUILDING")]),
]

        トレーニング データ自体については、JSON、共通の依存関係、IOB や BILUO などの名前付きエンティティ認識形式など、複数のコンバーターがサポートされています。

        トレーニングの目的で、コーパスオブジェクトを使用して、JSON またはプレーン テキスト ドキュメントを反復処理できます。

6. まとめ

        Spacy は最先端の NLP ライブラリです。事前トレーニング済みモデルの 1 つを使用すると、すべての基本的なテキスト処理タスク (トークン化、見出し語化、品詞タグ付け) とテキスト セマンティック タスク (依存関係分析、固有表現認識) が適用されます。すべてのモデルはパイプライン オブジェクトを通じて作成され、このオブジェクトを使用して、カスタム トークナイザーの提供やワード ベクトル コンポーネントの交換など、これらのステップをカスタマイズできます。さらに、他のトランスフォーマーベースのモデルを使用して、パイプラインをテキスト分類タスクで拡張することもできます。セバスチャン

·

おすすめ

転載: blog.csdn.net/gongdiwudu/article/details/132683491