注: 以下の翻訳の正確性は検証されていません。AIPを利用して英語版の原文から機械的に翻訳されたものです。

例: spaCy 自然言語処理 (NLP)

廃止された機能

以下のドキュメントは、プラットフォームでの使用が推奨されなくなった foundry_ml ライブラリについて説明しています。代わりに palantir_models ライブラリを使用してください。foundry_ml から palantir_models フレームワークにモデルを移行する方法については、こちらの例をご覧ください。

foundry_ml ライブラリは 2025年10月31日に削除される予定です。これは、Python 3.9 の廃止予定に対応しています。

spaCy ↗ は、先進的な自然言語処理 (NLP) のための人気のあるオープンソースソフトウェアライブラリです。この例では、foundry_ml ステージレジストリに spaCy モデルを登録する方法を説明します。このコードは、spaCy のウェブサイトの spaCyのトークナイザークラスのカスタマイズ ↗ の例に従っており、固有表現認識モデルを活用しています。

前提条件

このチュートリアルは、Foundry におけるモデル統合の基本的な構成要素に基づいており、以下に精通していることを前提としています。

  1. Foundry における Python モデルの理解。
  2. foundry_ml ステージレジストリにカスタムステージを追加する方法の理解。詳細については、追加ライブラリサポートの追加 ドキュメントを参照してください。このチュートリアルは、そのドキュメントに記載されている手順の大部分を実装しています。
  3. Code RepositoriesPython 環境 を管理する方法の理解。

このチュートリアルでは、事前訓練済みの spaCy 言語モデルが著者環境にあることを前提としています。利用できない場合は、オープンソースの conda チャネルを通じてアクセスを有効にするか、プライベート conda チャネルを設定して著者環境で利用できるようにする必要があるかもしれません。ガイダンスについては、Palantir の担当者にお問い合わせください。

ステップ 1: カスタムトークナイザーとモデルクラスを定義する

データフレーム内の列 "text" を取り込み、各行にモデルを適用するモデルを作成したいと考えています。これを実現するためには、トランスフォーム関数、シリアライザ、デシリアライザを登録するラッパークラス SpacyNERModel を定義する必要があります。これらすべてのデコレート関数は、Foundry がモデルを適切にシリアライズおよび実行するために必要です。

最初のステップは、新しいタイプの "Python Library" の Code Repository を作成し、プロジェクト構造を設定することです。この例では、spacy-custom-ner-stage リポジトリを作成し、spacy_custom_stage フォルダー内に model.pymodel_class_registry.py という 2 つの Python ファイルを配置しました。以下に定義されているコードを 2 つのファイルに分ける必要はありませんが、概念的に整理するためにここではそうしています。

├── conda_recipe       # condaパッケージのレシピディレクトリ
│   └── meta.yaml      # condaパッケージのメタデータファイル
├── settings.gradle    # Gradleの設定ファイル
├── src                # ソースコードディレクトリ
│   ├── spacy_custom_stage  # カスタムSpacyモジュールのディレクトリ
│   │   ├── __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 41 42 import spacy from spacy.tokenizer import Tokenizer # カスタムトークナイザを作成 def custom_tokenizer(nlp): import re # 特殊なケースの定義 special_cases = {":)": [{"ORTH": ":)"}]} # 接頭辞、接尾辞、接中辞、URLの正規表現 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 # データフレーム上で動作するpredict関数を定義する。データフレームに"text"カラムが存在することを前提とする def predict_df(self, df): df["entities"] = df["text"].apply(self.predict) return df

ステップ 2: モデルクラスがFoundryによって検出可能であることを確認する

model_class_registry.py ファイルで、serializedeserialize、および 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 47 48 49 50 51 52 53 54 55 56 import dill import os import tempfile # import newly created model class # 新しく作成されたモデルクラスをインポート from spacy_custom_stage.model import SpacyNERModel # import Foundry python functions # 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 # Annotate a function that will wrap the model and data passed between stages. # ステージ間で渡されるモデルとデータをラップする関数にアノテーションを付ける @stage_transform() def _transform(model, df): return model.predict_df(df) # Call this to send to python Stage Registry, force=True to override any existing registered transform # これを呼び出してPython Stage Registryに送信する。force=Trueで既存の登録された変換を上書きする。 register_stage_transform_for_class(SpacyNERModel, _transform, force=True) # Deserializer decorator # デシリアライザーデコレーター @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 decorator # シリアライザーデコレーター @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  # 自然言語処理ライブラリ
    - foundry_ml  # 機械学習用のパッケージ(詳細はドキュメントを参照)
    - dill  # Pythonオブジェクトをシリアライズするためのパッケージ

次に、先ほど作成した 2 つのファイルの内容を __init__.py にインポートします。以下の正確な規則に従う必要はありません。

Copied!
1 2 3 4 5 6 7 8 9 from spacy_custom_stage.model import SpacyNERModel from .model_class_registry import * __all__ = ["SpacyNERModel"] # このコードは、`spacy_custom_stage.model` モジュールから `SpacyNERModel` クラスをインポートし、 # 現在のディレクトリ内の `model_class_registry` モジュールからすべてのクラスをインポートします。 # `__all__` リストには、このモジュールが外部に公開するクラスとして `SpacyNERModel` だけを指定しています。 # これにより、`from module import *` とした場合に `SpacyNERModel` のみがインポートされるようになります。

setup.py ファイル内の setup() に次のコードを追加してください。

Copied!
1 2 3 4 5 entry_points={'foundry_ml.plugins': ['plugin=spacy_custom_stage']} # entry_points: パッケージに含まれるエントリーポイントを指定するための辞書。 # 'foundry_ml.plugins': パッケージ内の特定のプラグインのエントリーポイントを示すキー。 # 'plugin=spacy_custom_stage': プラグインの名前と実装を指定。ここでは `spacy_custom_stage` がプラグイン名。

コミット、ビルド、およびリリースにタグを付けると、ユーザーの新しいモデルクラスは Code Workbook または Code Repositories で活用できるようになります。

ステップ 3: モデルを作成し使用する

ユーザーのカスタムライブラリが保存され公開されたら、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))

次にモデルを適用します。 area", Model: on sale through out for: today only on.",.! instead of it for text to or function: but not as for for large..... If, for for sale.

and.. on sale.. instead (.. The....

. as well as does as for of operations tool for as for in.. vs., operation vs done's: or other is vs. vs. for our vs job vs zip vs focused of, vs operation vs:

vs for..,. vs. for vs. / vs. on vs. brings

vs during vs on for the vs ease on for ease on the vs ", for or more,. on the vs foring, and's on vs. vs on vs " vs on vs on the vs on vs on vs on vs on on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs onvs vs on vs on vs onvs vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs onvs. vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs onvs on vs on vs on vs on vs vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs on vs onst vs on vs on vs on vs on vs on vs on vs on vs on vs on vs onvs vs on vs on vs on vs onvs vs vs on vs onvs on vs on vs onvs on vs onvs vs onvs vs vs onvs on vs vs onvs on vs vs onvs vs onvs vs onvs vs onvs vs onvs vs onvs on vs vs onvs on vs vs onvs on vs vs onvs on vs onvs on vs vs onvs on vs vs on was vs through vs vs on vs not a of choice is vs through not a of not through time of New through. vs on effect through of of through through of show through of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of of