일본어 NLP 프로젝트 시작하기

Introduction to Japanese Natural Language Processing

정다운 | 2019년 12월 03일

핑퐁 팀은 올해 3분기에 일본어 LINE 데이터로 학습한 멀티턴 리액션 모델과 감정 분석 모델의 데모를 홈페이지를 통해 공개했습니다. 일본어 모델을 구축하는 과정에서 일본어 NLP에 필요한 지식이나 노하우를 얻을 수 있었고, 이번 포스트를 통해 이를 공유드리려고 합니다.

Table of Contents

  1. 개요
  2. 일본어 오픈 데이터
    1. Raw 코퍼스
    2. Annotated 코퍼스
  3. 일본어 NLP 오픈 소스 프로그램
    1. 토크나이저
    2. Pretrained Word Embedding
    3. Pretrained BERT
  4. 일본어 텍스트 데이터 정제하기
  5. 이 글을 마치며
  6. References

1. 개요

핑퐁 팀은 한국에서 가장 많은 일상대화 데이터를 보유하고 있습니다. 한국어 카카오톡 데이터를 약 100억 건이상 보유하고 있고, 일본어 LINE 데이터 역시 약 5억 건이상 보유하고 있습니다. 지난 2년간 주로 한국어 카카오톡 데이터를 이용하여 한국어를 깊게 이해하는 모델을 만들면서, 일상대화 데이터를 이용하여 일상대화 인공지능을 구현할 수 있다는 가능성을 확인할 수 있었습니다. 핑퐁 팀은 그 다음 단계로 일본어 LINE 데이터를 이용하여 일본어를 깊게 이해하는 모델을 학습시켜보았고, 일정 수준 이상의 성능을 기록할 수 있었습니다. 이 모델들 중 멀티턴 리액션 모델과 감정 분석 모델은 핑퐁팀 홈페이지를 통해 확인하실 수 있습니다.

일본어 프로젝트를 진행하면서 일본어 NLP를 자세히 다룬 한국어 자료가 마땅히 없어 어려움을 겪은 적이 있기 때문에, 저희처럼 연구나 업무 혹은 취미로 일본어 NLP 프로젝트를 시작하려고 하시는 분들이 저희와 똑같은 어려움을 겪을 수 있다고 생각합니다. 따라서, 핑퐁팀이 일본어 프로젝트를 진행하면서 얻은 정보와 노하우를 공유하고자 합니다. 이번 포스트에서는 웹에서 얻을 수 있는 일본어 오픈 데이터, 일본어 오픈 소스 프로그램, 그리고 간단한 일본어 데이터 정제 방법 등에 대해 설명드리겠습니다.

2. 일본어 오픈 데이터

아마도 일본어 NLP를 시작하려는 분들이 겪는 가장 큰 난관은 일본어 데이터를 수집하는 일입니다. 자체 데이터를 보유하고 있다면 참 좋지만, 그렇지 않다면 웹에 공개되어 있는 다양한 오픈 데이터를 이용하는 것이 대안이 될 수 있습니다. 이번 챕터에서는 오픈 데이터로 공개되어 있는 각종 일본어 데이터를 레이블이 없는 Raw Corpus, 레이블이 부여되어 있는 Annotated Corpus로 나누어 소개해드리겠습니다.

단, 오픈 데이터셋은 라이센스에 따라 용도가 제한될 수 있기 때문에 이를 꼭 확인하신 후 목적에 맞게 사용하시길 바랍니다.

