작성자: 유인재
텍스트 전처리 기법
Machine Learning을 진행하기에 앞서 우리는 항상 학습을 진행할 데이터와 마주하게 된다.
이러한 데이터들은 전처리 과정이 필수적으로 수반되어져야 하는데, 학습하기 용이하게 되어있지 않을 뿐더러 Null data와 불균등한 분포를 가지고 있다.
이뿐만이 아니다. 숫자로만 데이터가 이루어져 있을거라는 제약을 벗어난다면, 문자열도 얼마든지 데이터에 포함되어 있을 것이다. 하지만 이렇게 datatype이 문자열(텍스트)인 데이터가 포함된 데이터를 학습시키는 방법은 기존과 달라야 할 것이다.
앞으로 소개될 내용들을 통해, 텍스트로 이루어진 데이터를 처리하는 방법들에 다뤄보고자 한다. 본문에서는 데이터를 전처리하는 과정에서 사용되어지는 기법들을 중점적으로 소개할 예정이다.
텍스트는 왜 추가적인 전처리 과정이 필요할까?
본격적인 설명에 앞서 텍스트의 경우는 부가적인 처리 과정들이 필요한 이유에 대해 보다 구체적인 설명을 먼저 해보려고 한다. 이러한 이유는 기계의 특성에서 찾아볼 수 있는데, 기계는 텍스트보다 숫자를 읽고 해석하는데 용이하기 때문이다.
그렇기에 텍스트를 그대로 학습 데이터로 사용하기 보다는 텍스트를 의미를 갖는 숫자로 전환하는 과정의 필요한 것이다. 이러한 과정이 조금은 불필요해보이지만 학습을 진행하는 과정에서 텍스트 데이터를 그대로 사용한 경우보다 효율적인 학습경과를 확인할 수 있을 것이다.
배경지식 (Background)
텍스트 데이터를 사용하기에 앞서, 용도에 맞게 토큰화(Tokenization) & 정제(Cleaning) & 정규화(Normalization) 작업이 필요하다
-
**토큰화(Tokenization)이란? **
토큰이라 불리는 단위로 나누는 작업
-
토큰(Token)이란?
텍스트를 나누는 단위. 토큰의 기준을 단어(word)로 하는경우, 단어 토큰화라고 말한다.
(단어는 단어 단위 외에도 단어구, 의미를 갖는 문자열로도 간주된다.)
-
정제(Cleaning)이란?
갖고 있는 텍스트 데이터로부터 노이즈 데이터를 제거하는 작업
-
정규화(Normalization)이란?
표현 방법이 다른 단어들을 통화시켜서 같은 단어로 만드는 작업
기법 1. 표제어 추출 (Lemmatization)
표제어는 ‘기본 사전형 단어’를 의미하며 표제어 추출은 단어들로부터 표제어를 찾아가는 과정이다. 전처리를 하는 부가적인 목적은 불필요한 단어는 줄이고 핵심적인 단어만을 추려 간소화 시키는 것인데, 표제어 추출을 통해 단어들이 다른 형태를 가지더라도, 그 근원 단어를 찾아 여러개의 단어를 근원단어로 통합시켜 단어를 간소화할 수 있다. (= 정규화 Normalization)
기법 2. 어간 추출 (Stemming)
어간(stem)이란, 단어의 의미를 담고 있는 단어의 핵심부분을 말하는데, 이를 추출하는 작업이 바로 어간 추출이다. 어간 추출은 형태학적 분석을 단순화한 것이라고도 생각할 수 있다. 정해진 규칙을 기반으로 단어의 어미를 자르기 때문에 어간 추출 후의 결과는 사전에 존재하지 않는 단어일 수 도 있으며, 제대로 된 추출이 일어나지 않을 수 있다.
기법 3. 불용어(Stopword)
의미있는 단어를 추출하는 과정 또한 필요하지만, 반대로 생각해보면 큰 의미가 없는 단어를 제거하는 작업 또한 이루고자 하는 결과물은 같을 것이다. 불용어란, 문장에서는 자주 등장하지만 실제 의미 분석을 하는데는 거의 기여하는 바가 없는 단어들을 말한다.
Ex: 조사, 접미사 etc.
기법 4. 정규 표현식 (Regular Experssion)
파이썬에서 정규 표현식 모듈 re가 존재해서, 이를 이용하면 특정 규칙이 있는 텍스트를 빠르게 정제할 수 있다.
1) 정규 표현식 문법
문자 규칙 | 설명 |
---|---|
. | 한 개의 임의의 문자를 나타낸다. |
? | 앞의 문자가 존재할 수도 있고, 존재하지 않을 수도 있다. (문자가 0개 또는 1개) |
* | 앞의 문자가 무한개로 존재할 수도 있고, 존재하지 않을 수도 있습니다. (문자가 0개 이상) |
+ | 앞의 문자가 최소 한 개 이상 존재합니다. (문자가 1개 이상) |
^ | 뒤의 문자열로 문자열이 시작됩니다. |
$ | 앞의 문자열로 문자열이 끝납니다. |
{숫자} | 숫자만큼 반복합니다. |
{숫자1, 숫자2} | 숫자1 이상 숫자2 이하만큼 반복합니다. ?, *, +를 이것으로 대체할 수 있습니다. |
{숫자,} | 숫자 이상만큼 반복합니다. |
[ ] | 대괄호 안의 문자들 중 한 개의 문자와 매치합니다. [amk]라고 한다면 a 또는 m 또는 k 중 하나라도 존재하면 매치를 의미합니다. [a-z]와 같이 범위를 지정할 수도 있습니다. [a-zA-Z]는 알파벳 전체를 의미하는 범위이며, 문자열에 알파벳이 존재하면 매치를 의미합니다. |
[^문자] | 해당 문자를 제외한 문자를 매치합니다. |
\d | 모든 숫자를 의미합니다. [0-9]와 의미가 동일합니다. |
\D | 숫자를 제외한 모든 문자를 의미합니다. [^0-9]와 의미가 동일합니다. |
\s | 공백을 의미합니다. [ \t\n\r\f\v]와 의미가 동일합니다. |
\w | 문자 또는 숫자를 의미합니다. [a-zA-Z0-9]와 의미가 동일합니다. |
2) 정규 표현식 모듈함수
모듈 함수 | 설명 |
---|---|
re.compile() | 정규표현식을 컴파일하는 함수입니다. 다시 말해, 파이썬에게 전해주는 역할을 합니다. 찾고자 하는 패턴이 빈번한 경우에는 미리 컴파일해놓고 사용하면 속도와 편의성면에서 유리합니다. |
re.search() | 문자열 전체에 대해서 정규표현식과 매치되는지를 검색합니다. |
re.match() | 문자열의 처음이 정규표현식과 매치되는지를 검색합니다. |
re.split() | 정규 표현식을 기준으로 문자열을 분리하여 리스트로 리턴합니다. |
re.findall() | 문자열에서 정규 표현식과 매치되는 모든 경우의 문자열을 찾아서 리스트로 리턴합니다. 만약, 매치되는 문자열이 없다면 빈 리스트가 리턴됩니다. |
re.sub() | 문자열에서 정규 표현식과 일치하는 부분에 대해서 다른 문자열로 대체합니다. |
기법 5. 정수 인코딩 (Integer Encoding)
정소 인코딩이랑 단어에 정수를 부여하는 방법 중 하나로 단어를 빈도수 순으로 정렬한 단어 집합을 만들고, 빈도수가 높은 순서대로 차례로 낮은 숫자부터 정소를 부여하는 방법이다.
기법 6. 패딩 (Padding)
텍스트 데이터를 다루는 과정에서 각 데이터마다 길이가 다른 상황이 있을 수 있다. 그런데 기계는 길이가 전부 동일한 문서들에 대해서는 하나의 행렬로 보고, 한꺼번에 묶어서 처리할 수 있다. 따라서 효율적인 병렬연산을 위해서는 여러 문장의 길이를 임의로 동일하게 맞춰주는 작업이 필요한데, 이를 패딩이라고 한다.
기법 7. One-Hot Encoding
One-Hot Encoding은 단어 집합의 크기를 벡터의 차원으로 하고, 표현하고 싶은 단어의 인덱스에 1의 값을, 다른 인덱스에서는 0을 부여하는 단어의 벡터 표현 방식이다.
One-Hot Encoding의 과정
과정1: 정수 인코딩을 진행한다. 즉, 각 단어에 고유한 정수를 부여한다.
과정2: 표현하고 싶은 단어의 고유 정수를 인덱스로 간주하고 벡터로 나타낸다.
One-Hot Encoding의 한계
- One-Hot Encoding은 직관적인 표현방법이긴 하지만, 단어의 개수가 늘어날 수록, 벡터를 저장하기 위해 필요한 공간이 계속 늘어난다는 단점이 있다. 따라서 저장공간 측면에서는 매우 비효율적인 표현 방법이다.
- 단어의 유사도를 표현하지 못한다. 각각의 단어들은 독립적인 요소로 고려되기 때문이다.
Reference
(자세한 예제 코드와 사용법에 대해 알고 싶으시다면 위의 링크를 참고하시면 됩니다.)