꿈 많은 사람의 이야기
파이썬 케라스(keras)로 딥러닝하자! LSTM(RNN)을 이용해 뉴스 기사 분류하기 본문
파이썬으로 케라스(keras)글을 오랜만에 올립니다.
그 동안 공부도 많이 못했고(일을 핑계 삼아..) 여태 공부했던 것들 정리하고 좀 다지는 시간을 가졌습니다.
그리고 개인적으로 관심이 있는 자연어처리(NLP)쪽 프로젝트를 딥러닝 기반으로 개인 프로젝트 식으로 진행했습니다.
주제는 뉴스 카테고리 분류 및 핵심 키워드 추출과 연관 단어 분석입니다.
일종의 news category classification 입니다. 여기에 word2vec와 tf-idf를 섞은 것이죠.
뭔가 말이 거창하네요.
쓰여진 알고리즘은 다음과 같습니다
LSTM(Long Short Term Memory) RNN의 종류
Word2vec 단어를 벡터화
Tf-idf 문서의 핵심 키워드 추출
Logistic regression 사이킷런(scikit-learn) 머신러닝 할 때에 사용
음 대략 이렇게 되겠네요.
진행 순서는 크롤러 -> 형태소 분석 -> 모델 훈련 -> 웹 띄우기
이렇게 진행됐습니다.
웹은 파이썬 웹 프레임워크인 Django로 진행했습니다.
어떻게 모델을 만들었는지 하나하나 작성하려고 합니다.
먼저 저는 크롤러(crawler)를 만들었습니다. 뉴스 기사를 수집하기 위한 것이죠.
정치, 경제, IT, 연예에 대한 기사를 수집했습니다.
이렇게 driver를 이용해서 크롬 드라이버를 잡고 beautifulsoup와 selenium을 이용해서 데이터를 수집했습니다.
뉴스 기사는 올해 6월부터 최근 10월까지 데이터를 수집했습니다
그리고 각 데이터는 폴더별로 넣어놨구요!
그리고 각 주제 마다 기사 개수는 대략 2~3만개 정도 됐죠. (IT, 경제 등 각 주제마다 2~3만개)
그래서 1달 데이터 대략 25000개 x 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으로 만들어줍니다. 이때 최대 길이를 제한합니다.
이제 훈련 준비가 마쳤습니다.
이제 데이터를 train과 test로 나눠줍니다.
그리고 모델을 생성했죠. 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)을 해보았습니다. 그리고 word2vec와 tf-idf를 이용해서 핵심 단어 및 연관 단어를 추출해봤죠.
다음에도 이런식으로 좀 그럴듯하게 해봐야겠네요
정확도만 뽑아내서는 별 의미가 없는 것 같아서요.. 개인적으로는
아이구 독학하기 힘드네요 ㅠ
'deep learning(딥러닝)' 카테고리의 다른 글
cs231n 2017 강의 10강 RNN 정리 (0) | 2018.12.11 |
---|---|
카카오 형태소 분석기(khaiii) 분석 시간 및 딥러닝 모델 성능 비교 (2) | 2018.12.09 |
파이썬 케라스(keras)로 딥러닝하자! LSTM(RNN)을 이용해 뉴스 기사 분류하기 (28) | 2018.12.04 |
카카오 형태소 분석기(khaiii) 설치와 은전한닢(mecab) 형태소 분석기 비교 (26) | 2018.12.02 |
cs231n 2017년 강의 9강 CNN Architectures 정리 (4) | 2018.11.28 |
cs231n 2017 강의 7강 training neural networks part2 정리 (2) | 2018.11.26 |
-
오키여 이수진의 블로그 2018.12.05 14:55 신고 음 글쎄요 저도 많은 카테고리는 해보진 않아서요 ㅠ
단순히 뭐 10개 미만만 가능하다! 이러진 않을겁니다. 50개 이상도 가능하지 않을까 싶어요. 저는 21개까지는 해봤네요.
lr을 이용해서 잘 안되면 랜덤 포레스트 같은 것으로도 이용해보셔요! -
김학생 2019.03.23 16:08 혹시 구현한 코드 깃허브 좀 알 수 있을까요 ?!
-
오키여 이수진의 블로그 2019.03.23 18:01 신고 제 블로그 공지 확인해주세요 ~
-
김건우 2019.09.26 16:23 데이터 수집 기간 얼마나 걸렸나요?
-
오키여 이수진의 블로그 2019.09.26 19:41 신고 3달정도 수집했던 것으로 기억합니다 ~
-
2020.02.10 18:37 비밀댓글입니다
-
다니 2020.04.01 16:21 안녕하세요! 우선 좋은 글 올려주셔서 감사합니다!
제가 이 방법을 사용해서 사회, 생활문화, 정치, IT과학 4가지 카테고리의 뉴스를 이용해서 모델을 만들어봤는데용 정확도는 81퍼센트로 나왔습니다!
그 후에 형태소 분석을 마친 4가지 카테고리 중 하나의 csv파일을 이용해서 X_test와 동일하게 전처리를 해주고 predictions = model.predict(sequences_matrix)를 해봤는데요. predictions[0]의 결과를 보면 정치, IT의 카테고리 분류는 제대로 되지 않는거 같은데 왜 그런지 아시나용..?
데이터는 각 카테고리별로 3000개 정도의 데이터를 수집했습니다! -
오키여 이수진의 블로그 2020.04.02 15:42 신고 안녕하세요. 답글이 좀 늦었습니다.
우선, 글 봐주셔서 감사합니다 ㅎㅎ
음 predict를 하실 때 train data를 만들때와 '똑같이' 하셔야 합니다. train 데이터를 만들 때 사용했던 tokenizer와 등등을 전부 같이 사용해야하죠.
그렇게 나온 벡터를 predict에 넣어줘야 제대로 된 카테고리 분류가 나오게 됩니다.
그리고 단순히, predictions[0]을 하면 숫자로 나오는데요. labelencoder 등에서 정치를 0, 경제를 1 등등 어떻게 했는지 살펴보신 다음 if 조건으로 숫자를 카테고리 문자열로 바꿔주시면 됩니다 ~ -
다니 2020.04.02 19:29 감사합니당!!!
-
오키여 이수진의 블로그 2020.04.02 20:34 신고 감사합니다 ㅎㅎ
-
와우우와 2020.04.04 17:20 잘읽었습니다 ...!!!
-
오키여 이수진의 블로그 2020.04.05 00:05 신고 감사합니다 !
-
다니 2020.05.10 22:57 안녕하세요! 제가 정확도를 좀 더 높여보고 싶어서 그러는데 혹시 직접 만드신 사용자 단어 사전 공유해주실 수 있나요..?
-
오키여 이수진의 블로그 2020.05.11 09:34 신고 안녕하세요~
아쉽게도 사용자 단어 사전은 현재 저한테 없습니다 ㅠㅠ
전 회사에서 하던 업무라서.. 전 회사 PC에 저장되어 있었거든요 ㅠㅠ
죄송합니다 -
다니 2020.05.11 11:05 그렇군요ㅠㅠ 알겠습니다!
답변 감사합니당 -
오키여 이수진의 블로그 2020.05.11 13:47 신고 넵!
-
한빛. 2020.08.05 13:31 안녕하세요~
사용자 사전 만드실 때 단어의 맨 마지막 글자 받침에 따라 True / False 넣는게 있는데
글 봤을때는 전부 F로 넣으신 것 같은데요
혹시 큰 차이가 없을까요?? 아니면 자동으로 기입하다보니 신경쓰지 않으신 부분일까요? -
오키여 이수진의 블로그 2020.08.05 19:29 신고 안녕하세요~
네 저는 단순히 해당 단어가 형태소 분석기에서 통과가 되기 위한 목적으로만 사용했습니다.
그래서 그냥 F로 다 넣었어요 ~
만약에 목적성이 받침 등을 정확히 표시해주어야 한다면 제대로 넣어야 할 것 같습니다!
저는 당시에 크게 신경쓰지 않았어요 ㅎㅎ -
2020.10.07 10:02 비밀댓글입니다
-
한빛. 2020.10.07 16:09 신고 ▲ 수진님 제가 비회원일때 글을쓴거라 수진님이 답변주신게 확인이 안되네요 ㅠㅠㅠ
some58@nate.com 입니다.ㅠ -
오키여 이수진의 블로그 2020.10.07 19:51 신고 아 넵 안녕하세요 ~
댓글 내용을 다시 적어드릴게요!
제가 기존 PC가 갑자기 고장나는 바람에 ㅠㅠ 해당 코드가 날라갔습니다.
하지만 저 플젝 기본 메커니즘은 굉장히 간단합니다.
- 뉴스 카테고리 분류 모델 LSTM
- 뉴스 텍스트를 모아서 word2vec 학습
- 형태소 분석기 사용해서 명사만 추출
이 3가지가 전부입니다. 그리고 나머진 그냥 django로 input만 받도록 한 것이에요!
그리고 이메일은 지우시는 게 좋을 것 같습니다! 노출되시면 다른 분들이 보실 수도 있으니까용 -
지나가는 사람 2020.11.08 01:54 여차저차 혼자 공부하는 학생입니다. 많은 도움 받고 갑니다!!ㅠㅠ!!
-
오키여 이수진의 블로그 2020.11.08 15:53 신고 안녕하세요 ~ 도움이 되셨다니 다행입니다 :)
-
한빛. 2020.11.16 02:10 신고 수진님 안녕하세요! 자연어처리공부하고있는데요...네이버뉴스가.. TF-IDF없이
형태소분석+워드투벡+LSTM으로 카테고리 분류만으로도 분류가 잘되나해서요.. 이론적으로 가능한지 궁금합니다.. -
오키여 이수진의 블로그 2020.11.16 20:26 신고 안녕하세요~
네 충분히 가능합니다. 하지만 아래와 같은 것을 신경써야하고 조건이 필요하죠.
1. 네이버 뉴스라고 하셨는데 정확히 어떤 카테고리를 가지고 있는가?
2. 형태소 분석을 하기 위한 OOV(Out-Of-Vocab)이 잘 되어 있는가?
3. 데이터 셋이 충분히 갖추어져 있는가?
등 대표적인 위 조건만 만족된다면 충분히 가능합니다. TF-IDF를 사용하면 물론 더 좋겠지만, 필수조건은 아닙니다.