본문 바로가기
닐라의 학습로그/데이터분석 학습로그

[NLP] 텍스트 전처리 (Text Preprocessing)

by 친절한 닐라 2021. 6. 11.

안녕하세요! 

지난 포스팅에서 자연어 처리의 4단계에 대해 다루었는데요, (관련 내용은 아래의 포스팅을 참고하시면 됩니다.)

 

[NLP] 자연어 분석의 4단계 및 기계학습에의 적용 방식

본 포스팅에서는 자연어 처리에 앞서 자연어 처리의 개념과 그 분석 단계, 및 기계 학습에의 적용 방식에 대해 설명하였습니다. 자연어 처리는 인공지능 분야로부터 파생된 영역으로, 인공지능

marketingscribbler.tistory.com

오늘은 자연어 처리 기법이 잘 적용될 수 있도록, 용도에 맞게 텍스트를 사전에 처리하는 텍스트 전처리에 대해 다루도록 하겠습니다.

 

목차

     

    일단 텍스트에 대한 전처리는 크게 텍스트를 토큰으로 나누는 과정불필요한 토큰을 제거하는 과정, 그리고 그 이후에 코딩을 좀 더 편하게 하기 위한 원-핫 인코딩 등의 처리로 나눌 수 있습니다.

     

    그 중 텍스트를 토큰으로 나누는 과정부터 하나씩 살펴보도록 하겠습니다!

     

    텍스트를 토큰으로 나누기

    Tokenization (토큰화)

    Sentence Tokenization

    텍스트를 토큰으로 나누기 위해서는 일단 하나의 문서를 문단 단위 또는 문장 단위로 구분하고, 그 다음 토큰(형태소) 단위로 구분해야 합니다.

    따라서 토큰화 작업에는 문장 분리 작업이 선행되어야 합니다.

    문장 분리 작업은 가지고 있는 말뭉치 내에서 문장 단위로 구분하는 작업으로 Sentence Tokenization, Sentence Splitting, Sentence Segmentation, Sentence Detection 등 여러 명칭으로 불립니다.

     

    문장을 분리하는 데에는 여러 가지 기준이 있습니다.

     

    그 중 주로 문장부호(Punctuation)가 문장의 경계를 판단하기 위해 사용됩니다.

    단, 문장부호를 기준으로 문장의 경계를 판단할 때는 주의할 점이 있습니다.

     

    바로, 모든 문장부호가 문장의 끝을 나타내는 것은 아니며, 문장부호를 사용하지 않고 문장이 끝나는 경우도 존재한다는 것입니다.

    예를 들어, 약어나 IP주소, Web URL 등에서 마침표가 문장을 끝내는 용도로 사용되지 않을 수 있으며 SNS의 경우 마침표를 사용하지 않고 문장을 끝마치는 경우가 많습니다.

     

    문장의 끝으로 사용되지 않는 마침표(.)가 있는 문장의 예시

     

    전자의 문제를 해결하기 위해서 ".", "?", "!"와 같은 문장 부호가 문장의 끝에 쓰인 것인지 기계학습 혹은 규칙 기반으로 분류해야 합니다.

    앞 뒤 글자를 중심으로 문장을 분리할지 여부를 결정

    이를 위해 앞/뒤글자(prefix/suffix)나 토큰이 무엇인지 확인하여 문맥상으로 문장의 boundary 여부를 판단하며, 앞 뒤 문맥을 더 넓게 판단한다고 해서 정확도가 유의미하게 높아지지는 않기 때문에 보통 앞 뒤 두 토큰 정도만 확인합니다.

     

     

    • Punctuation is usually used to define sentence boundaries.
      • Not all the punctuation characters end a sentence.
      • information on the token containing the potential boundary.
      • features of the word on the left(right) of the candidate (left and right contexts)
        • wider contexts do not increase significantly the classifier accuracy

     

    Word Tokenization

    문장 분리가 이루어진 후 의미 있는 최소 단위(토큰)로 주어진 텍스트를 쪼개는 과정인 Word Tokenization을 수행하게 됩니다.

     

    토큰으로 나누는 데에는 여러 가지 기준이 존재합니다.

    예를 들어, 공백을 기준으로 나누거나(어절 단위), 구두점을 별도로 분류하여 나눌 수 있습니다.

     

    한국어에서 의미를 가지는 최소 단위형태소이므로, 한국어의 경우 어절 단위가 아닌 형태소 단위의 토큰화가 바람직합니다.

     

    여러 Tokenizer를 사용해본 후 원하는 결과에 따라 알맞은 Tokenizer를 사용하시면 됩니다.

    영어에서는 주로 nltk라는 Tokenizer가, 한국어에서는 아래에서 다룰 Tokenizer가 많이 사용됩니다.

     

    POS(Part-of-Speech) Tagging

    POS 태깅이란 나눠진 토큰에 품사를 태깅하는 것을 말합니다

    한글의 경우 주로 한글 자연어 처리 라이브러리인 KonlPy에 있는 형태소 분석기들을 사용하여 품사 태깅을 진행합니다.

    형태소 분석기의 리스트와 각각의 특징은 아래와 같습니다.

    형태소 분석기 특징
    Hannanum Class - 사전/차트 기반
    - 전처리, 형태소분석, 품사태깅 실행 가능
    Kkma Class - 사전/차트 기반
    - 형태소 분석, 색인어 추출 실행 가능
    Komoran Class  
    Mecab Class - 사전 기반
    - 띄어 쓰기 오류를 교정하여 형태소 분석
    - 명사 추출, 복합명사 분해, 어절 추출 실행 가능
    Twitter(OKT) Class - 규칙/사전 기반 : 신조어 사전 업데이트
    - SNS의 특성을 잘 반영한 처리 ex. ㅋㅋㅋ


    Cleaning(정제) 및 Normalization(정규화)

    토큰화를 진행하고 난 이후에는 정제 작업과 정규화 작업을 진행합니다.

     

    정제 : 갖고 있는 텍스트로부터 노이즈 데이터를 제거.
    정규화 : 표현 방법이 다른 단어들을 통합시켜서 같은 단어로 만듦.

     

    정제 작업은 토큰화 작업에 방해가 되는 부분을 배제하기 위해 토큰화 작업보다 앞서 이루어지기도 하지만, 토큰화 작업 이후에도 여전히 남아있는 노이즈들을 제거하기위해 지속적으로 이루어집니다.

     

    정제 및 정규화 기법

    3가지 정제 및 정규화 기법을 소개하도록 하겠습니다.

     

    1. 규칙에 기반한 표기가 다른 단어들의 통합 (Normalization)

     

    정규화(Normalization)의 목적은 이후 분석할 때 더욱 간단하게 할 수 있게 하기 위해 텍스트 내 서로 다른 token의 개수 줄이는, 즉 토큰을 최대한 통일시키는 것입니다.

     

    이를 위해 Stemming과 Lemmatization 기법을 사용합니다.

     

    Stemming (어간 추출)

    : 어형이 변형된 단어로부터 접사 등을 제거한 어간을 분리해내는 것으로 어근 상 차이가 있더라도 관련된 단어가 동일한 어간으로 매핑되는 것이 목적입니다.

     

        "fishing","fished"."fisher">>>(stemming)>>>"fish"

     

    Lemmatization (원형 복원)

    : 문법적 요인으로 인해 동일한 의미가 다른 활용형으로 사용되는 것을 복원하는 것으로, 단/복수, 동사 시제, 소유격 등의 변형 원래의 형태로 대체합니다.

     

        The boy's cars are different colors >>> (lemmatization) >>> the boy car be differ color

     

    2. 대소문자 통합

     

    대소문자를 통합합니다. 주로 소문자로 통합하나, 무작정 통합하면 안된다는 맹점이 있습니다.

    예를 들어, US(미국)과 us(우리)를 대문자 혹은 소문자로 통합하면 본래의 의미가 보존되지 않습니다.

     

    3. 불필요한 단어 제거(노이즈 데이터 제거)

     

    등장 빈도가 적은 단어나, 길이가 짧은 단어 등의 노이즈 데이터를 제거합니다.

    Regular Expression (정규표현)

    노이즈 데이터의 특징을 잡아냈다면, 이를 정규표현식(Regular Expression)를 이용해 제거하는 것도 하나의 방법입니다.

    아래의 사이트들을 통해 정규표현식을 연습해볼 수 있습니다.

     

    1) https://regex101.com/

    2) https://regexr.com/

     

     

     

    불필요한 토큰 제거

     

    토큰화 작업 후 불필요한 토큰을 제거하는 단계입니다.

    주로 불용어 사전을 활용하여 불필요한 토큰을 제거합니다.

     

    Stopword (불용어)

    불용어란, 여러 텍스트에 공통적으로 빈번히 출현하지만 주제어로서의 가치는 없는 단어를 말합니다.

    영어에서는 대명사, 전치사, 부사 등이, 한국어에서는 대명사, 의존명사, 조사, 감탄사, 수사 등이 해당됩니다.

     

    주로 token들에 대해 word counting을 실시하여, count 횟수가 높은 단어들부터 확인하여 불용어라고 판단되는 단어의 경우 불용어 사전에 추가하는 방식으로 불용어를 삭제합니다.

     

    텍스트 처리 방식

     

    다음은 텍스트 처리를 좀 더 쉽게 할 수 있도록 자연어를 컴퓨터가 인식할 수 있는 숫자로 바꾸어주는 방식입니다.

     

    Integer Encoding (정수 인코딩)

    정수 인코딩이란 단어를 빈도수 순으로 정렬한 단어 집합(vocabulary)을 만들고, 빈도수가 높은 순서대로 차례로 낮은 숫자부터 정수를 부여하는 방법입니다.

    텍스트에 대해 word counting 실행 후 빈도수 높은 단어부터 정수 인덱스 차례대로 부여하는 방식으로 진행됩니다.

     

    토큰 문서 내 토큰의 개수 인덱스 (순위)
    사과 1 2
    바나나 3 0
    딸기 2 1

     

    예를 들어, 하나의 문서 안에 '사과'라는 토큰이 1번, '바나나'라는 토큰이 3번, '딸기'라는 토큰이 2번 등장했다고 가정해보겠습니다.

    해당 문서에 대해 정수 인코딩을 진행하면, 가장 많이 등장한 '바나나' 토큰에 0의 인덱스를, 그 다음으로 많이 등장한 '딸기' 토큰에 1의 인덱스를, '사과'라는 토큰에 2의 인덱스를 순서대로 부여하게 되어 인덱스로 해당 단어를 나타낼 수 있게 됩니다.

     

    One-hot Encoding (원-핫 인코딩)

    원핫 인코딩이란 단어 집합의 크기를 벡터의 차원으로 하고, 표현하고 싶은 단어의 인덱스에 1의 값을 부여하고, 다른 인덱스에는 0을 부여하는 단어의 벡터 표현 방식입니다.

    이 때, 단어 집합은 텍스트의 모든 단어를 중복을 허용하지 않고 모아놓은 것을 의미합니다.

     

    원-핫 인코딩은 다음과 같은 과정을 통해 이루어집니다.

     

    1. 각 단어에 고유한 인덱스를 부여하는 정수 인코딩이 먼저 이루어진 후

    2. 표현하고 싶은 단어의 인덱스의 위치에 1을 부여하고, 다른 단어의 인덱스에는 0을 부여하는 원 핫 벡터를 형성

     

    토큰 문서 내 토큰의 개수 정수 인코딩 원-핫 인코딩
    사과 1 2 [0,0,1]
    바나나 3 0 [1,0,0]
    딸기 2 1 [1,0,1]

     

    위의 예시를 다시 가져와서 설명하자면, '사과'라는 토큰의 경우 정수 인코딩 결과 2라는 인덱스(순서)를 부여받았으므로, 원-핫 인코딩에서는 3번째 위치에만 1을 부여하고, 다른 위치에는 0을 부여하게 됩니다.

    이를 바나나, 딸기에도 적용하여 맨 우측열과 같은 형태를 도출할 수 있습니다.

     

    단, 원-핫 인코딩의 경우 아래의 단점을 가지고 있습니다.

     

    1. 단어 집합의 크기가 곧 벡터 차원의 수이기 때문에 단어의 개수가 늘어날 수록 벡터를 저장하기 위해 필요한 공간이 계속 늘어남 (=처리 속도가 느려짐)

    2. 단어 간 유사성을 표현하지 못함

     

    Byte Pair Encoding (BPE, 단어 분리하기)

    Byte Pair Encoding 훈련 단계에서 학습하지 못한 단어에 대해, 단어를 분리 의미 있는 단위로 나누어 해당 단어를 이해하는 전처리 과정입니다.

     

    아래와 같은 특징을 가지고 있어 배운 적 없는 단어에 대한 대처가 가능합니다.

    • 하나의 단어는 의미있는 여러 내부 단어들(subwords)의 조합으로 구성된 경우가 많음.
    • 따라서 단어를 여러 단어로 분리해서 단어를 이해
    • 토크나이저를 통해 실행 (단어 분리 토크나이저)

     


    참고문헌

    딥 러닝을 이용한 자연어 처리 입문 (https://wikidocs.net/book/2155)

     

     

     

     

    댓글