본문 바로가기
AI/Theory_Private

전처리

by floraj 2023. 6. 10.

Reference.

딥러닝 파이토치 교과서 9.2 

 

 

전처리 과정

 

문장 - 결측치 확인 및 토큰화 - 단어 색인 - 불용어 제거 - 축소된 단어 색인 - 어간 추출

 

 

1. 결측치 확인

 

확인

df.isnulll().sum() 결측치 확인 후 sum으로 몇 개 인지 확인

df.isnall().sum()/len(df) 결측치 비율

 

처리

df = df.dropna(how='all') 모든 행이 NaN일 때만 삭제

df = df.dropna() 데이터에 하나라도  NaN 값이 있으면 행을 삭제

df = df.filllna(0) 결측치를 0으로 

df['x'].filllna(df['x'].mean(), inplace=True) 결측치 평균으로 채우기

 

이외에도

데이터에 하나라도 NaN 값이 있을 때 행 전체를 삭제

데이터가 거의 없는 특성(열)은 특성(열) 자체를 삭제

최빈값 혹은 평균값으로 NaN 값을 대체할 수 있음.

 

 

2. 토큰화

 

주어진 텍스트를 단어/문자 단위로 자르는 것.

 

문장 토큰화

마침표(.), 느낌표(!), 물음표(?) 등 문장의 마지막을 뜻하는 기호에 따라 분리하는 것

from nltk import sent_tokenize
text_sample = 'Natural Language Processing, or NLP, is the process of extracting the meaning, or intent, behind human language. In the field of Conversational artificial intelligence (AI), NLP allows machines and applications to understand the intent of human language inputs, and then generate appropriate responses, resulting in a natural conversation flow.'
tokenized_sentences = sent_tokenize(text_sample)

 

단어 토큰화

띄어쓰기를 기준으로 문장을 구분 (한국어는 띄어쓰기만으로는 어려움)

from nltk import word_tokenize
sentence = "This book is for deep learning learners"
words = word_tokenize(sentence)

 

어포스트로피가 있는 문장의 경우, WordPuctTokenizer 이용

WordPunctTokenizer().tokenize(sentence)

 

한국어 토큰화

Okt - word2vec 예시

 

twitter = Okt()

result = []
for line in rdw: ------ 텍스트를 한 줄씩 처리
    malist = twitter.pos(line[1], norm=True, stem=True) ------ 형태소 분석
    r = []
    for word in malist:
        if not word[1] in ["Josa","Eomi","Punctuation"]: ------ 조사, 어미, 문장 부호는 제외하고 처리
            r.append(word[0])
    rl = (" ".join(r)).strip() ------ 형태소 사이에 “ ”(공백)을 넣고, 양쪽 공백은 삭제
    result.append(rl)
    print(rl)
mData = word2vec.LineSentence("NaverMovie.nlp")
mModel = word2vec.Word2Vec(mData, vector_size=200, window=10, hs=1, min_count=2, sg=1)
mModel.save("NaverMovie.model") ------ 모델 저장

 

3. 불용어 제거

불용어(stop word)란 문장 내에서 빈번하게 발생하여 의미를 부여하기 어려운 단어들.

 

import nltk
from nltk.corpus import stopwords
nltk.download('stopwords')
nltk.download('punkt')
from nltk.tokenize import word_tokenize

sample_text = "One of the first things that we ask ourselves is what are the pros and cons of any task we perform."
text_tokens = word_tokenize(sample_text)

tokens_without_sw = [word for word in text_tokens if not word in stopwords.words('english')]

print("불용어 제거 미적용:", text_tokens, '\n')
print("불용어 제거 적용:", tokens_without_sw)

 

 

4. 어간 추출

 

어간 추출(stemming)과 표제어 추출(lemmatization)은 단어 원형을 찾아 주는 것.

 

어간 추출 

 Automates, automatic, automation → automat

품사가 달라도 사용 가능.

사전에 없는 단어도 추출할 수 있음.

NLTK 내 어간 추출로 포터(porter) 랭커스터(lancaster) 알고리즘이 있음.

 

표제어 추출

 am, are, is → be

 car, cars, car’s, cars’ → car

단어가 문장 속에서 어떤 품사로 쓰였는지 고려하기 때문에 품사가 같아야 사용 가능.

품사와 같은 문법뿐만 아니라 문장 내에서 단어 의미도 고려하기 때문에 어간추출보다 성능이 좋지만 시간이 더 오래 걸림.

사전에 없는 단어는 사용 불가

표제어 추출은 WordNetLemmatizer를 주로 사용

 

 

포터

from nltk.stem import PorterStemmer
stemmer = PorterStemmer()

