자연어 처리(NLP, natural language processing)란?

자연어는 사람이 일상적으로 사용하는 언어를 의미한다. 자연어는 일반적으로 컴퓨와 같은 기계는 이해하기 힘들다. 이런 자연어를 형태소 분석, 품사 부착,구절 단위 분석 등을 통해 컴퓨터가 자연어를 이해하고 학습할 수 있게 해 주는 것을 자연어 처리라고 한다..

다양한 자연어 처리 관련 경진 대회중 아래 링크의 경진 대회를 통해 실습을 해보려고 한다.  

https://www.kaggle.com/c/word2vec-nlp-tutorial

 

Bag of Words Meets Bags of Popcorn

Use Google's Word2Vec for movie reviews

www.kaggle.com

위 kaggle competition의 주제는 영화 리뷰(텍스트)를 읽고 그 리뷰가 영화를 추천하는지 아닌지를 예측하는 것이다.
평가하는 기준은 ROC커브를 이용한다.

ROC curve (Receiver Operating Characteristic curve) : FPR과 TPR을 각각 x,y축으로 놓은 그래프이다. X,Y의 범위는 (0,1)이다. 면적이 1에 가까울수록 성능이 좋다.

TPR(True Positive Rate)은 실제는 참인데 참이라 예측한 비율 -->민감도
FPR(False Positive Rate)은 실제는 거짓인데 참이라 잘못 예측한 비율 --> 특이도

출처:  https://newsight.tistory.com/53  [New Sight]

 

또한 위 kaggle competition는 3단계로 이루어진 Tutorial을 제공한다.
앞으로 위 Tutorial과 인프런강의 중[NLP] IMDB 영화리뷰 감정 분석을 통한 파이썬 텍스트 분석과 자연어 처리 강의를 참고하여 실습을 진행 하겠다.

강의 링크:
www.inflearn.com/course/nlp-imdb-파이썬-자연어-처리

Part 1은 초보자를 위한 기본적인 자연어 처리를 다룬다. 만약 자연어 처리 숙련자라면 part1은 넘겨도 상관없다.
Part2,3은 Word2vec을 사용하여 모델을 학습시키는 심화과정이다. 
이글에서는 먼저 Part 1부터 다루겠다.


Part 1

Part 1에서는 텍스트 데이터를 수집 후 텍스트를 컴퓨터가 특징을 이해할 수 있게 전처리한 후
리뷰가 긍정인지, 부정인지 다시말해 리뷰가 영화를 추천하는지 예측할 것이다.
이때 Bag of words(BoW) 기법을 사용하여 데이터를 벡터화 해줄것이다.

1. 데이터 불러오기

위 사이트에 들어가 데이터를 다운로드하자 part1에서는 일단 labeledTrainData와 testData를 사용한다.

labeledTrainData는 id-setiment-review 3개의 칼럼으로 이루어져 있다.
id는 글쓴이의 id, setiment=1이면 긍정, 0 이면 부정적인 리뷰를 뜻한다. review는 글쓴이가 쓴 리뷰이다.
testData는 id-review 2개의 컬럼으로 이루어져 있다.

labeledTrainData 데이터를 기반으로 학습을 후  testData의 sentiment를 예측을 해 볼 것이다.

labeledTrainData.tsv
testData.tsv

이제 pandas를 이용해 데이터를 불러올 것이다.

labeledTrainData.tsv에 총 25000개의 리뷰가 있음을 알 수 있다.

describe()를 데이터의 통계를 본 결과 sentiment의 평균값이 거의 딱 절반임을 알 수 있다. 즉 긍정적인 리뷰, 부정적인 리뷰가 딱 절반씩 있음을 알 수 있다.

실제로 각각 절반씩 있다.

2. 데이터 전처리

 텍스트 전처리란 수집한 텍스트 정보들을 정리하여 컴퓨터가 텍스트의 특징을 알 수 있게 만들어 주는 것이다.
텍스트 마이닝 과정 중에서 감히 제일 중요한 부분이라고 말할 수 있을 정도로 매우 중요한 과정이다. 이 텍스트 전처리가 잘되어야 텍스트 분석이 가능해지고 의미가 있기 때문이다.

전처리 하는 과정은 토큰화->불용어 처리->어간 추출->벡터화 순으로 이루어진다. 

데이터 전처리에 하기 앞서 'review'가 어떤 형태인지 먼저 알아보자

리뷰를 보면 중간중간 특수문자 및 html태그가 들어가 있는 것을 알 수 있다. 특수문자나 html태그들은 문장의 의미에 별 영향을 주지 않는 것들이므로 제거해주자
html 태그는 BeautifulSoup를 통해 간편하게 제거해 줄 수 있다.

이제 정규표현식을 이용해 알파벳을 제외한 모든 문자를 제거해 주자

토큰화