2-1. Raw 코퍼스

  1. 일본어 Wikipedia
    • 대용량 텍스트 코퍼스하면 가장 먼저 떠오르는 게 아마 위키피디아라고 생각합니다. 일본어 위키피디아를 통해서 다양한 도메인의 문서로부터 대량의 일본어 데이터를 수집할 수 있습니다. XML 형식의 위키 덤프 파일에서 정제된 텍스트만을 추출하는 툴인 WikiExtractor도 공개되어 있습니다.
  2. 청공문고 (青空文庫)
    • 일본의 전자 도서관 사이트인 青空文庫에는 저작권이 소실된 다양한 문학 작품이 공개되어 있습니다. 저자 사후 50년이 지난 메이지, 쇼와 시대 초기의 일본 문학 작품들이 대부분을 차지하고 있어 현대 일본어와는 다소 맞지 않는 작품도 있지만, 작품들이 꾸준히 업데이트되고 있고 문학 데이터를 대량으로 얻을 수 있다는 장점이 있습니다. 데이터를 일괄 다운로드하는 방법은 링크에 기재되어 있습니다.
  3. 일영(日英) 대역 코퍼스 리스트
    • 일영(日英) 기계 번역 모델 학습에 사용할 수 있는 일본어-영어의 Parallel 코퍼스 리스트입니다.
  4. Livedoor 뉴스 기사 코퍼스
    • NHK Japan에서 운영중인 livedoor 뉴스 기사 중 CC 라이센스가 적용된 기사를 수집한 코퍼스입니다. IT, 스포츠, 영화 등 총 9개의 장르로 구성되어 있습니다.
  5. NAIST 대화 코퍼스
    • 방송이나 영화 스크립트에서 추출한 일대일 대화 코퍼스로, 약 9만 건의 Query-Response 쌍으로 구성되어 있습니다. 코퍼스 사용에 대한 동의서를 작성하신 후에 다운받으실 수 있습니다.
  6. 기타
    • 최근에는 웹 상에 존재하는 대량의 문서를 웹 크롤링하여 Raw 코퍼스를 구축하기도 합니다. 일본에서는 2010년 저작권법이 개정되어 연구 개발을 위한 웹 문서 수집이 합법화되어 있기 때문에 (재배포는 금지), 이러한 방법으로 자신의 목적에 맞는 Raw 코퍼스를 수집하여 연구 개발을 하는 것도 좋은 방법입니다. 예를 들면, 인터넷 소설 투고 사이트인 소설가가 되자 (小説家になろう)에서는 각종 장르의 소설 데이터를 대량으로 수집할 수 있습니다. 위 사이트에서 수집할 수 있는 데이터는 연속된 대화체 문장으로 구성되어 있기 때문에, 일상 대화용 BERT를 사전학습하거나 대화 시스템을 만들 때 용이하게 사용할 수 있습니다. 또한, Common Crawl에서 크롤링으로 수집된 다양한 언어 코퍼스도 구할 수 있습니다.

2-2. Annotated 코퍼스

  1. 교토대학(京都大学) 텍스트 코퍼스
    • 매일신문(毎日新聞)의 기사에 형태소 및 구문 분석 정보를 추가한 코퍼스입니다. 교토대학에서 공개한 코퍼스로 4만여 문장으로 구성되어 있습니다.
  2. Twitter 평판 분석 코퍼스
    • 휴대폰 관련 트윗 약 50만 건에 대해 긍정, 부정, 중립 등의 평판 레이블이 부여된 코퍼스입니다.
  3. chABSA 코퍼스
    • 상장 기업의 유가증권보고에서 뽑은 약 2800여 건의 문장으로 구성된 코퍼스로, 각 문장의 어떤 단어(Aspect)가 극성을 갖고 있는지에 대한 정보가 포함되어 있습니다.
  4. Webis-CLS-10
    • 영어, 독일어, 프랑스어, 일본어로 작성된 아마존 제품 리뷰 Cross-Lingual Sentiment (CLS) 코퍼스입니다. 이 중 일본어 데이터는 약 1만여 건으로 구성되어 있고, 1-5점의 점수가 부여되어 있습니다.
  5. PPDB: Japanese 파라프레이즈 코퍼스
    • 일영(日英) 대역쌍 코퍼스로 학습된 일본어 패러프레이즈 코퍼스입니다. Paraphrase 확률의 역치에 따라 S부터 XL까지 다양한 크기의 데이터셋이 있습니다.
  6. 단어 유사도 코퍼스
    • Stanford Rare Word Similarity Dataset을 참고하여 구축한 일본어 단어 유사도 코퍼스입니다. 10명의 어노테이터가 크라우드 소싱을 통해 다양한 품사(동사, 형용사, 명사, 부사 등)의 단어에 0-10점 척도의 유사도 점수를 부여했습니다.
  7. Project Next NLP 잡담 대화 코퍼스
    • Project Next NLP라는 프로젝트에서 공개된 잡담 대화 코퍼스입니다. 원래는 대화의 종료 시점 (破綻)을 검출하는 태스크에 사용된 데이터셋입니다. 인간과 시스템 간의 대화 총 1,146 건으로 구성되어 있고, 어떠한 시스템 발화가 대화의 종료 시점인지 어노테이션되어 있습니다.
  8. 기타

3. 일본어 NLP 오픈소스 라이브러리

일본어 텍스트 데이터를 손에 넣었다면 이제 해야할 일은 이 데이터를 이용하여 원하는 모델을 학습시키는 일입니다. 최근 NLP 프로젝트에서는 딥러닝 모델을 이용하는 방법론을 많이 사용합니다. 문장을 토크나이징하여 numerical한 데이터로 매핑한 후, LSTM/CNN 등으로 구성된 모델을 직접 학습시키거나 Pretrained BERT와 같은 Language Representation 모델을 파인튜닝하여 간단한 분류 모델 등을 구축할 수 있습니다. 본 챕터에서는 오픈 소스로 공개되어 있는 일본어용 토크나이저와 Pretrained Word Embedding, Pretrained BERT 등을 소개해드리겠습니다.

