최근 네이버 뉴스 기사를 토대로 카테고리를 분류하는 머신러닝을 진행해봤다
먼저 정치, 경제, 사회, IT 등을 파이썬으로 크롤링했다
데이터는 아래와 같이 모아졌다
각 카테고리별 폴더로 데이터를 떨궜다.
문화, 경제, it, 오피니언, 정치, 사회 총 6개의 카테고리를 크롤링했으며
위와 같이 엑셀파일에 날짜, 제목, 내용을 긁어왔다.
이제 이 내용들을 전처리 작업 및 형태소 분석을 해야했다.
왜냐하면 content에 보면 위와 같이 flash 오류를 우회하기 위한 함수 추가 등 이런 문구가 있다.
또한, 특수 문자를 제거할 것이었고, 숫자, 영어도 제거하려고 했다.
왜냐하면 한글을 기준으로 하려고 했기 때문이다
형태소 분석기는 은전한닢(mecab)으로 진행했다.
은전한닢은 한글 형태소 분석기로 정말 좋다
konlpy에 있는 twitter, kkma, 코모란 등도 있지만 은전한닢이 추출하는데 더 뛰어난 것 같아 선택했다.
단, 윈도우에는 설치가 힘들어서 개인적인 centos에 설치했다.
일단 먼저 전처리 작업부터 진행했다.
일단 각 파일에 있는 저 문구들을 대체할 dic 해시를 만들었다.
저 값들이 나오게 되면 그냥 없애버리는 방식이다
그리고 위 처럼 모든 카테고리의 모든 엑셀파일을 돌면서
각 파일 내용을 참조하면서
한글, 영어, 숫자가 아닌 값들을 제거한다.
즉, 필요없는 특수문자를 제거한다.
어차피 mecab 은전한닢을 사용하면 영어, 숫자는 자동으로 없어지기에
딱히 신경을 안써도 된다
물론 그 전에 없애면 더 좋지만~
그 전처리한 결과를 텍스트 파일로 위와 같이 떨궜다.
각 엑셀의 이름과 동일하게 txt로만 바꿔서 했다.
이제 은전한닢을 진행한다
아래와 같이 사용가능하다
mecab.tagger를 통해 단어 사전을 불러오고
parse에다가 문자열을 넣어 진행한다
이렇게 모든 텍스트 파일에 적용하면
이렇게 나오게 된다.
나는 여기서 명사만 추출했다. 형용사, 동사는 딱히 필요가 없고 데이터도 썩 좋지 않게 나와서 뺐다.
필요하다면 넣어도 상관은 없다.
그리고 지금 데이터 셋이 총 19개로 매우 부족한 상태였다.
물론, 텍스트 파일 하나하나에는 내용이 많지만 머신러닝 혹은 딥러닝 할 때에는 각 파일이 하나의 데이터 셋이니까
매우 부족하다
그래서 안에 있는 파일 내용을 좀 분리했다.
, 를 기준으로 split해서 500개씩 나눠 각 텍스트 파일을 만들었다.
그러면 데이터 셋이 충분히 갖추어 지기 때문이다.
이렇게 말이다.
이 과정을 거치니 총 데이터 셋이 4천개 정도 되었다!
이제 머신러닝을 진행해야 한다.
하지만, 그 전에 단어 사전을 구축해야 한다.
쉽게 말하면 bag of word(BOW)라고 한다.
단어 가방을 만드는 형태인데 이 과정을 왜 거치냐면
머신러닝은 속성값에 숫자를 넣으면 상관이 없지만 이건 지금 문자형태이다
이 문자에 해당하는 id 값을 부여하는 것이다.
예를 들어, '가'는 1, '나'는 2, '학교'는 3, '북미정상회담'은 4, '월드컵'은 5
'스웨덴'은 6, '문재인'은 7, '트럼프'는 8, 이런식으로 말이다.
각 id 값을 부여하는 것이다.
이렇게 파이썬 딕셔너리(해시)를 사용해서 단어 가방을 만들었다.
그리고 만들어지면 json 형태로 저장했다
이제 이 단어 사전을 기반으로 머신러닝을 돌린다
나는 케라스(keras)라이브러리를 사용했다.
그냥 사이킷런(scikit-learn)으로 svm을 돌리는 등으로 할 수 있지만
케라스를 연습하고 싶고, 어차피 케라스에서 부족한 부분은 사이킷런으로 채울 수 있기에 케라스로 했다.
아까 저장한 단어 사전 json 파일을 가지고 온다.
그리고 X는 속성, Y는 클래스로 나뉘어져 있다. 이 값들을 가져와서
train_test_split 함수를 통해 데이터를 테스트와 훈련 셋으로 나눠준다.
그 다음 sequential를 불러와서 모델을 만든다.
model.add에다가 Dense를 이용해 층을 쌓는다.
활성화 함수는 relu(렐루)를 사용, 출력층 활성화 함수는 softmax(소프트맥스)를 사용했다
그리고 훈련을 진행!
카테고리를 분류할 수 있게 되었다!
다음에는 이것에 대한 맵리듀스를 통해 워드카운팅을 진행할 것이다.
맵리듀스는 spark(스파크)를 사용, 그 중에서 pyspark(파이스파크)를 사용할 것이다.
그리고 wordcloud도 파이썬으로 진행할 것이다.
또한, word2vec(워드투벡터)를 통해서 단어간의 관계도를 볼 것이다
'deep learning(딥러닝)' 카테고리의 다른 글
파이썬 케라스(keras)로CNN 딥러닝하자! cat dog binary image classification (103) | 2018.07.04 |
---|---|
파이썬 케라스(keras)로 딥러닝하자! CNN을 이용해 이미지 분류하기(image classification) (205) | 2018.06.29 |
파이썬 케라스(keras)로 딥러닝하자! val_loss 향상 이슈 및 정확도 문제(not improve val_loss) (13) | 2018.06.21 |
파이썬 워드클라우드(python wordcloud)와 gensim의 word2vec를 이용한 분석 (2) | 2018.06.19 |
파이썬 케라스(keras)와 사이킷런(scikit-learn)으로 머신러닝, 딥러닝 해보자! - 비만도 측정 (4) | 2018.06.11 |