이제 불필요한 문자들을 제거하고 순수 알파벳들만 텍스트에 남아있으므로 단어를 기준으로 잘라서 리스트로 만들자.
이 작업을 토큰화라고 한다. 이때 컴퓨터는 대문자와 소문자를 다른 문자로 생각하므로 모든 알파벳을 소문자로 통일해주자

ex) Paint a picture for you and me on the days when we were young.
->paint/a/picture/for/you/and/me/on/the/days/when/we/were/young.

불용어 처리

문장에서 별로 중요하지 않은 단어들을 불용어라고 한다. 이 불용어 들은 학습모델에서도 별다른 기여를 하지 못하기 때문에 토큰화 된 텍스트들 중에서 불용어 들을 제거해준다. 예를 들면 특수문자, I, me, my, this, that, 조사, 접미사 등등이 속한다. 
ex) paint/a/picture/for/you/and/me/on/the/days/when/we/were/young
->paint/picture/days/young

이때 우리는 불용어 처리를 위해 nltk의 stopwords를 사용할 것이다. 
nltk 설치는 cmd창에 pip install nltk를 치면 간단하게 설치는 되지만 아나콘다 유저가 아니라면 nltk에 있는 패키지들이 깔리지 않기 때문에 일일이 본인이 사용하고 싶은 패키지를 다운로드하여야 한다.

다운 방법은 다음과 같다.
C 나 D 드라이브에 nlpk_data 폴더를 만든다.
C:\nltk_data  또는 D:\nltk_data

그다음 nltk_data 폴더 안에 corpora 폴더를 만들어 준다. 

폴더를 만든 후 아래 사이트에서 원하는 패키지를 다운로드하고 corpora 폴더에 압축을 풀면 된다.

www.nltk.org/nltk_data/

stopwords와 나중에 사용할 wordnet패키지를 다운로드하고 압축을 푼 상태이다.
위 사진과 같은 경로로 다운로드하면 된다.

stopwords는 영어의 불용어 들의 리스트 중 하나이다. stopwords에는 총 179개의 불용어가 있다.
아래 코드는 stopwords에 어떤 단어들이 있는지 보여주기 위한 코드이다. 

아래 코드는 토큰 화한 단어들 중 stopwords에 없는 단어만 남기는 방식으로 불용어 처리를 하는 코드이다.

어간 추출

텍스트들의 핵심만 나타낼 수 있게 단어의 핵심인 어간만 추출한다. 이를 스테밍(stemming)이라고 한다.
ex) days -> day,  played -> play, running->run

이 스테밍 작업을 할 때는 알고리즘 기반으로 돌아가는 스테머(형태소 분석기)를 사용한다. 그런데 스테머의 종류가 상당히 다양하고 각각의 스테머에 따라 어간 추출을 하는 알고리즘이 다르다. 그러므로 스테밍을 할때는 스테머가 어간 추출을 어떻게 하는지 잘 알아보고 사용해야 한다.

예를 들어 PoterStemmer(), LancasterStemmer()를 사용해 보았다.
아래 코드는 사용 예시이다.

사용한 스테머에 따라 maxinum이 다르게 분석되는 것을 확인할 수 있다.

추가로 스테밍과 비슷한 Lemmatization 이 있다. 스테밍은 알고리즘을 기반으로 단어의 어간을 추출해서 핵심 의미를 뽑느다면 Lemmatization은 사전을 기반으로 단어를 표준화한다고 생각하면 된다. 따라서 Lemmatization은 상당히 안정적이라는 장점이 있다. 그러나 스테밍은 새로운 단어가 추출이 가능한 반면 Lemmatization은 사전 기반이기 때문에 새로운 단어는 표준화를 못한다는 단점이 있다

추가적으로 Lemmatization은 문맥을 보고 단어의 의미를 식별할 수 있기 때문에 동음이의어 구별이 가능하다.
Lemmatization은 nltk에서 wordnet 패키지를 다운로드하면 사용 가능하다. 아래 코드들을 통해 스테머와 Lemmatization를 비교해 보았다.

다음과 같이 주어진 10개의 단어를 Lemmatization방식과 스테밍 방식으로 분석해 보았다.

이제 리뷰 텍스트 들을 어간 추출까지 해주는 함수를 만들자

이때 stop_words를 list가 아닌 set의 형태로 만들어 준 것은 파이썬에서 배열 안에서 원소를 찾아야 할 때 set이 훨씬 빠르기 때문이다. 

시험 삼아 첫 번째 리뷰에 적용해보았다.

다음 글에서는 정제한 텍스트들을 이용해 Bag of Words(BoW)기법을 사용하여 데이터 전처리의 마지막 단계인 
데이터 벡터화를 할 것이다.

728x90
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 라이프코리아트위터 공유하기
  • shared
  • 카카오스토리 공유하기