3-1. 토크나이저

일본어는 형태론적인 관점에서 교착어이기 때문에, 의미를 갖는 가장 작은 단위인 형태소가 결합하여 단어를 구성하는 특징을 갖고 있습니다. 따라서, 일본어 텍스트 데이터를 다룰 때는 형태소 분석기 (Morphological Analyzer)로 토크나이징하는 것이 제일 첫 단계입니다. 오픈 소스로 공개되어 있는 일본어 형태소 분석기로는 Mecab, Juman++, Sudachi, KyTea 등이 있습니다.

  1. Mecab
    • Mecab은 파라미터 추정에 CRF를 이용한 형태소 분석기로, 일본 내에서 연구 및 응용 분야에서 가장 널리 쓰이고 있습니다. Mecab은 C++로 구현이 되어있으나, Python, Ruby 등의 스크립트 언어에도 바인딩이 되어 있습니다. 또한, Mecab의 해석 부분을 Java 등의 언어로 재구현한 시스템으로 Kuromoji 등도 있습니다.
  2. Juman++
    • Juman++는 교토대학에서 개발한 형태소 분석기로 RNN-LM 모델을 이용하여 Mecab보다 미지어 (未知語), 복합어 (複合語) 등에 더 잘 대응합니다.
  3. Sudachi
    • Sudachi는 WorksApplications라는 회사에서 개발한 형태소 분석기로, 현재도 꾸준히 개발이 진행되고 있는 최신 형태소 분석기라 할 수 있습니다. Sudachi는 형태소 분석 및 품사 태깅 기능뿐만 아니라, 표기 변동 (表記揺れ, 같은 단어를 다른 글자나 장단음으로 표기하는 것)의 정규화 및 다양한 분절 모드 등의 유용한 기능을 탑재하고 있습니다. Sudachi는 Java로 개발이 되어있고, Elasticsearch 등의 검색 시스템을 간단하게 연동할 수 있습니다.

형태소 분석기는 어떠한 사전을 이용하는지에 따라서도 성능이 크게 달라집니다. 일반적으로 사용되는 사전으로는 ipadic, UniDic, JUMAN 등이 있고, NEologd와 같은 신조어 사전을 추가로 붙여서 이용하기도 합니다. 각 사전들에 대해 간단히 설명을 드리자면,

또한, 형태소 분석기 이외에도 최근에는 Neural Approach에 적합한 Subword 방식의 토크나이저가 Sentencepiece, subword-NMT, FastBPE 등 다양하게 공개되어 있습니다.

각 토크나이저별 분절 결과

토크나이저는 어떠한 사전을 쓰느냐, 어떤 프로그램을 쓰냐에 따라 동일한 문장에 대해서도 서로 다른 토크나이징 결과를 얻을 수 있기 때문에, 특정 토크나이저가 모든 상황 최적이라고 말할 수는 없습니다. 따라서, 토크나이저를 선택할 때는 열거한 토크나이저들 중 자신의 목적에 맞는 토크나이저를 사용하시는 것을 추천드립니다. 다만, 무엇을 쓸 지 모르시겠다면 우선 Mecab에 ipadic(+ NEologd) 사전을 사용한 형태소 분석기나, 뉴럴 모델을 사용할 경우는 SentencePiece를 직접 학습하여 사용하시는 것을 추천드립니다.

3-2. Pretrained Word Embedding

단어 임베딩은 단어를 실수 벡터로 표현하는 방법으로 컴퓨터가 단어를 이해하는 방법입니다. 즉, 모든 신경망 기반 NLP는 임베딩이 기초가 되며, 따라서 임베딩을 얼마나 잘 만드느냐가 모델의 성능을 결정한다고 봐도 무방합니다. 그렇지만 대용량의 데이터로 양질의 임베딩을 만드는 것은 시간이 많이 소모되는 어려운 일입니다. 다행히도 몇몇 연구진들은 미리 훈련시킨 임베딩 (Pre-trained Embedding)을 공개하고 있습니다.

일본어 Pretrained Word Embedding은 링크에서 두 종류를 다운받으실 수 있습니다. 또한, WikiEntVec에도 다양한 차원으로 학습된 Word Embedding이 공개되어 있습니다.

