본문 바로가기
자연어처리

[자연어] 트위터 문자 분류 문제를 통한 자연어 처리 실습(1)

by 다람이도토리 2021. 9. 1.

트위터 문자 분류 문제를 통한 자연어 처리 실습.

캐글의 여러 노트북을 참고하여 따라해보았고, 개인적으로 진행 가능한 부분을 추가해보았다.

문제 설명

문제 출처 : https://www.kaggle.com/c/nlp-getting-started

트위터의 메세지를 보고, 해당 메시지가 재난에 관련된 내용인지 아닌지를 분류하는 간단한 문제이다.

먼저 간단한 전처리 이후, 나이브 베이즈를 활용하여 분류하는 방법을 알아보자.

탐색 및 전처리 과정

Train set 확인

댜음과같이 각 메세지별로 키워드와 작성 위치, text 내용이 적혀있다.
1일 경우 재난 관련 내용이, 0일 경우 재난이 아닌 내용이 담겨있다는 의미이다.

1과 0의 비율 확인을 해보면 다음과 같다.

데이터의 불균형은 크지가 않아, 크게 문제되지는 않는다.

문자열 정제

숫자나 특수문자, 문장부호 대문자들이 마구 섞여있다. 이것을 남겨둘 경우 각각을 다른 단어로 인식하기에 좋지 않다.
정규 표현식은 추후에 정식으로 다루기로 하고 이번에는 캐글 내 노트북을 바탕으로 정제를 따라해보았다.

 

이 상태에서 바로 Tf-idf를 적용하여도 어느정도 분류의 결과를 얻어낼 수 있다.

Scikit-Learn의 TfIdfVectorizer을 통해 바로 토큰화 이후 stop_words까지 지정 가능하다.

Remark / MultinomialNB vs GaussianNB
MultinomialNB는 이산적인 문제에 적용, GaussianNB는 연속형에 적용한다.

추가 전처리 : 표제어 추출(Lemmatizer)

단어의 표제어를 추출하여 여러 형태로 변형된 단어 (예시, 단수, 복수형의 경우는 단수 통일) 를 표재어 기준으로 통일시키는 작업을 실시한다.

다른 벡터화 사용 및 결과 확인

또한 벡터화에 있어서 TfIdf와 함께 CountVectorizer을 고려해볼 수 있다. 두 개의 결과를 비교하면 다음과 같다.

평균적으로는 CountVectorizer가 조금 더 좋은 성능을 보이는데 이는 재난 문자는 공통적인 키워드가 들어가 있을 것이기에 Tf-Idf보다는 공통어에도 높은 가중치를 줄 수 있는 CounterVectorizer가 좋을 것이다.

 

전체코드  - Word2Vec 적용중입니다.

https://github.com/SeongwonTak/Data_Practices/blob/master/Disaster_Tweeter/Disaster_Tweet_Classfication.ipynb