RASA 3.0이상의 버전에서 Spacy 한국어를 사용하기 위해 Spacy 한국어 모델을 만들기로 했다.
한국어 모델을 만드는 데는 아래 블로그를 참고했다.
Chatbot Framework RASA(NLU) -1
RASA와 Spacy라이브러리의 버전 문제가 있었다.
내가 사용하는 서버는 rasa-x가 설치되지 않아 rasa를 설치했다.
(rasa) $ pip3 install -U --user pip && pip3 install rasa
rasa 설치 후 init
(rasa) $ rasa init
(rasa) $ pip install spacy
Pre-trained word vectors of 30+ languages
위의 깃헙에서 한국어 fasttext 모델을 다운로드 받아서 압축을 풀고 .vec
파일만 다시 gz로 압축했다.
아래 명령어/output부터 버전 차이로 인해서 참고한 블로그와 명령어가 다를 수 있다.
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
만들어진 모델 패키징
(rasa) 경로/ko_vec_output$ python -m spacy package /tmp/ko_vec_model/ ./
모델 패키지 빌드
cd ko_pipeline-0.0.0/
python setup.py sdist
경로/ko_pipeline-0.0.0/dist
에 tar.gz
파일 생김.
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.
잘 된 줄 알고 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
한국어 모델을 만드는 과정에서 뭔가 잘못된 거 같은데 뭘까..? :(