본문 바로가기
Python

[python] 자연어 처리를 위한 텍스트 전처리(정수 인코딩)

by teamnova 2023. 8. 9.

오늘은 자연어 처리를 위한 데이터 전처리 과정 중 정수 인코딩에 대해 짚어 보겟습니다. 

오늘 포스팅은 다음 문서를 참고 하였습니다. 

https://wikidocs.net/31766

 

02-06 정수 인코딩(Integer Encoding)

컴퓨터는 텍스트보다는 숫자를 더 잘 처리 할 수 있습니다. 이를 위해 자연어 처리에서는 텍스트를 숫자로 바꾸는 여러가지 기법들이 있습니다. 그리고 그러한 기법들을 본격적으로 적용…

wikidocs.net

컴퓨터는 텍스트보다 숫자를 더 잘 처리합니다.이를 위해 자연어 처리에서는 텍스틑를 숫자로 바꾸는 여러 기법들이 있습니다. 그런 기법을 적용시키기 위한 첫 단계로 각 단어를 고유한 정수에 맵핑 시키는 전처리 작업이 필요할 때가 있습니다. 

 

예를들어 가지고 있는 텍스트가 5000개가 있다면 각각 1번에서 부터 5000번까지 단어와 맵핑되는 고유한 정수(index) 를 부여합니다.

 

각 번호에 해당하는 단어가 생기게 되는 샘입니다. 

 

번호는 랜덤으로 부여되기도 하지만 보통은 데이터에서 얼마나 자주 등장하는가 를 기준으로 정렬한 뒤 부여하는 경우가 많습니다. 

 

오늘 예제는 단어 집합을 만들고 각각 빈도수가 높은 순서대로 차례로 정수를 부여하는 과정을 실습해 보겠습니다.

 

dictionary 사용하기

우선 필요한 패키지를 임포트 해줍니다.

from nltk.tokenize import sent_tokenize
from nltk.tokenize import word_tokenize
from nltk.corpus import stopwords

텍스트 를 수치화시킨다 라는 것은 본격적으로 자연어 처리 작업에 들어간다는 의미이므로, 단어가 텍스트 일때 할 수 있는 최대한의 전처리는 끝내 놓아야 합니다. 

 

토큰화를 진행할 예제 문장 입니다.

raw_text = "A barber is a person. a barber is good person. a barber is huge person. he Knew A Secret! The Secret He Kept is huge secret. Huge secret. His barber kept his word. a barber kept his word. His barber kept his secret. But keeping and keeping such a huge secret to himself was driving the barber crazy. the barber went up a huge mountain."

 

문장 단위로 토큰화를 진행하겠습니다. 

# 문장 토큰화
sentences = sent_tokenize(raw_text)
print(sentences)

기존의 텍스트 데이터가 문장단위로 토큰화 된것을 확인할 수 있습니다. 

 

이제 정제 작업과 정규화 작업을 병행하며, 단어 토큰화를 수행합니다.

vocab = {}
preprocessed_sentences = []
stop_words = set(stopwords.words('english'))

for sentence in sentences:
    # 단어 토큰화
    tokenized_sentence = word_tokenize(sentence)
    result = []

    for word in tokenized_sentence: 
        word = word.lower() # 모든 단어를 소문자화하여 단어의 개수를 줄인다.
        if word not in stop_words: # 단어 토큰화 된 결과에 대해서 불용어를 제거한다.
            if len(word) > 2: # 단어 길이가 2이하인 경우에 대하여 추가로 단어를 제거한다.
                result.append(word)
                if word not in vocab:
                    vocab[word] = 0 
                vocab[word] += 1
    preprocessed_sentences.append(result) 
print(preprocessed_sentences)

불용어가 제거되고 단어 토큰화가 진행된 것을 확인할 수 있습니다. 

 

현재 vocab 에는 각 단어에 대한 빈도수가 기록되어져 있습니다. vocab 을 출력해 봅시다.

print('단어 집합 :',vocab)

파이썬의 딕셔너리 구조로 단어를 키(key), 단어데 대한 빈도수가 값(value) 로 저장되어 있습니다. 

vocab 에 단어를 입력하면 빈도수를 리턴해 줍니다. 

 

# 'barber'라는 단어의 빈도수 출력
print(vocab["barber"])

이제 빈도수가 높은 순서대로 정렬해 보겠습니다. 

vocab_sorted = sorted(vocab.items(), key = lambda x:x[1], reverse = True)
print(vocab_sorted)

sorted() 함수를 이용해  정렬된 리스트를 반환합니다. 여기서는 vocab.items()를 정렬하므로, vocab의 각 (key, value) 쌍을 리스트로 만들어 정렬합니다. 이때 정렬 방법을 key 매개변수로 지정할 수 있습니다. lambda x: x[1]x의 두 번째 값(즉, vocab의 값)을 기준으로 정렬하도록 지정하는 람다 함수입니다.

 

높은 빈도수를 가진 단어일수록 낮은 정수를 부여해 줍니다. 정수는 1부터 부여합니다.

word_to_index = {}
i = 0
for (word, frequency) in vocab_sorted :
    if frequency > 1 : # 빈도수가 작은 단어는 제외.
        i = i + 1
        word_to_index[word] = i

print(word_to_index)

높은 빈도수의 단어순으로 번호가 매겨진것을 볼 수 있습니다.