愛林

[Text Mining] 텍스트 마이닝 : 텍스트 전처리 - 불용어 제거, 어간추출(Stemming), 표제어추출(Lemmatization) 본문

Data Science/Text Mining, 자연어처리

[Text Mining] 텍스트 마이닝 : 텍스트 전처리 - 불용어 제거, 어간추출(Stemming), 표제어추출(Lemmatization)

愛林 2022. 7. 27. 21:29
반응형

 

저번시간에는 텍스트 전처리의 토큰화(Tokenize) 에 대해 알아보았다.

https://wndofla123.tistory.com/49

 

텍스트 마이닝(TEXT MINING) - 텍스트 전처리 - 토큰화(Tokenize)

텍스트마이닝 시작! 텍스트 마이닝 (Text Mining) 텍스트 마이닝이란, 텍스트(비정형데이터) 를 정형화된 데이터로 변환하는 기법이다. 이 과정에서 자연어 처리 기법을 사용한다. 문서를 일정한 길

wndofla123.tistory.com

 

 

이어서 하는 노이즈와 불용어 제거, 어간추출, 표제어 추출..

복잡하게 배우지는 않았다.

 

 


 

노이즈(Noise) 와 불용어(Stop Word) 제거

 

 

정규표현식을 통해서 특수문자와 같은 대부분의 문자들은 제거된다.

그 외에도 별도의 원하는 패턴을 가진 노이즈를 제거할 수 있다. 

 

불용어란, 노이즈는 아니지만 분석에 필요없는 단어들을 말한다.

NLTK 에는 기본적인 불용어를 제거할 수 있는 불용어 사전이 있기 때문에, 쉽게 불용어 제거가 가능하다.

 

이외에도 나만의 불용어 사전을 만들어 해당 단어를 제거할 수 있다.

 

 

from nltk.corpus import stopwords

NLTK 의 불용어 사전을 불러온다.

영어 불용어만 가져와서 set 을 이용한 중복제거가 가능하다.

 

 

 

english_stops = set(stopwords.words('english'))
text1 = "Sorry, I couldn't go to movie yesterday"
tokens = word_tokenize(text1.lower())

불용어 제거를 해줄 언어는 'english' 이다.

 

 

이를 통해서 stopwords . 불용어를 제거한 단어들만으로  list 생성이 가능하다.

 

 

tokens = [word for word in tokens if word not in english_stops]
print(tokens)

 

 

나만의 불용어 사전을 만들 수도 있다.

could 와 n\t 를 나의 불용어로 지정해주었다.

이제 word for word in tokens if word not in (불용어사전) 을 사용해서 

내가 지정한 불용어들을 삭제해보자.

 

my_stops = ['could','n\t']
tokens = [word for word in tokens if word not in my_stops]
print(tokens)

 

 

 


 

정규화 (Normalizing)

 

정규화란, 동일한 의미의 단어가 다른 형태를 갖는 것을 보완해주는 것이다.

 

어간추출을 통해 정규화를 할 수 있다.

 

 


 

어간 추출 (Stemming) 

 

어간추출이란,

어형이 변형된 단어로부터 접사 등을 제거하여 그 단어의 어간을 분리해내는 작업이다.

 

여기서 짤막하게 어간, 어미에 대해 짚고 넘어가자면,

어떤 단어가 동일한 어간을 가지고 동일한 품사를 유지하면서 , 그 어미를 여러가지로 변형시켜서

문법적 기능을 변형하는 현상을 어형변화라고 하는데,

어간은 이 어형변화에서 변하지 않는 부분,

어미는 이 어형변화에서 계속 바뀌는 부분이다.

 

예를 들어 [간다, 갔다] 의 어간은 '가' 이고,

[작다, 작으니] 의 어간은 '작' 이다.

 

 

영어 어간의 추출은 마틴 포터가 작성한 포터 스테머 라는 스테밍 알고리즘을 사용한다.

영어 분야에서는 사실상의 표준역할을 하고 있으며,

규칙에 따라서 어간을 추출한다.

 

추출된 어간은 사전에 없는 단어가 나올 수 있다.

그러나 우리의 바보 컴퓨터는 그런 거 구별 못 하므로 문제가 되지 않는다 ..

 

 

from nltk.stem import PorterStemmer

stemmer = PorterStemmer()
print(stemmer.stem('cooking'), stemmer.stem('cookery'), stemmer.stem('cookbooks'))

 

cookeri 같은 재밌는 단어를 추출해냈다..

 

Poter Stemmer 의 문제점은 이상한 단어로 변환하는 것이다.

이는 사전이 아닌, 알고리즘(규칙) 에 의해 변환하기 때문이다.

 

 


 

표제어 추출 (Lemmatization)

 

 

표제어 추출이란, 주어진 단어를 사전에 정의된 기본형으로변환해주는 것이다.

어간 추출과 달리 사전이 필요하며, 의미적 관점의 기본형을 찾는 작업이다.

WordNetLemmatizer 가 잘 알려져있다.

 

from nltk.stem import WordNetLemmatizer

lemmatizer = WordNetLemmatizer()
print(lemmatizer.lemmatize('cooking'), lemmatizer.lemmatize('cooking', pos = 'v'))
print(lemmatizer.lemmatize('cookery'), lemmatizer.lemmatize('cookbookds'))

 

lemmatize = ( 'word' , pos = ) 에서 pos 는 품사를 말한다.

 

tokenize 결과가 was 이지만 wordnetlemmatizer 를 돌리면 wa 로 추출이 된다.

이는 was 등은 품사를 모르기 때문에 형태적으로 접근하여, pos = 'v' 를 지정하면 be를 반환한다.

 

 


 

 ※ 해당 자료는 모두 공공 빅데이터 청년 인턴 교재들을 참고합니다.

Comments