print(stemmer.stem('obesses'), stemmer.stem('obssesed'))
print(stemmer.stem('standardizes'), stemmer.stem('standardization'))
print(stemmer.stem('national'), stemmer.stem('nation'))
print(stemmer.stem('absentness'), stemmer.stem('absently'))
print(stemmer.stem('tribalical'), stemmer.stem('tribalicalized')) ------ 사전에 없는 단어


#비교적 단어 원형이 잘 보존되어 있음
obsess obsess
standard standard
nation nation
absent absent
tribal tribalic

 

랭커스터

 

from nltk.stem import LancasterStemmer
stemmer = LancasterStemmer()

print(stemmer.stem('obsesses'), stemmer.stem('obsessed'))
print(stemmer.stem('standardizes'), stemmer.stem('standardization'))
print(stemmer.stem('national'), stemmer.stem('nation'))
print(stemmer.stem('absentness'), stemmer.stem('absently'))
print(stemmer.stem('tribalical'), stemmer.stem('tribalicalized')) ------ 사전에 없는 단어


# 단어 원형을 알아볼 수 없을 정도로 축소됨. 데이터셋을 축소시켜야 하는 특정상황에 적용 가능.
obsess obsess
standard standard
nat nat
abs abs
trib trib

 

WordNetLemmatizer

import nltk
nltk.download('wordnet')

from nltk.stem import WordNetLemmatizer ------ 표제어 추출 라이브러리
lemma = WordNetLemmatizer()

print(stemmer.stem('obsesses'), stemmer.stem('obsessed'))
print(lemma.lemmatize('standardizes'), lemma.lemmatize('standardization'))
print(lemma.lemmatize('national'), lemma.lemmatize('nation'))
print(lemma.lemmatize('absentness'), lemma.lemmatize('absently'))
print(lemma.lemmatize('tribalical'), lemma.lemmatize('tribalicalized'))


obesses obssesed
standardizes standardization
national nation
absentness absently
tribalical tribalicalized


# 품사정보 추가
print(lemma.lemmatize('obsesses','v'), lemma.lemmatize('obsessed','a'))
print(lemma.lemmatize('standardizes','v'), lemma.lemmatize('standardization','n'))
print(lemma.lemmatize('national','a'), lemma.lemmatize('nation','n'))
print(lemma.lemmatize('absentness','n'), lemma.lemmatize('absently','r'))
print(lemma.lemmatize('tribalical','a'), lemma.lemmatize('tribalicalized','v'))

 

 

5. 정규화

데이터셋이 가진 특성(혹은 칼럼)의 모든 데이터가 동일한 정도의 범위(스케일 혹은 중요도)를 갖도록 하는 것.

값이 크다고 해서 분석에 더 중요한 요소라고 간주할 수 없기 때문에 정규화 필요

 

MinMaxScaler() 

모든 칼럼이 0과 1 사이에 위치하도록 값의 범위를 조정.

특정 범위에서 많이 벗어난 데이터(이상치)의 경우 좁은 범위로 압축될 수 있음 =  이상치에 매우 민감할 수 있어 주의 필요

from sklearn.preprocessing import MinMaxScaler
minMaxScaler = MinMaxScaler() ------ MinMaxScaler 객체 생성
minMaxScaler.fit(train_data) ------ fit() 함수를 사용하여 데이터셋에 정규화를 적용
train_data_minMaxScaled = minMaxScaler.transform(train_data) ------ transform() 함수를 사용하여 훈련 데이터셋을 적용

 

StandardScaler()

각 특성의 평균을 0, 분산을 1로 변경하여 칼럼 값의 범위를 조정

from sklearn.preprocessing import StandardScaler
standardScaler = StandardScaler() ------ StandardScaler 객체 생성
standardScaler.fit(train_data)
train_data_standardScaled = standardScaler.transform(train_data)

 

RobustScaler()

평균과 분산 대신 중간 값(median)과 사분위수 범위(InterQuartile Range, IQR)를 사용

from sklearn.preprocessing import RobustScaler
robustScaler = RobustScaler()
robustScaler.fit(train_data)
train_data_robustScaled = robustScaler.transform(train_data)

 

MaxAbsScaler()

절댓값이 0~1 사이가 되도록 조정. = 모든 데이터가 -1~1의 사이가 되도록 조정

양의 수로만 구성된 데이터는 MinMaxScaler()와 유사하게 동작. 큰 이상치에 민감.

from sklearn.preprocessing import MaxAbsScaler
maxAbsScaler = MaxAbsScaler()
maxAbsScaler.fit(train_data)
train_data_maxAbsScaled = maxAbsScaler.transform(train_data)

 

 

'AI > Theory_Private' 카테고리의 다른 글

GRU 게이트 순환 신경망  (0) 2023.05.27
성능최적화_하이퍼파라미터  (0) 2023.05.07
Time Series Regression 1  (0) 2023.04.20
시계열 분석  (0) 2023.04.15
Attention (from seq2seq) Review  (0) 2023.04.11