注: 以下の翻訳の正確性は検証されていません。AIPを利用して英語版の原文から機械的に翻訳されたものです。
spaCyは、先進的な自然言語処理(NLP)のための人気のあるオープンソースソフトウェアライブラリです。この例では、foundry_ml
ステージレジストリにspaCyモデルを登録する方法を説明します。このコードは、spaCyのウェブサイト上のspaCyのTokenizerクラスのカスタマイズの例に従い、名前付きエンティティ認識モデルを利用しています。
このチュートリアルは、Foundryのモデル統合の基本的な構成要素を基にしており、以下のことについて理解していることを前提としています。
foundry_ml
ステージレジストリにカスタムステージを追加する方法の理解。詳細については、追加のライブラリサポートの追加のドキュメンテーションを参照してください。このチュートリアルでは、そのドキュメンテーションで詳細に説明されているステップの大部分を実装しています。このチュートリアルでは、あらかじめ訓練されたspaCy言語モデルが制作環境で利用可能であることを前提としています。利用できない場合は、オープンソースのcondaチャネルを通じてアクセスを許可するか、自身のプライベートcondaチャネルを設定して制作環境で利用できるようにする必要があるかもしれません。具体的な方法については、Palantirの担当者にお問い合わせください。
データフレーム内の "text" 行を入力としてモデルを各行に適用するモデルを作成したいと考えています。これを実現するために、変換関数、シリアライザ、デシリアライザを登録するラッパークラス、SpacyNERModel
を定義する必要があります。これらのデコレートされた関数は全て、Foundryがモデルを正しくシリアライズし、実行するために必要です。
まず最初に、「Python Library」というタイプの新しいCode Repositoryを作成し、プロジェクトの構造を設定します。この例では、「spacy-custom-ner-stage」リポジトリを作成し、その中に「spacy_custom_stage」フォルダーを作成し、その中にPythonファイル2つ、「model.py」と「model_class_registry.py」を作成しました。以下で定義するコードを2つのファイルに分ける必要はありませんが、ここではより明快な概念的分割を提供するためにそうしています。
├── conda_recipe
│ └── meta.yaml
├── settings.gradle
├── src
│ ├──spacy_custom_stage
│ │ ├── __init__.py
│ │ └── model.py
│ │ │ # 日本語: モデルの実装
│ │ └── model_class_registry.py
│ │ │ # 日本語: モデルクラスの登録
│ ├── setup.cfg
│ └── setup.py
└── README.md
model.py
ファイルでは、spaCy のチュートリアルに従ってカスタムトークナイザーを作成し、新しいモデルクラスを定義します:
Copied!1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
import spacy from spacy.tokenizer import Tokenizer # カスタムトークナイザーを作成 def custom_tokenizer(nlp): import re special_cases = {":)": [{"ORTH": ":)"}]} prefix_re = re.compile(r'''^[[("']''') suffix_re = re.compile(r'''[])"']$''') infix_re = re.compile(r'''[-~]''') simple_url_re = re.compile(r'''^https?://''') # トークナイザーの設定 return Tokenizer(nlp.vocab, rules=special_cases, prefix_search=prefix_re.search, suffix_search=suffix_re.search, infix_finditer=infix_re.finditer, url_match=simple_url_re.match) # foundry_mlレジストリ用のラッパークラスを定義 class SpacyNERModel(): # 入力としてロードされた言語モデルとカスタムトークナイザーを受け取る def __init__(self, model_name): self.spacy = spacy.load(model_name) self.spacy.tokenizer = custom_tokenizer(self.spacy) # ロードされたSpaCyモデルを使用して抽出されたエンティティを返す # この関数は、異なるNLPタスクを実行するために適応できる def predict(self, text): doc = self.spacy(text) results = [(ent.text, ent.start_char, ent.end_char, ent.label_) for ent in doc.ents] return results # データフレームで動作する予測関数を定義し、データフレームに"text"カラムが存在することを前提とする def predict_df(self, df): df["entities"] = df["text"].apply(self.predict) return df
model_class_registry.py
ファイルで、serialize
、deserialize
、および transform
関数を実装します。
Copied!1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
import dill import os import tempfile # 新しく作成したモデルクラスをインポートします。 from spacy_custom_stage.model import SpacyNERModel # Foundry python関数をインポートします。 from foundry_ml.stage.flexible import stage_transform, register_stage_transform_for_class from foundry_ml.stage.serialization import deserializer, serializer, register_serializer_for_class from foundry_object.utils import safe_upload_file, download_file # モデルとデータをステージ間で渡すための関数を注釈します。 @stage_transform() def _transform(model, df): # モデル予測を実行します。 return model.predict_df(df) # これを呼び出すと、python Stage Registryに送信されます。force=Trueで既存の登録済み変換を上書きします。 register_stage_transform_for_class(SpacyNERModel, _transform, force=True) # デシリアライザのデコレータ @deserializer("spacy_ner_model.dill", force=True) def _deserializer(filesystem, path): # 一時ディレクトリ内でモデルをロードします。 with tempfile.TemporaryDirectory() as tmpdir: local_path = os.path.join(tmpdir, "file.dill") download_file(filesystem, path, local_path) with open(local_path) as f: model = dill.load(f) return model # シリアライザのデコレータ @serializer(_deserializer) def _serializer(filesystem, value): # モデルを一時ファイルにダンプし、それを安全にアップロードします。 path = 'spacy_ner_model.dill' with tempfile.NamedTemporaryFile() as tmp: dill.dump(value, tmp) safe_upload_file(filesystem, tmp.name, path, base64_encode=True) return path # モデルクラス用のシリアライザを登録します。 register_serializer_for_class(SpacyNERModel, _serializer, force=True)
次に、適切なパッケージがすべて meta.yaml
ファイルに追加されていることを確認する必要があります。この例の場合、ユーザーのファイルのセクションは次のようになるはずです:
# あなたのパッケージを実行するために必要なパッケージ
run:
- python 3.8.* # Python 3.8.* のインストール
- spacy # spacy のインストール
- foundry_ml # foundry_ml のインストール
- dill # dill のインストール
さて、作成したばかりの2つのファイルの内容を __init__.py
にインポートしましょう。以下の手順に厳密に従う必要はありません。
Copied!1 2 3 4 5 6 7
# spacy_custom_stage.modelからSpacyNERModelをインポート from spacy_custom_stage.model import SpacyNERModel # .model_class_registryから*をインポート from .model_class_registry import * # SpacyNERModelをエクスポート __all__ = ["SpacyNERModel"]
setup.py
ファイル内のsetup()
に以下のコードを追加してください。
Copied!1 2
# entry_pointsという辞書を定義しています。キーは 'foundry_ml.plugins' で、値は ['plugin=spacy_custom_stage'] のリストです。 entry_points={'foundry_ml.plugins': ['plugin=spacy_custom_stage']}
コミット、ビルド、およびリリースをタグ付けすると、新しいモデルクラスはCode WorkbookやCode Repositoriesで利用できるようになります。
カスタムライブラリが保存および公開されたので、SpaCy モデルを作成、保存、使用することができます。このステップは、Code RepositoriesまたはCode Workbookを使用して行うことができます。以下のスクリーンショットとコードスニペットは、Code Workbookからのものです。
再度、en_core_web_sm
は事前にトレーニングされた spaCy 言語モデルであり、Conda パッケージとして Python 環境にインポートできることに注意してください。
コードを実行する前に、spacy-model-en_core_web_md および spaCy のバージョン 2.3.x をコーディング環境の依存関係に追加してください。
これで、作成した Python モデルクラスを spacy-custom-ner-stage
として Python 環境にインポートできるようになりました。Code Repositoryで開発している場合は、spacy-custom-ner-stage
をバッキングリポジトリとしても追加する必要があります。
モデルを作成するには:
Copied!1 2 3 4 5 6 7 8 9 10 11 12
import spacy from foundry_ml import Model, Stage # 新しいモデルクラスをインポートします from spacy_custom_stage import SpacyNERModel def spacy_model(): # ベクトル付きのspacyモデルを渡します model = SpacyNERModel('en_core_web_sm') return Model(Stage(model))
こちらのコードは、自然言語処理ライブラリであるSpacyのモデルを用いて、エンティティー認識(NER)のタスクを行うための関数を定義しています。 モデルを適用するには:
Copied!1 2 3 4 5 6 7 8 9 10 11 12
def model_inference(spacy_model): import pandas as pd # サンプルデータセット df = pd.DataFrame({"text": ["The White House is a white building in Washington D.C.", "Cats is a Broadway musical in New York"]}) # spacy_modelを使用して、データフレームdfを変換します。 output = spacy_model.transform(df) # 変換後のデータフレームを返します。 return output