두번째 사전학습 언어모델을 개발하여 공개합니다.
KorPatELECTRA(Korean Patent ELECTRA)는 특허분야 한국어 자연어처리 문제 해결 및 특허산업분야의 지능정보화 인프라 마련을 위해 기존 Google ELECTRA 모델의 아키텍쳐를 기반으로 대용량 국내 특허문헌(약 466만 문헌, 5.4억 문장, 445억 토큰, 130GB)을 사전학습(pre-training)하였고, 무료로 제공하고 있습니다.
2020년에 공개된 Google ELECTRA Base 모델의 아키텍쳐를 기반으로, 대량의 한국어 특허문헌 코퍼스를 사전 학습한 언어모델로, 다양한 특허 자연어처리 태스크에 활용이 가능한 모델입니다.
언어모델 학습에 사용된 특허공보 466만건을 대상으로 Soynlp 라이브러리를 이용하여 약 660만개의 명사 및 복합명사를 추출하였으며, 이를 Mecab-ko의 사용자 사전에 추가 후 WordPiece를 통하여 Subword로 분할하는 방식의 토크나이저를 사용하였습니다.
사용자 편의를 위해 Google BERT의 토크나이저 파일을 그대로 사용 가능하며 torch에서는 Huggingface의 BertWordPieceTokenizer를 사용할 수 있습니다.
ELECTRA가 BERT 보다 모든 태스크에서 높은 성능을 보였고, KorPatBERT는 특허 CPC분류에서 높은 성능을 보였습니다.
특히, KorPatELECTRA는 특허분야 학습 데이터 셋에서 가장 높은 성능 달성하였습니다.
|
프로그램명 | 버전 | 설치 안내 경로 | 필수 |
---|---|---|---|
tensorflow | 1.15.0 | https://www.tensorflow.org/install/pip?hl=ko | Y |
mecab-ko | 0.996-ko-0.0.2 | https://bitbucket.org/eunjeon/mecab-ko-dic/src/master/ | Y |
mecab-ko-dic | 2.1.1 | https://bitbucket.org/eunjeon/mecab-ko-dic/src/master/ | Y |
mecab-python | 0.996-ko-0.9.2 | https://bitbucket.org/eunjeon/mecab-ko-dic/src/master/ | Y |
python-mecab-ko | 1.0.11 이상 | https://pypi.org/project/python-mecab-ko/ | Y |
Tokenizer를 사용하기 위해서는 Mecab-ko 프로그램이 필수적으로 설치 요구되며, 제공된 특허 사용자사전이 Mecab에 추가 된다면 성능 향상에 더욱 효과적입니다.
from konlpy.tag import Mecab
import tokenizer as tokenization
tokenizer = tokenization.FullTokenizer(vocab_file="vocab.txt",do_lower_case=False)
tokenizer_vocab = tokenizer.vocab
# 샘플 문장
sentence_org = "본 고안은 주로 일회용 합성세제액을 집어넣어 밀봉하는 세제액포의 내부를 원호상으로 열중착하되 세제액이 배출되는 절단부 쪽으로 내벽을 협소하게 형성하여서 내부에 들어있는 세제액을 잘짜질 수 있도록 하는 합성세제 액포에 관한 것이다."
# 사용자 사전이 추가된 mecab-ko 형태소 분리기로 1차 분리
m = Mecab()
sentence_kipi = " ".join(m.morphs(sentence_org))
# 2차 분리
tokens = tokenizer.tokenize(sentence_kipi)
encoded_line = tokenizer.convert_tokens_to_ids(tokens)
decoded_line = tokenizer.convert_ids_to_tokens(encoded_line)
print("Length of vocab : ", len(tokenizer_vocab))
print("Input example : ", sentence_org)
print("Tokenized example : ", tokens)
print("Encoded line : ", encoded_line)
print("Decoded line : ", decoded_line)
>>> Length of vocab : 35000
>>>Input example : 본 고안은 주로 일회용 합성세제액을 집어넣어 밀봉하는 세제액포의 내부를 원호상으로 열중착하되 세제액이 배출되는 절단부 쪽으로 내벽을 협소하게 형성하여서 내부에 들어있는 세제액을 잘짜질 수 있도록 하는 합성세제 액포에 관한 것이다.
>>> Tokenized example : ['본', '고안', '은', '주로', '일회용', '합성', '##세제', '##액', '을', '집어넣', '어', '밀봉', '하', '는', '세제', '##액', '##포', '의', '내부', '를', '원호', '상', '으로', '열', '##중', '착하', '되', '세제', '##액', '이', '배출', '되', '는', '절단부', '쪽', '으로', '내벽', '을', '협소', '하', '게', '형성', '하', '여서', '내부', '에', '들', '어', '있', '는', '세제', '##액', '을', '잘', '짜', '질', '수', '있', '도록', '하', '는', '합성', '##세제', '액', '##포', '에', '관한', '것', '이', '다', '.']
>>> Encoded line : [1100, 5050, 1674, 6748, 10190, 5147, 27099, 2750, 1675, 28837, 1535, 5795, 2381, 519, 9646, 2750, 2940, 1687, 4771, 881, 9523, 1251, 4682, 1565, 2591, 20032, 618, 9646, 2750, 1692, 4977, 618, 519, 13247, 1886, 4682, 7485, 1675, 14947, 2381, 155, 4689, 2381, 7926, 4771, 1553, 657, 1535, 1703, 519, 9646, 2750, 1675, 1712, 1849, 1840, 1351, 1703, 4692, 2381, 519, 5147, 27099, 1512, 2940, 1553, 4845, 148, 1692, 542, 8]
>>> Decoded line : ['본', '고안', '은', '주로', '일회용', '합성', '##세제', '##액', '을', '집어넣', '어', '밀봉', '하', '는', '세제', '##액', '##포', '의', '내부', '를', '원호', '상', '으로', '열', '##중', '착하', '되', '세제', '##액', '이', '배출', '되', '는', '절단부', '쪽', '으로', '내벽', '을', '협소', '하', '게', '형성', '하', '여서', '내부', '에', '들', '어', '있', '는', '세제', '##액', '을', '잘', '짜', '질', '수', '있', '도록', '하', '는', '합성', '##세제', '액', '##포', '에', '관한', '것', '이', '다', '.']
Google electra에서 공개한 학습 방식과 동일하며, torch버전으로는 koelectra를 참고하세요.