위에서 언급한 Pretrained Word Embedding 중 하나인 위키피디아로 학습한 Word2Vec을 이용해서 ‘한국(韓国)’ 단어와의 유사 단어를 검색해보면, 아래와 같이 한국과 유사한 단어들이 검색되는 것을 알 수 있습니다.

from gensim.models import Word2Vec
model=Word2Vec.load('latest-ja-word2vec-gensim-model/word2vec.gensim.model')
print(model.wv.most_similar('韓国',topn=5))
# [('台湾', 0.8134558200836182), ('北朝鮮', 0.7767665982246399), ('韓国内', 0.7516593337059021), ('インドネシア', 0.7428574562072754), ('韓国国内', 0.7187182307243347)]

3-3. Pretrained BERT

최근 NLP 연구에서는 사전 학습된 BERT를 특정 태스크에 대해 파인튜닝하는 방식이 많이 제안되고 있으며, 좋은 성능을 얻고 있습니다. 하지만 BERT를 사전학습하는 데에는 많은 양의 사전학습용 데이터와 계산 리소스가 필요합니다. 따라서, 웹에 공개되어 있는 Pretrained BERT를 가져와 자신이 원하는 태스크에 맞게 파인튜닝하는 것도 좋은 방법입니다. 여기에서는 오픈 소스로 공개되어 있는 일본어 Pretrained BERT를 소개해드리겠습니다. 각 모델들은 사전학습용으로 쓰인 데이터나 토크나이저가 다르기 때문에, 목적에 맞게 선택하여 사용하시는 것을 추천드립니다.

  1. Wikipedia / SentencePiece
    • 사전 학습용 데이터로 일본어 위키피디아 덤프 파일을 이용하고, 토크나이저로는 직접 학습한 SentencePiece를 이용한 모델입니다.
  2. 뉴스 기사 / Mecab
    • 사전 학습용 데이터로 약 300만 건의 일본어 비지니스 뉴스 기사를 이용하고, 토크나이저로는 Mecab (+ NEologd)를 이용한 모델입니다.
  3. Wikipedia / Juman++ + subword-NMT
    • 사전 학습용 데이터로 일본어 위키피디아 덤프 파일을 이용하고, 토크나이저로는 Juman++와 subword-NMT를 함께 사용한 모델입니다. 형태소 분석기로 일차적인 분절을 한 뒤, 서브워드 단위로 한 번 더 분절한다는 점에서 BERT 원논문의 토크나이징 방식과 동일한 방식을 따르고 있습니다. 또한, 사전 학습 태스크 중 하나인 Masked LM 태스크를 Whole Word Masking 형태로 변형하여 다운스트림 태스크의 성능을 향상시킨 모델도 공개하고 있습니다.
  4. Twitter / SentencePiece
    • 사전 학습용 데이터로 약 8,600만 건의 일본어 트위터 기사를 이용하고, 토크나이저로는 직접 학습한 SentencePiece를 이용한 모델입니다. 간단한 모델 사용 동의서를 작성한 후에 연구 목적으로 사용할 수 있습니다.

1., 2., 3. 모델의 성능을 비교한 논문도 공개되어 있으니, 어떤 모델을 선택할지 고민이 될 때 참고하시길 바랍니다.

4. 일본어 텍스트 데이터 정제하기

문자열(string)은 텍스트를 처리하는 데에 있어서 가장 기본적인 데이터 구조이고, 많은 프로그래밍 언어에서 표준으로 제공하고 있습니다. 하지만, 내부적으로 문자열의 각 문자를 표현하는 방식은 프로그래밍 언어나 운영 체제에 따라 다를 수 있습니다. 또한, 다양한 소스에서 수집한 일본어 텍스트 데이터는 문자 코드 및 일본어 텍스트의 형태가 제각각이기 때문에, NLP 프로젝트를 진행하기에 앞서 일관된 처리 방식을 정할 필요가 있습니다. 문자 코드는 컴퓨터 시스템상에서 각 문자에 할당된 수치를 말합니다. 인코딩 문자 집합 (CCS)은 문자 집합을 정의하고, 그 집합에 속하는 문자들에 특정 수치를 부여하는 규칙을 말합니다. 이를테면, ASCII 코드에서 ‘a’에 97번이 대응되는 것 등을 말합니다. 대표적인 부호화된 문자 집합으로는 ASCII, Unicode, JIS 등이 있습니다. 문자 인코딩 방식 (CES)은 문자 인코딩 형태로 변환된 코드 포인트 (CEF)를, 8비트 형태의 옥텟으로 변환하는 방법을 의미합니다. 이를테면, Unicode의 문자 인코딩 방식인 UTF-8 등을 말합니다. 여기서는 Unicode로 표현된 일본어 텍스트를 UTF-8로 인코딩하여 정제하는 방법을 간략하게 설명합니다.

