본 번역은 검증되지 않았습니다. AIP를 통해 영문원문으로부터 번역되었습니다.

예제: spaCy NLP

사용 중지된 기능

아래 문서는 플랫폼에서 더 이상 사용이 권장되지 않는 foundry_ml 라이브러리를 설명합니다. 대신 palantir_models 라이브러리를 사용하세요.

foundry_ml 라이브러리는 2025년 10월 31일에 제거될 예정으로, Python 3.9의 예정된 폐기와 일치합니다.

spaCy는 고급 자연어 처리(NLP)를 위한 인기 있는 오픈소스 소프트웨어 라이브러리입니다. 이 예제는 foundry_ml 스테이지 레지스트리에 spaCy 모델을 등록하는 과정을 안내합니다. 이 코드는 spaCy 웹사이트의 Customizing spaCy’s Tokenizer class 예제를 따르며, 기명 개체 인식 모델을 활용합니다.

사전 요구사항

이 튜토리얼은 Foundry의 모델 통합의 기본 구성 요소를 기반으로 하며, 다음 사항에 익숙하다고 가정합니다:

  1. Foundry에서의 파이썬 모델에 대한 이해.
  2. foundry_ml 스테이지 레지스트리에 사용자 정의 스테이지를 추가하는 방법에 대한 이해. 추가 라이브러리 지원 추가 문서를 참조하세요. 이 튜토리얼은 해당 문서에서 자세히 설명한 대부분의 단계를 구현합니다.
  3. Code Repositories파이썬 환경을 관리하는 방법에 대한 이해.

이 튜토리얼은 사전 학습된 spaCy 언어 모델이 작성 환경에서 사용 가능하다고 가정합니다. 사용 가능하지 않은 경우 오픈소스 콘다 채널을 통해 접근을 허용하거나 개인 콘다 채널을 설정하여 작성 환경에서 사용할 수 있게 할 수 있습니다. 팔란티어 담당자에게 문의하십시오.

단계 1: 사용자 정의 토크나이저 및 모델 클래스 정의

데이터프레임의 "text" 열에 모델을 적용하는 모델을 생성하려고 합니다. 이를 위해 변환 함수, 직렬화기, 역직렬화기를 등록하는 래퍼 클래스인 SpacyNERModel을 정의해야 합니다. 이 모든 장식된 함수들은 Foundry가 모델을 올바르게 직렬화하고 실행할 수 있도록 필요합니다.

가장 먼저 "파이썬 라이브러리" 유형의 새로운 Code Repositories를 생성하고 프로젝트 구조를 설정합니다. 이 예제에서는 spacy-custom-ner-stage 리포지토리를 생성하고 spacy_custom_stage 폴더에 두 개의 파이썬 파일인 model.pymodel_class_registry.py를 추가합니다. 아래에 정의된 코드를 두 파일로 분리할 필요는 없지만, 여기서는 개념적으로 더 깔끔한 구분을 제공하기 위해 이렇게 했습니다.

├── conda_recipe  # conda 패키지 생성을 위한 레시피 폴더
│   └── meta.yaml  # 패키지 메타데이터를 정의하는 yaml 파일
├── settings.gradle  # 프로젝트 설정을 정의하는 gradle 파일
├── src  # 소스 코드 폴더
│   ├──spacy_custom_stage  # spacy에 대한 사용자 정의 단계 코드가 있는 폴더
│   │   ├── __init__.py  # 패키지 초기화 파일
│   │   └── model.py  # 모델 정의 파일
│   │   └── model_class_registry.py  # 모델 클래스 등록 파일
│   ├── setup.cfg  # 프로젝트 설정을 담고 있는 설정 파일
│   └── setup.py  # 패키지 설치 스크립트
└── README.md  # 프로젝트에 대한 설명이 담긴 readme 파일

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 43 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'''[-~]''') # 간단한 URL 정규식 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

2단계: Foundry에서 모델 클래스를 찾을 수 있도록 확인하기

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 import dill import os import tempfile # 새로 생성된 모델 클래스를 불러옴 from spacy_custom_stage.model import SpacyNERModel # Foundry 파이썬 함수를 불러옴 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) # 이것을 호출하여 파이썬 스테이지 레지스트리에 전송하고, 기존 등록된 변환을 무시하려면 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 # 클래스에 시리얼라이저를 등록하려면 force=True를 사용하여 기존 등록된 시리얼라이저를 무시 register_serializer_for_class(SpacyNERModel, _serializer, force=True)

다음으로, 모든 적절한 패키지가 meta.yaml 파일에 추가되었는지 확인해야 합니다. 이 예제의 경우, 파일의 해당 섹션은 다음과 비슷하게 보일 것입니다:

  # 패키지를 실행하기 위해 필요한 패키지들
  run:
    - python 3.8.* # 파이썬 3.8 버전
    - spacy # 스페이시 패키지
    - foundry_ml # Foundry ML 패키지
    - dill # 딜 패키지

이제 우리가 방금 생성한 두 파일의 내용을 __init__.py에 가져옵니다. 아래의 정확한 규칙을 따를 필요는 없습니다.

Copied!
1 2 3 4 5 6 7 8 # spacy_custom_stage.model로 부터 SpacyNERModel을 임포트합니다. from spacy_custom_stage.model import SpacyNERModel # 현재 디렉토리의 model_class_registry를 임포트합니다. from .model_class_registry import * # 이 모듈에서 import 될 수 있는 모듈들을 정의합니다. __all__ = ["SpacyNERModel"]

다음 코드를 setup.py 파일의 setup() 안에 추가하십시오.

Copied!
1 2 3 # 한국어 주석 # entry_points는 플러그인에 대한 정보를 담고 있습니다. entry_points={'foundry_ml.plugins': ['plugin=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 Repositories에서 개발 중이라면, 백킹 저장소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))

이제 모델을 적용합니다:

Copied!
1 2 3 4 5 6 7 8 9 10 11 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 모델을 사용하여 데이터 프레임 변환 output = spacy_model.transform(df) return output