자연어 처리를 위한 전처리 과정은, 일반적인 데이터 형식에서 쓰이는 정수, 실수, 문자열의 전처리 과정과 차이가 있다.
정수, 실수로 이루어져있는 데이터프레임을 다룬다고 하면, 보통 결측값을 채워주고, 정규화 혹은 표준화를 하고,
그 외에 특성 공학을 이용하여 차원을 확장하거나 축소할 것이다. 문자열이라면 원 핫 인코딩을,
범주형 데이터라면 ordinal 인코딩을 또 할 수 있을 것이다.
자연어는 다르다. 문장으로 이루어진 데이터를 처리하기 위해서는, 각 단어들을 벡터 공간 안에 할당해야 한다.
그렇다고 해서, '나는 자연어 처리를 하고 있습니다.' 라는 문장을
['나는', '자연어', '처리를', '하고', '있습니다']와 같이 할당해서는 안되는데,
내가 이해한 바로는 그 이유는 두 가지가 있다.
첫째로, 형태소 분리 작업이 안되어있기 때문이다.
'나는 자연어 처리를 공부하고 있습니다.' 라는 문장과, '자연어 처리는 어렵습니다.' 라는 문장이 있다고 해보자.
다짜고짜 어절 단위로 끊었다가는,
['나는', '자연어', '처리를', '하고', '있습니다']와 ['자연어', '처리는', '어렵습니다'] 두 문장으로 나누어질텐데,
그렇다면 두 문장에서 '처리'라는 말은 같은 의미로 쓰이고 있음에도 불구하고
컴퓨터는 '처리를' 과 '처리는' 이라는 서로 다른 의미로 인식하게 되기 때문이다.
둘째로, 컴퓨터는 문자열에 대한 수학적 연산을 수행하지 못한다.
사람과 같이, 문자를 있는 그대로 받아들일 수 없으므로, 컴퓨터가 읽을 수 있는 숫자형으로 바꿔주어야 한다.
이에, 위 두 문제를 해결하기 위하여 토큰화와 벡터화 작업이 필요하다.
하지만, 토큰화 이전에 kospacing, hanspell 등의 패키지를 통해 맞춤법을 수정함으로써
토큰화가 더욱 잘 이루어질 수 있도록 처리를 해놓아야 한다.
토큰화
토큰화란, 단어를 형태소 단위로 끊어 각각의 결과물을 배열 내에 할당하는 것을 의미한다.
이러한 토큰화를 지원하는 패키지가 파이썬의 KoNLPy이다.
그리고 그 KoNLPy내의 (다만 별도로 pip install을 해야한다) mecab, 한나눔, okt, 코모란 등을 통해
토큰화를 할 수 있다.
각각의 모듈들은 서로 기능과 장단점이 다르므로, 각자의 필요에 맞게, 혹은 직접 써보고 가장 성능이 우수한 것으로
판단되는 것을 사용하면 된다.
이러한 토큰화를 통해 문장을 형태소 단위로 추출할 수 있지만, 명사 단위로도 추출이 가능하다.
나아가 토큰화 작업은 n-gram, 즉 연속한 n개의 단어들을 한 쌍으로 묶어서도 이루어 질 수 있다.
벡터화
토큰화를 하였다면, 이후에는 벡터화를 진행해야 한다. 당장 지금의 형태만으로는 수학적으로 사용할 여지가 적기 때문이다.
단순히 정수형으로 바꾼다고 하면, tensorflow 내의 keras를 이용하여 총 단어 갯수만큼의 인덱스에 각각의 단어를 할당하는 방법도 있다.
하지만, 이는 단지 정수로 되어있는 명목 변수로 바꾸는 것에 지나지 않는다.
겉보기에는 숫자로 되어있지만, 여전히 어떠한 연산을 통하여 프로그래밍적인 의미를 갖게 하기는 어렵다.
이 문제를 해결하기 위해 필요한 개념이 TF-IDF이다.
TF-IDF(Term Frequency - Inverse Documents Frequency)
TF-IDF란 용어 빈도에 역문서 빈도를 곱한 값을 의미한다.
특정 단어의 문서 내 중요도를 파악하는 작업이다.
TF는 용어의 사용 빈도를 의미한다. 의미 파악이 어렵지 않다.
반면 IDF는 다소 생경하게 느껴질 수 있는데,
'파이썬으로 배우는 자연어처리 인 액션' 책에 의하면,
IDF가 이해되지 않는다면 '이 토큰이 이 문서에 등장한다는 것이 얼마나 이상한 일인가?' 라는 관점에서 생각해 보라 말한다.
특정 용어가 이상하게 한 문서에만 자주 등장하고 나머지 문서에는 거의 안나온다면, 그 용어는 그 문서에서 아주 중요한 단어일 것이다.
이런게 구해진 TF-IDF 값은, 그 결과의 적합성을 개선하기 위해 여러 정규화 방식으로 다시 처리될 수 있다.
그 중 대표적인 것이 Okapi BM25이다.
'데이터 사이언스 > 자연어 처리' 카테고리의 다른 글
1. 자연어처리(NLP) 입문하기 (0) | 2022.06.28 |
---|