텍스트 전처리
일반적인 자연어 텍스트는 그 상태 그대로는 머신러닝 및 딥러닝 학습에 사용할 수 없다. 모델이 학습할 수 있도록 숫자로 변환도 해주어야 하지만, 그 전에 특수문자나 태그 등을 제거하여 자연어 그 자체만 남기는 간단한 처리 역시 필요할 가능성이 높다.
간단하게 파이썬에서는 정규표현식(regular expression)을 이용해 전처리 할 수 있다. 특수문자, 태그 등을 제거하고, 대문자를 모두 소문자로 변형하여 대소문자 구분 없이 처리할 수 있도록 바꾸는 것 등 전처리를 해준다.
토큰화(tokenizing)는 단어 별로 자르는 것이다. 예를 들어서 "The sun is shining, the weather is sweet."라는 문장을 "The", "sun", "is", "shining", "the", "weather", "is", "sweet" 정도로 쪼갤 수 있다. 가장 간단하게는 띄어쓰기를 기준으로 쪼갤 수 있지만, 잘 학습된 모델이 있다면 붙어있는 단어도 쪼갤 수 있을 듯 하다.
어간 추출(stemming)은 단어를 어근 형태로 변환하는 것이다. 위 예시에서 "shining"의 어근은 "shine"이므로 변환해주는 것이다.
불용어 처리(stop-word removal)는 자주 등장하지만 의미없는 단어를 제거하는 작업이다. 예를 들어서 "the", "is", "a" 등이 있다. 일반적으로 따로 정의된 불용어 사전을 이용한다.
형태소 분석(morphological analysis)은 단어의 문법적 형태를 분석한다. 접두사, 접미사, 시제, 수, 품사 등을 태깅하는 것이다. 가장 많이 사용되는 것은 품사 태깅(POS tagging)으로 명사, 형용사, 동사 등을 태깅한다.
영어에 대해서는 다양한 모델 및 데이터가 있어 전처리가 어렵지 않지만, 한국어의 경우 정확한 전처리가 어렵다. 일단 참고할 수 있는 것은 KoNLPy(참고링크)가 있다.
단어 주머니 (Bag-of-Words)
가장 단순하게 텍스트를 수치적 특성 벡터(numerical feature vector)로 표현하는 방법으로 단어들의 선후관계 등을 고려하지 않고 오직 등장 횟수만을 기준으로 수치화한다.
구체적으로는 말뭉치(corpus)에서 고유한 토큰의 어휘 사전을 만들고, 각 토큰의 빈도(count)를 벡터로 표현한다. 여기서 말뭉치란 수집된 텍스트 데이터의 집합, 즉 모델이 학습할 때 사용하는 모든 텍스트 집합이다.
예를 들어서 "The sun is shining, the weather is sweet." 라는 문장을 학습시키기 위해 단어 주머니로 만든다고 하면 다음과 같이 만들 수 있다.
the | sun | is | shining | weather | sweet | |
vector | 2 | 1 | 2 | 1 | 1 | 1 |
TF-IDF (term frequency-inverse document frequency)
TF는 특정 단어가 문서에 몇 번 등장했는지, IDF는 그 단어가 전체 문서에서 얼마나 드물게 등장했는지를 나타내는 값이다. 드물수록 높은 IDF 값을 가진다.
$$ TF(t, d) $$
$$ IDF(t) = \log \left( \frac{n_d}{1 + DF(t)} \right) $$
여기서 $ t $ 는 해당 단어, $ d $ 는 문서, $ DF(t) $ 는 단어 $ t $ 가 등장한 문서 수, $ n_d $ 는 전체 문서 수이다. TF-IDF는 다음과 같이 계산된다.
$$ TF\text{-}IDF (t, d) = TF(t, d) \times IDF(t) $$
같은 단어라도 TF-IDF에서는 문서 내, 전체 말뭉치 내 등장 빈도에 따라 가중치가 조절된다.
N-gram
$ n $ 개의 연속된 항목(sequence)을 추출하는 것으로 항목은 음소(phoneme), 문자(letter) 또는 단어(word)일 수 있다. 앞에서 만든 단어 주머니(bag-of-words) 모델을 1-gram 모델이라 볼 수 있는 것이다.
즉 2-gram 모델은 인접한 두 토큰을 묶어 하나의 단위로 간주한다. 예를 들어서 "The sun is shining, the weather is sweet."이라면 "The sun", "sun is", "is shining" 등으로 나타낸다.
'Artificial Intelligence > Natural Language Processing' 카테고리의 다른 글
[NLP] 워드 임베딩(word embedding) 및 벡터 유사도(vector similarity) (0) | 2025.05.20 |
---|---|
[NLP] 검색증강생성(RAG, retrieval-augmented generation) (0) | 2025.02.24 |