🤔 전처리 과정
자연어 처리에서 가장 중요한 것은 전처리 과정이라고 할 수 있습니다.
외부로 드러나지 않는 과정이다 보니 상대적으로 주목도가 낮으며, 다루고자 하는 언어, 문제에 따라 전처리 과정이 다릅니다.
기술의 내용이 기반이 되어야 하지만 경험의 누적이 더욱 중요한 분야라고 할 수 있습니다.
일반적인 전처리 과정은 아래와 같습니다.
코퍼스(Corpus) 수집 → 정제(정규화)(Normalization) → 문장 단위 분절(Tokenizing)
→ 분절(Tokenizing) → 병렬 코퍼스 정렬 → 서브워드 분절
자연어 처리를 위한 전처리 과정에 대해 알아보도록 하겠습니다.
작성하기에 앞서 [ICT COG Academy] 인공지능 고급(언어)과정을 수강하며 복습을 위해 작성한 글임을 명시합니다.
🔎 코퍼스 (Corpus, 말뭉치)
코퍼스란 여러 단어로 이루어진 문장을 가리킵니다.
자연어 처리를 위하여 머신러닝/딥러닝을 수행하려면 훈련 데이터가 필요하며, 다수의 문장으로 구성된 코퍼스가 훈련데이터로 사용됩니다.
코퍼스가 많고 오류가 없을 수록 자연어 처리 모델은 더욱 정교해지고 정확도가 높아집니다.
코퍼스는 구성 언어와 구성 방법에 따라 분류할 수 있습니다.
구성 언어에 따른 분류
'단일 언어 코퍼스 (Monolingual Corpus)'
'이중 언어 코퍼스 (Bilingual Corpus)'
'다중 언어 코퍼스 (Multilingual Corpus)'
구성 방법에 따른 분류
병렬 코퍼스(Parallel Corpus) : 각 언어가 서로 싸으로 구성되는 코퍼스
코퍼스는 공개 데이터를 사용하거나, 유료 데이터를 구매하거나, 웹 크롤링을 통해서 수집할 수 있습니다.
🔎 정제 (Normalization, 정규화)
정제는 텍스트를 사용하기 위한 필수 과정입니다.
원하는 업무, 문제, 응용분야에 따라 필요한 정제의 수준, 깊이가 상이하기 때문에 필수적입니다.
정규 표현식을 사용한 정제에 대해서만 알아보겠습니다.
정규 표현식의 사용 방법의 예시입니다.
[ ] 사용 : [2345cde] → "2 or 3 or 4 or 5 or c or d or e" 를 의미
- 사용 : [2-5c-e] →“2 or 3 or 4 or 5 or c or d or e” 를 의미
[^]사용 : [^2-5c-e]“ → 2~5, c~e 를 제외한 한 글자 의 의미 (Not 의 의미)
( )사용 : (x)(yz) → 그룹 1:x, 그룹 2: yz 그룹을 구성할 수 있음
🔎 분절
문장 단위 분절
기준을 마침표(.)로 잡으면 U.S와 같은 약자, 3.14와 같은 소수점 등의 문제가 발생합니다.
이에 적절한 알고리즘 또는 모델이 필요합니다.
단어 단위 분절(Tokenizing)
풀고자 하는 문제에 따라 형태소 분석 또는 단순 분절을 통한 정규화를 수행합니다.
가장 기본적인 기준은 띄어쓰기입니다.
하지만 한국의 경우 아직 띄어쓰기를 제대로 사용하지 못하는 사람이 많으며 중국, 일본은 띄어쓰기를 사용하지 않습니다.
NLTK(Natural Language Toolkit)
NLTK는 자연어 처리 기능을 제공하는 파이썬 라이브러리입니다.
텍스트로부터 단어 개수, 출현 빈두, 어휘 다양도 같은 통계적인 정보를 쉽게 얻을 수 있습니다.
손쉽게 이용할 수 있는 모듈 형식으로 기능을 제공합니다.
전처리 모듈 : 분류 토큰화 (tokenization), 스테밍 (stemming) 등
분석 모듈 : 구문분석 (parsing), 클러스터링 , 감정 분석 (sentiment analysis), 태깅 (tagging) 등
추론 모듈 : 시맨틱 추론 (semantic reasoning) 등
각 모듈은 최소 2 개 이상의 알고리즘을 제공하여 사용자가 원하는 알고리즘을 선택할 수 있도록 지원합니다.
문서화가 잘 되어있으며 포럼이 활성화되어 있어 개발 지원을 받을 수 있습니다.
하지만 속도가 다소 느리며 원래 한국어를 지원하지 않았기 때문에 국내 연구자들이 KoNLTK와 같은 모듈을 개발하여 사용했습니다.
각 언어별 주요 자연어 처리 지원 패키지
🔎 병렬 코퍼스 정렬
병렬 코퍼스란 동일한 내용을 가진 복수 언어 코퍼스(말뭉치)를 말합니다.
예를 들어 한국어 원문과 영어 번역문을 문장 단위로 대응시켜 DB를 구축한 것이 있습니다.
데이터 자체가 복수 언어를 대상으로 만들기 때문에 언어의 대조 연구나 기계번역, 대역 사전구축, 언어 교육(작문 교육, 회화 교육) 등에 유용하게 사용됩니다.
대부분의 병렬 코퍼스들은 여러 문장 단위로 정렬됩니다.
단어 사전 구축에는 많은 비용이 요구됩니다.
그래서 기 구축된 사전을 활용하거나 MUSE를 이용한 단어 사전 자동 생성을 활용합니다.
MUSE는 병렬 코퍼스가 없는 상황에서 사전 구축을 위한 방법, 코드를 제공합니다.
구축된 사전은 CTK의 입력으로 사용됩니다.
MUSE (Multilingual Unsupervised and Supervised Embeddings) : Facebook 에서 개발한 다중언어 단어 임베딩을 위한 파이썬 라이브러리
CTK (Champollion Toolkit) : 가능한 한 많은 언어 쌍에 대하여 즉시 사용할 수 있는 병렬 텍스트 문장 정렬도구를 제공하는 오픈소스 툴 킷
🔎 서브워드 분절
서브우더 분절 기법은 "단어는 의미를 가진 더 작은 서브워드들의 조합으로 이루어진다"는 가정에 적용되는 알고리즘입니다.
BPE(Byte Pair Encoding)알고리즘을 기반으로 합니다.
현재 시점에서는 필수 전처리 방법으로 꼽힙니다.
서브워드를 적절하게 분절하면 어휘 수 감소 및 희소성의 효과적 감소가 가능합니다.
또한 자연어 처리에서 Unknown이 발생하면 언어모델의 확률이 크게 하락하고 적절한 문장 생성이 어려워 지는데, Unknown 토큰에 대한 효율적인 대처가 가능합니다.
참조
다음 글에서는 전처리와 관련된 실습을 진행해보겠습니다.
'AI > 자연어 처리' 카테고리의 다른 글
[AI] 자연어 처리 - 전처리와 토큰화(3) (0) | 2022.08.06 |
---|---|
[AI] 자연어 처리 - 전처리와 토큰화(2) (2) | 2022.08.05 |
[AI] 자연어 처리 - PyTorch 실습 (0) | 2022.07.30 |
[AI] 자연어 처리 - 기본지식(3) (0) | 2022.07.29 |
[AI] 자연어 처리 - 기본지식(2) (0) | 2022.07.28 |