관리 메뉴

꿈 많은 사람의 이야기

파이썬 케라스(keras)로 딥러닝하자! LSTM(RNN)을 이용해 뉴스 기사 분류하기 본문

deep learning(딥러닝)

파이썬 케라스(keras)로 딥러닝하자! LSTM(RNN)을 이용해 뉴스 기사 분류하기

이수진의 블로그 이수진의 블로그 2018.12.04 09:51


파이썬으로 케라스(keras)글을 오랜만에 올립니다.

그 동안 공부도 많이 못했고(일을 핑계 삼아..) 여태 공부했던 것들 정리하고 좀 다지는 시간을 가졌습니다.

 

그리고 개인적으로 관심이 있는 자연어처리(NLP)쪽 프로젝트를 딥러닝 기반으로 개인 프로젝트 식으로 진행했습니다.

 

주제는 뉴스 카테고리 분류 및 핵심 키워드 추출과 연관 단어 분석입니다.

일종의 news category classification 입니다. 여기에 word2vectf-idf를 섞은 것이죠.

뭔가 말이 거창하네요.

 

쓰여진 알고리즘은 다음과 같습니다

LSTM(Long Short Term Memory) RNN의 종류

Word2vec 단어를 벡터화

Tf-idf 문서의 핵심 키워드 추출

Logistic regression 사이킷런(scikit-learn) 머신러닝 할 때에 사용

 

음 대략 이렇게 되겠네요.

 

진행 순서는 크롤러 -> 형태소 분석 -> 모델 훈련 -> 웹 띄우기

이렇게 진행됐습니다.

 

웹은 파이썬 웹 프레임워크인 Django로 진행했습니다.

 

어떻게 모델을 만들었는지 하나하나 작성하려고 합니다.



먼저 저는 크롤러(crawler)를 만들었습니다. 뉴스 기사를 수집하기 위한 것이죠.

정치, 경제, IT, 연예에 대한 기사를 수집했습니다.



이렇게 driver를 이용해서 크롬 드라이버를 잡고 beautifulsoupselenium을 이용해서 데이터를 수집했습니다.



뉴스 기사는 올해 6월부터 최근 10월까지 데이터를 수집했습니다

그리고 각 데이터는 폴더별로 넣어놨구요!



그리고 각 주제 마다 기사 개수는 대략 2~3만개 정도 됐죠. (IT, 경제 등 각 주제마다 2~3만개)

그래서 1달 데이터 대략 25000x 4(4개 카테고리)라서 달마다 10만개 정도. 50만개 정도의 데이터를 수집했습니다.



크롤링한 기사는 이렇게 나오네요. 9월 기준으로 봤을때입니다.



그리고 형태소 분석을 진행합니다.

형태소 분석은 은전한닢(mecab)을 이용했습니다. 근데 형태소 분석기에서 분석이 안되는 단어들이 있을 수 있으니까 사용자 사전을 만들줍니다. 이렇게요

예를 들어서 북한, 남북정상, 트럼프, 문재인대통령 등의 단어는 인지를 못할 수도 있으니까 넣어줍니다.

직접 만든 사용자 단어 사전의 단어 개수는 대략 2천개 정도 됐습니다.



그리고 이걸 mecab에서 사용할 수 있도록 만들어주는 파이썬 프로그램을 하나 코딩해서 위와 같이 해줍니다.(귀찮아서 다 그냥 명사로 처리했습니다 ㅠ)



이제 형태소 분석을 진행합니다. Mecab을 불러와서요



그리고 태그 클래스를 둡니다. 이 태그를 이용해서 해당 되는 태그만 추출하죠



그리고 카테고리를 숫자화 해줍니다. 정치는 0, 경제는 1, IT 2, 연예는 3으로요.



이렇게 형태소 분석기가 끝나면 위 사진처럼 문장이 아닌 형태소 분석된 결과가 나오게 됩니다! 자 이제 이 데이터로 훈련을 시켜봅니다.



먼저 전부 다 훈련 시키지 말고 7월달 데이터만 가지고 훈련을 해보겠습니다.

처음부터 전부 다 훈련을 시키면 시간도 오래걸리고 만약 잘 안될 경우에는 시간 소모가 너무 크기 때문입니다

