오늘은 자연어 처리를 위한 데이터 전처리 과정 중 정수 인코딩에 대해 짚어 보겟습니다.
오늘 포스팅은 다음 문서를 참고 하였습니다.
컴퓨터는 텍스트보다 숫자를 더 잘 처리합니다.이를 위해 자연어 처리에서는 텍스틑를 숫자로 바꾸는 여러 기법들이 있습니다. 그런 기법을 적용시키기 위한 첫 단계로 각 단어를 고유한 정수에 맵핑 시키는 전처리 작업이 필요할 때가 있습니다.
예를들어 가지고 있는 텍스트가 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)
높은 빈도수의 단어순으로 번호가 매겨진것을 볼 수 있습니다.
'Python' 카테고리의 다른 글
[Python] Flask 를 이용해 웹 서버 실행시키기 (0) | 2023.08.24 |
---|---|
[Python] OpenCV로 특정 색을 인식하기 (0) | 2023.08.15 |
[Python] OpenCV 라이브러리로 이미지에 도형 그리기 (0) | 2023.07.30 |
[python] 자연어 처리를 위한 텍스트 전처리(불용어 제거) (0) | 2023.07.28 |
[Python] 크롤링으로 공공데이터 포털의 파일들 다운받기 (0) | 2023.07.22 |