Spacy 한국어 모델 만들기 실패담

ningning2·2021년 12월 15일
0
post-thumbnail

RASA 3.0이상의 버전에서 Spacy 한국어를 사용하기 위해 Spacy 한국어 모델을 만들기로 했다.

한국어 모델을 만드는 데는 아래 블로그를 참고했다.
Chatbot Framework RASA(NLU) -1

RASA와 Spacy라이브러리의 버전 문제가 있었다.

1. RASA 설치

가상환경에 rasa 설치

내가 사용하는 서버는 rasa-x가 설치되지 않아 rasa를 설치했다.

(rasa) $ pip3 install -U --user pip && pip3 install rasa

rasa 설치 후 init

(rasa) $ rasa init

Spacy 설치

(rasa) $ pip install spacy

2. 한국어 모델 설치

Pre-trained word vectors of 30+ languages
위의 깃헙에서 한국어 fasttext 모델을 다운로드 받아서 압축을 풀고 .vec 파일만 다시 gz로 압축했다.

아래 명령어/output부터 버전 차이로 인해서 참고한 블로그와 명령어가 다를 수 있다.

  1. ko.vec.gz가 있는 디렉토리에서 fasttext 모델을 Spacy 모델로 변환

    python -m spacy init vectors ko ko.vec.gz /tmp/ko_vec_model

    Mecab이 없을 때 에러가 발생함 - Mecab 설치해줘야 한다.

    AttributeError: 'KoreanTokenizer' object has no attribute 'mecab_tokenizer'

    natto도 설치해 주어야 함.

    pip install natto-py
  2. 만들어진 모델 패키징

    (rasa) 경로/ko_vec_output$ python -m spacy package /tmp/ko_vec_model/ ./
  3. 모델 패키지 빌드

    cd ko_pipeline-0.0.0/
    python setup.py sdist 

    경로/ko_pipeline-0.0.0/disttar.gz파일 생김.

  4. ko_model 설치

    (rasa)경로/ko_pipeline-0.0.0 $ cd dist
    (rasa)경로/ko_pipeline-0.0.0/dist $ pip install ko_pipeline-0.0.0.tar.gz

    블로그에서 link관련 명령어가 있는데 Spacy 3.0이상의 버전에서는 link 명령어 없이 쓸 수 있다고 한다.

    ⚠ As of spaCy v3.0, model symlinks are not supported anymore. 
    You can load trained pipeline packages using their full names or from a directory path.

3. 결과

잘 된 줄 알고 config.yml에서 한국어 모델로 바꿔주었다.

language: ko

pipeline:
  - name: SpacyNLP
    model: ko_pipeline
  - name: SpacyTokenizer
  - name: SpacyFeaturizer
  - name: DIETClassifier
    epochs: 1
    constrain_similarities: true

policies:
# # No configuration for policies was provided. The following default policies were used to train your model.
# # If you'd like to customize them, uncomment and adjust the policies.
# # See https://rasa.com/docs/rasa/policies for more information.
  - name: MemoizationPolicy
  - name: RulePolicy
  - name: UnexpecTEDIntentPolicy
    max_history: 5
    epochs: 100
  - name: TEDPolicy
    max_history: 5
    epochs: 100
    constrain_similarities: true

Policies는 일단 기본 주석 처리되어 있던 것들을 주석 해제시켰으며 data/nlu.yml에서 examples만 한국어 예제로 바꿔주었다.

이후 rasa train 도중에

anaconda3/envs/rasa/lib/python3.7/site-packages/spacy/lang/ko/__init__.py", line 50, in __call__
    token.pos = TAG_MAP[token.tag_][POS]
KeyError: 'UNKNOWN'

토크나이징이 제대로 되지 않아 실패했다.

반면에 다음과 같이 config.yml을 작성한 영어 모델은 성공했다.

language: en

pipeline:
  - name: SpacyNLP
    model: en_core_web_md
  - name: SpacyTokenizer
  - name: SpacyFeaturizer
  - name: DIETClassifier
    epochs: 1
    constrain_similarities: true
policies:
# # No configuration for policies was provided. The following default policies were used to train your model.
# # If you'd like to customize them, uncomment and adjust the policies.
# # See https://rasa.com/docs/rasa/policies for more information.
  - name: MemoizationPolicy
  - name: RulePolicy
  - name: UnexpecTEDIntentPolicy
    max_history: 5
    epochs: 100
  - name: TEDPolicy
    max_history: 5
    epochs: 100
    constrain_similarities: true

한국어 모델을 만드는 과정에서 뭔가 잘못된 거 같은데 뭘까..? :(

profile
NLP와 게임에 관심이 있어요! na2na8.github.io에서 글 작성 합니다

0개의 댓글