그래서 1달 데이터로만 해줍니다.

 

위에서 말씀 드렸듯이 10만개 데이터입니다. 1달당 10만개입니다.



그리고 가장 많이 사용된 단어 5천개를 사용할 것입니다. 길이는 500으로 제한하겠습니다.

뉴스마다 길이가 다르기 때문에 얘를 고정시켜줍니다.



이제 sequences 변수에 text_to_sequences를 이용해서 텍스트를 시퀀스화 시켜줍니다.



그 다음 sequence martix으로 만들어줍니다. 이때 최대 길이를 제한합니다

이제 훈련 준비가 마쳤습니다.



이제 데이터를 traintest로 나눠줍니다.



그리고 모델을 생성했죠. Embedding layer를 이용해 먼저 단어를 임베딩 시켜줍니다

그리고 LSTM 모델을 쌓고 다음은 Dense layer를 통해서 모델을 만들어줍니다.

사실 모델은 이렇게 했지만 다른 방법으로도 많이 해봤습니다. CNN 1D를 이용해보기도 했구요. global_max_pooling1d를 안쓰기도 했고 dropout을 더 추가해보기도 했구요.

이거는 응용하기 나름인 것 같습니다.



훈련을 시키면 자 훈련이 잘 진행되고 있습니다!



마지막 훈련 결과를 보니까 정확도(accuracy)가 무려 95%가 나왔네요

아무래도 정치, 경제, IT, 연예는 너무나 다르기 때문에 잘 나온 것 같습니다.



Loss도 잘 떨어지는 것을 그래프로 볼 수 있습니다.




자 이제 전체 데이터로 해볼까요? 48만개 정도 되는 전체 데이터 입니다.



똑같은 모델로 훈련시켜줍니다. 그리고 정확도(accuracy)를 보니 생각보다 다 높게 나오네요!



그럼 머신러닝에서는 어떨까요? 아무래도 좀 더 느리긴 합니다만 머신러닝도 성능이 꽤나 좋게 나옵니다



여기서는 TfidVectorizer와 LogisticRegression을 사용했습니다

96%의 정확도가 나오네요



자 이제 여기서 뽑아낼 수 있는 것은 tf-idf값입니다

각 문서에서 어떤 단어가 핵심 단어인지 알아내는 것이죠. 6월기준 tf-idf가 높은 값은 복권, 난민, 티맥스, 코딩, 수박, 타이어, 김광석 등이네요


자 이제 이것을 이용해서 Django를 이용해 서비스를 간단하게 만들어봅니다.

장고로 코딩한 것은너무 설명하기도 복잡하고(복잡하진 않지만..) 글이 길어지니까 생략하겠습니다.




자 여기 뉴스 기사가 하나 있네요.

최근에 있었던 나사(NASA)의 화성 탐사 로봇입니다. 인사이트호이죠.



이 기사를 복사해서 넣어줍니다. 그리고 검색! 버튼을 눌러주면~



자 이렇게 나오네요. 원래 위에 형태소 분석 결과도 나오는데 이 부분은 짤렸네요

IT라고 category classification을 잘했습니다. 그리고 문서의 핵심 단어들이 나오네요.

그리고 그 문서의 핵심 단어 여기서는 화성, 지구, 큐브인데요. 이 단어와 관련된 연관 단어를 또 시각화로 뿌려줍니다. 화성과 관련된 단어는 혜왕성, 탐사, 탐사선, 지구 등이 있네요.

그리고 지구와 관련된 단어는 명왕성, 온난, 온난화가 있네요. 온난화가 최근 이슈였으니까 이런 단어가 나오는 것 같습니다.

 

이렇게 간단하게 딥러닝 LSTM을 이용해서 뉴스 카테고리 분류(news category classification)을 해보았습니다. 그리고 word2vectf-idf를 이용해서 핵심 단어 및 연관 단어를 추출해봤죠.

 

다음에도 이런식으로 좀 그럴듯하게 해봐야겠네요

정확도만 뽑아내서는 별 의미가 없는 것 같아서요.. 개인적으로는

 

아이구 독학하기 힘드네요 ㅠ



6 Comments
댓글쓰기 폼