개체명 인식 앱 만들기
개체명 인식 앱 만들기
이 가이드는 Docker를 사용해 개체명 인식(NER) 모델을 컨테이너화하는 방법을 설명해요.
출처: 문서
본문
개요
이 가이드는 개체명 인식(NER) 어플리케이션을 만들고 실행하는 과정을 안내해요. Python과 spaCy 로 어플리케이션을 만든 다음 Docker로 환경을 설정하고 어플리케이션을 실행할 거예요.
이 어플리케이션은 입력 텍스트를 처리해 사람, 조직, 위치 같은 개체명을 식별하고 출력해요.
사전 요구사항
- 최신 버전의 Docker Desktop 을 설치했어야 해요. Docker는 정기적으로 새 기능을 추가하므로 이 가이드의 일부 부분은 최신 버전의 Docker Desktop에서만 작동할 수 있어요.
- Git 클라이언트 가 있어야 해요. 이 섹션의 예제는 명령줄 기반 Git 클라이언트를 사용하지만, 어떤 클라이언트든 사용할 수 있어요.
샘플 어플리케이션 가져오기
터미널을 열고 다음 명령으로 샘플 어플리케이션의 리포지토리를 클론해주세요.
$ git clone https://github.com/harsh4870/Docker-NLP.git
리포지토리를 클론했는지 확인해주세요.
Docker-NLP 디렉터리에 다음 파일이 보여야 해요.
01_sentiment_analysis.py
02_name_entity_recognition.py
03_text_classification.py
04_text_summarization.py
05_language_translation.py
entrypoint.sh
requirements.txt
Dockerfile
README.md
어플리케이션 코드 탐구
이름 인식 어플리케이션의 소스 코드는 Docker-NLP/02_name_entity_recognition.py 파일에 있어요. 텍스트 또는 코드 편집기에서 02_name_entity_recognition.py 를 열어 다음 단계로 내용을 탐구하세요.
필요한 라이브러리 가져오기
import spacy
이 줄은 spaCy 라이브러리를 가져와요. spaCy 는 자연어 처리(NLP)에 사용되는 인기 있는 Python 라이브러리예요.
언어 모델 로드
nlp = spacy.load("en_core_web_sm")
여기서 spacy.load 함수가 언어 모델을 로드해요. en_core_web_sm 모델은 소형 영어 모델이에요. 토큰화, 품사 태깅, 개체명 인식을 포함한 다양한 NLP 작업에 이 모델을 사용할 수 있어요.
메인 실행 블록 지정
if __name__ == "__main__":
이 Python 관용구는 이 스크립트가 메인 프로그램일 때만 다음 코드 블록이 실행되게 보장해요. 스크립트가 독립형 프로그램이자 가져온 모듈로 기능할 수 있게 유연성을 제공해요.
연속 입력을 위한 무한 루프 만들기
while True:
이 while 루프는 명시적으로 중단될 때까지 무한히 실행돼요. 사용자가 종료를 결정할 때까지 개체 인식을 위해 텍스트를 계속 입력할 수 있게 해줘요.
사용자 입력 받기
input_text = input("Enter the text for entity recognition (type 'exit' to end): ")
이 줄은 사용자에게 텍스트를 입력하라고 요청해요. 프로그램은 이 텍스트에 대해 개체 인식을 수행할 거예요.
종료 조건 정의
if input_text.lower() == 'exit':
print("Exiting...")
break
사용자가 무언가 입력하면 프로그램은 입력을 소문자로 변환해 exit 와 비교해요. 일치하면 Exiting... 을 출력하고 while 루프에서 빠져나와 프로그램을 효과적으로 종료해요.
개체명 인식 수행
doc = nlp(input_text)
for ent in doc.ents:
print(f"Entity: {ent.text}, Type: {ent.label_}")
- doc = nlp(input_text) : nlp 모델이 사용자 입력 텍스트를 처리해요. 이렇게 하면 식별된 개체를 포함한 다양한 NLP 속성을 담는 Doc 객체가 생성돼요.
- for ent in doc.ents: : 텍스트에서 찾은 개체를 반복해요.
- print(f"Entity: {ent.text}, Type: {ent.label_}") : 각 개체에 대해 개체 텍스트와 유형( PERSON , ORG , GPE 같은)을 출력해요.
requirements.txt 만들기
샘플 어플리케이션에는 어플리케이션이 가져오는 필요한 패키지를 지정하는 requirements.txt 파일이 이미 포함되어 있어요. 코드 또는 텍스트 편집기에서 requirements.txt 를 열어 내용을 탐구하세요.
# 02 named_entity_recognition
spacy==3.7.2
...
이름 인식 어플리케이션에는 spacy 패키지만 필요해요.
어플리케이션 환경 탐구
Docker로 컨테이너에서 어플리케이션을 실행할 거예요. Docker는 어플리케이션을 컨테이너화해 일관되고 격리된 실행 환경을 제공해요. 즉 어플리케이션이 기본 시스템 차이와 무관하게 Docker 컨테이너 안에서 의도한 대로 동작한다는 뜻이에요.
컨테이너에서 어플리케이션을 실행하려면 Dockerfile이 필요해요. Dockerfile은 이미지를 조립하기 위해 명령줄에서 호출할 모든 명령을 담은 텍스트 문서예요. 이미지는 Docker 컨테이너를 만들기 위한 지침이 있는 읽기 전용 템플릿이에요.
샘플 어플리케이션에는 Dockerfile 이 이미 포함되어 있어요. 코드 또는 텍스트 편집기에서 Dockerfile 을 열어 내용을 탐구하세요. 다음 단계가 Dockerfile 의 각 부분을 설명해요. 자세한 내용은 Dockerfile 참조 를 참고하세요.
베이스 이미지 지정
FROM python:3.8-slim
이 명령이 빌드의 기초를 설정해요. python:3.8-slim 은 크기와 속도에 최적화된 Python 3.8 이미지의 경량 버전이에요. 이 slim 이미지를 사용하면 전체 Docker 이미지 크기가 줄어 더 빠른 다운로드와 더 적은 보안 취약점 노출면을 가능하게 해요.
작업 디렉터리 설정
WORKDIR /app
WORKDIR 은 Docker 이미지 안의 현재 작업 디렉터리를 설정해요. 이를 /app 으로 설정하면 Dockerfile 의 모든 후속 명령( COPY 와 RUN 같은)이 이 디렉터리에서 실행되게 보장해요. 모든 어플리케이션 관련 파일이 특정 디렉터리에 포함되므로 Docker 이미지를 구성하는 데도 도움이 돼요.
요구사항 파일을 이미지로 복사
COPY requirements.txt /app
COPY 명령은 requirements.txt 파일을 내 로컬 머신에서 Docker 이미지로 전송해요. 이 파일은 어플리케이션이 필요한 모든 Python 의존성을 나열해요. 컨테이너로 복사하면 다음 명령( RUN pip install )이 이미지 환경 안에서 이러한 의존성을 설치할 수 있게 해줘요.
이미지에 Python 의존성 설치
RUN pip install --no-cache-dir -r requirements.txt
이 줄은 pip 를 사용해 requirements.txt 에 나열된 패키지를 설치해요. --no-cache-dir 옵션은 캐시를 비활성화해 이미지 크기를 줄여요.
추가 명령 실행
RUN python -m spacy download en_core_web_sm
이 단계는 spaCy 라이브러리가 필요한 NLP 어플리케이션에 특화돼 있어요. spaCy용 소형 영어 모델인 en_core_web_sm 모델을 다운로드해요.
어플리케이션 코드를 이미지로 복사
COPY *.py /app
COPY entrypoint.sh /app
이 명령들은 Python 스크립트와 entrypoint.sh 스크립트를 이미지의 /app 디렉터리로 복사해요. 컨테이너가 어플리케이션을 실행하려면 이 스크립트가 필요하므로 이는 중요해요. entrypoint.sh 스크립트는 컨테이너 안에서 어플리케이션이 어떻게 시작되는지를 결정하기 때문에 특히 중요해요.
entrypoint.sh 스크립트에 권한 설정
RUN chmod +x /app/entrypoint.sh
이 명령은 entrypoint.sh 의 파일 권한을 수정해 실행 가능하게 만들어요. Docker 컨테이너가 이 스크립트를 실행해 어플리케이션을 시작할 수 있게 하려면 이 단계가 필요해요.
엔트리 포인트 설정
ENTRYPOINT ["/app/entrypoint.sh"]
ENTRYPOINT 지시문은 컨테이너가 entrypoint.sh 를 기본 실행 파일로 실행하도록 구성해요. 즉 컨테이너가 시작되면 자동으로 스크립트를 실행해요.
코드 또는 텍스트 편집기에서 열어 entrypoint.sh 스크립트를 탐구할 수 있어요. 샘플이 여러 어플리케이션을 포함하므로 스크립트는 컨테이너가 시작될 때 어떤 어플리케이션을 실행할지 지정할 수 있게 해줘요.
어플리케이션 실행하기
Docker로 어플리케이션을 실행하려면:
이미지 빌드
터미널에서 Dockerfile 이 있는 디렉터리 안에서 다음 명령을 실행해주세요.
$ docker build -t basic-nlp .
이 명령의 분석:
- docker build : Dockerfile과 컨텍스트에서 Docker 이미지를 빌드하는 기본 명령. 컨텍스트는 보통 지정된 위치의 파일 집합이며, 흔히 Dockerfile이 포함된 디렉터리예요.
- -t basic-nlp : 이미지에 태그를 다는 옵션. -t 플래그는 태그를 의미해요. 이미지에 이름을 할당하며, 이 경우 basic-nlp 예요.
- . : 마침표( . )는 현재 디렉터리를 의미해요. Docker는 이 디렉터리에서 Dockerfile을 찾을 거예요. 빌드 컨텍스트(이 경우 현재 디렉터리)가 Docker 데몬으로 전송돼요.
자세한 내용은 docker build CLI 참조 를 참고하세요.
Docker는 이미지를 빌드하면서 여러 로그를 콘솔에 출력해요. 의존성을 다운로드하고 설치하는 것을 볼 수 있을 거예요. 네트워크 연결에 따라 몇 분이 걸릴 수 있어요. Docker에는 캐싱 기능이 있어 후속 빌드는 더 빨라질 수 있어요.
이미지를 컨테이너로 실행
터미널에서 다음 명령을 실행해주세요.
$ docker run -it basic-nlp 02_name_entity_recognition.py
이 명령의 분석:
- docker run : Docker 이미지에서 새 컨테이너를 실행하는 기본 명령.
- -it : 두 옵션의 결합.
- -i 또는 --interactive : 연결되지 않아도 표준 입력(STDIN)을 열어 유지해요.
- -t 또는 --tty : 의사 터미널을 할당해 터미널을 시뮬레이션해요.
- basic-nlp : 사용할 Docker 이미지의 이름.
- 02_name_entity_recognition.py : Docker 컨테이너 안에서 실행하려는 스크립트. entrypoint.sh 에 전달되어 실행돼요.
자세한 내용은 docker run CLI 참조 를 참고하세요.
참고: Windows 사용자는 컨테이너를 실행할 때 오류가 발생할 수 있어요. entrypoint.sh 의 줄 끝이 CRLF( \r\n )가 아닌 LF( \n )인지 확인한 후 이미지를 재빌드하세요. 자세한 내용은 예상치 못한 구문 오류 피하기, 컨테이너 파일에는 Unix 스타일 줄 끝 사용 을 참고하세요.
컨테이너가 시작된 후 콘솔에 다음이 보일 거예요.
Enter the text for entity recognition (type 'exit' to end):
어플리케이션 테스트
개체명 인식을 받으려면 정보를 입력하세요.
Enter the text for entity recognition (type 'exit' to end): Apple Inc. is planning to open a new store in San Francisco. Tim Cook is the CEO of Apple.
Entity: Apple Inc., Type: ORG
Entity: San Francisco, Type: GPE
Entity: Tim Cook, Type: PERSON
Entity: Apple, Type: ORG
요약
이 가이드는 개체명 인식 어플리케이션을 만들고 실행하는 방법을 보여줬어요. Python과 spaCy로 어플리케이션을 만들고 Docker로 환경을 설정하고 실행하는 방법을 배웠어요.
관련 정보:
- Docker CLI 참조
- Dockerfile 참조
- spaCy
- Python 문서
다음 단계
더 많은 자연어 처리 가이드 를 탐구해보세요.
더 알아보기 (Learn more)
- Docker CLI 참조
- Dockerfile 참조
- spaCy