우선, 다양한 소스에서 수집된 일본어 텍스트 데이터의 문자 코드를 UTF-8로 통일하는 과정이 필요합니다. 일본어는 Windows 환경에서 주로 Shift-JIS 등의 문자 코드로 표현되기 때문에, nkf와 같은 문자 코드 변환 프로그램을 사용하여 각 파일들의 문자 코드를 통일시켜 저장해둡니다. nkf는 brew 등을 통해 간단히 인스톨할 수 있습니다.

nkf -g sample.txt
>>> Shift-JIS

위와 같이 해당 파일의 문자 코드를 확인하고 UTF-8가 아니면 UTF-8로 변환해 줍니다.

nkf -w --overwrite sample.txt
nkf -g sample.txt
>>> UTF-8

문자 코드를 통일했다면, 통일된 형태로 일본어 문자를 정규화해야합니다. 일본어 텍스트 데이터에서는 기능적으로나 의미적으로 동일한 문자가 서로 다른 바이트열로 할당되는 경우 (특히, 전각 문자와 반각 문자의 경우)가 있습니다. 예를 들면, 아래와 같습니다.

이러한 문자들을 정규화하여 통일시키는 것이 일본어 NLP 시스템의 성능 향상에 도움이 될 수 있습니다. 유니코드에서는 NFC, NFD, NFKC, NFKD라는 총 4가지의 범용적이고 재현성이 있는 정규화 방법을 제공하고 있습니다. 이 방법들 중 일본어 NLP 시스템에서 가장 널리 쓰이는 방식은 NFKC입니다. NFKC 방식으로 정규화하는 방법은 Python에서 아래와 같이 간단히 실행할 수 있습니다.

import unicodedata

s= "ABC①㊤㌶ハンカクカナ"
print(unicodedata.normalize("NFKC", s)) 
# "ABC1上ヘクタールハンカクカナ" 가 출력

여기까지 했다면 기본적인 일본어 텍스트 데이터의 정규화는 완료되었다고 생각해도 좋습니다.

이후에는 추가적으로 자신이 갖고 있는 데이터의 도메인에 맞게 적절히 정규화를 하고, 한국어 NLP 데이터를 정제하는 과정과 동일한 루틴을 따르면 됩니다. 이를테면, 일상대화 혹은 트위터 도메인의 데이터를 사용할 때는 顔文字라고 하는 이모티콘을 제거하거나, 장음 ‘ー’가 2개 이상 연속해 있을 때 1개로 변환해주는 룰, 아래와 같은 표기 변동 (表記の揺れ)에 적절히 대응해주는 룰 등을 추가하여 성능 향상을 기대해볼 수 있습니다.

표기 변동의 예

이 글을 마치며

여기까지 일본어 NLP 프로젝트를 시작하기 위해 필요한 오픈 데이터, 오픈 소스 프로그램, 간단한 일본어 텍스트 데이터 정제 방법 등을 살펴보았습니다.

일본어는 한국어와 같은 교착어이며 유사한 어순을 사용한다는 점, 같은 한자 문화권이기 때문에 동일한 단어가 많다는 점에서 한국어와 닮은 부분이 많습니다. 그러나 한편으로는 한자/가타카나/히라가나의 세 가지 다른 표기를 사용한다는 점, 전각 문자와 반각 문자를 섞어 쓴다는 점, 맞춤법 오류나 띄어쓰기 오류가 적은 대신 한자 표기의 오류를 포함한다는 점에서 한국어와 다른 특징도 지니고 있습니다. 이러한 언어와 데이터의 특징을 이해하고 프로젝트를 시작한다면 더욱 질 좋은 일본어 코퍼스 및 일본어 모델을 구축할 수 있을 것입니다.

국내에도 다양한 이유로 일본어 NLP 프로젝트를 시작하려고 하는 분들이 계시리라 생각합니다. 이런 분들께 이번 포스트가 조금이나마 도움이 되기를 바랍니다. 여러분의 좋은 성과를 기원합니다! 앞으로 더욱 성장할 일본어 버전 핑퐁도 많은 기대 부탁드립니다 :)

References

핑퐁팀이 직접 전해주는
AI에 관한 소식을 받아보세요

능력있는 현업 개발자, 기획자, 디자이너가
지금 핑퐁팀에서 하고 있는 일, 세상에 벌어지고 있는 흥미로운 일들을 알려드립니다.