컴퓨터는 텍스트보다는 숫자를 좀더 잘 처리할 수 있습니다.
이를 위해 자연어 처리에서는 텍스트를 숫자로 바꾸는 여러가지 기법들이 있습니다.
첫 단계로 각 단어를 정수에 맵핑시키는 전처리 작업이 필요할 때가 있습니다.
1. 정수 인코딩(Integer Encoding)
단어에 정수를 부여하는 방법 중
하나의 단어를 빈도수 순으로 정렬한 단어 집합을 만들고
빈도수가 높은 순서대로 정수를 부여하는 방법이 있습니다.
1) dictionary 사용하기
from nltk.tokenize import sent_tokenize # 문장으로 쪼개주는 작업
from nltk.tokenize import word_tokenize # 단어으로 쪼개주는 작업
from nltk.corpus import stopwords # 불용어 제거
텍스트를 수치화 하는 단계라는 것은
본격적으로 자연어처리 작업에 들어간다는 의미이므로,
단어가 텍스트일 때만 할 수 있는 최대한의 전처리를 끝내놓아야 합니다.
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)
vocab에는 단어에대한 빈도수가 기록되어져 있습니다.
자연어 처리에서는 텍스트 데이터에 있는 단어를 모두 사용하기 보다는
빈도수가 가장 높은 n개의 단어만 사용하고 싶은 경우가 많습니다.
단어 집합에 존재하지 않는 단어들이 생기는 상황을
Out-Of-Vocabulary(단어 집합에 없는 단어)문제라고 합니다.
약자로 'OOV'문제라고도 하는데 단어 집합에 없는 단어들은 OOV의 인덱스로 인코딩하는 방법도 있습니다.
이렇게 dictionary 자료형으로 정수 인코딩을 진행하다보면 굉장히 복잡하고 어렵습니다.
따라서 Counter, FreqDist, dnumerate를 사용하거나, 케라스 토크나이저를 사용하는 것이 권장됩니다.
2) Counter 사용하기
from collections import Counter
Counter()의 입력으로 사용하면 중복을 제거하고 단어의 빈도수를 기록합니다.
단어를 키(key)로,
단어에 대한 빈도수가 값(value)로 저장되어져 있습니다.
most_common()은 상위 빈도수를 가진 주어진 수의 단어만을 리턴합니다.
3) NLTK의 FreqDist 사용하기
NLTK에서는 빈도수 계산 도구인 FreqDist()를 지원합니다.
위에서 사용한 Counter()랑 같은 방법으로 사용할 수 있습니다.
from nltk import FreqDist
2. 케라스(keras)의 텍스트 전처리
케라스는 기본적인 전처리를 위한 도구들을 제공합니다.
정수 인코딩을 위해서 케라스의 전처리 도구인 토크나이저를 사용하기도 합니다.
from tensorflow.keras.preprocessing.text import Tokenizer
tokenizer = Tokenizer()
# fit_on_texts()안에 코퍼스를 입력으로 하면 빈도수를 기준으로 단어 집합을 생성.
tokenizer.fit_on_texts(preprocessed_sentences)
각 단어에 인덱스가 어떻게 부여되었는지를 보려면, word_index를 사용합니다.
각 단어가 카운트를 수행하였을 때 몇 개였는지를 보고자 한다면 word_counts를 사용합니다.
texts_to_sequences()는
입력으로 들어온 코퍼스에 대해서 각 단어를 이미 정해진 인덱스로 변환합니다.
케라스 토크나이저에서는
tokenizer = Tokenizer(num_words=숫자)와 같은 방법으로
빈도수가 높은 상위 몇 개의 단어만 사용하겠다고 지정할 수 있습니다.
num_words는 숫자를 0부터 카운트 하기 때문에 +1이 필요합니다.
이러한 이유는 자연어 처리에서 패딩(padding)이라는 작업 때문입니다.
케라스 토크나이저는 기본적ㄷ으로 단어 집합에 없는 단어인 OOV에 대해서는
단어를 아예 제거한다는 특징이 있습니다.
단어 집합에 없는 단어들을 OOV로 간주하여 보존하고 싶다면
tokenizer의 인자 oov_token을 사용합니다.
기본적으로 OOV의 인덱스를 1로 합니다.
'[NLP]' 카테고리의 다른 글
[NLP] 원-핫 인코딩 (0) | 2023.03.27 |
---|---|
[NLP] 패딩(padding) (0) | 2023.03.27 |
[NLP] 정규 표현식(Regular Expression) (0) | 2023.03.27 |
[NLP] 표제어 추출 and 어간 추출 (0) | 2023.03.27 |
[NLP] 불용어(Stopword) (0) | 2023.03.27 |