자세한 코드는 제 깃허브에 올려놓았습니다.
뉴스 기사를 크롤링 &새로운 뉴스 카테고리 예측 모델 만들기
이번 시간에는 뉴스를 크롤링하고, 뉴스의 카테고리를 예측하는 머신러닝 모델을 만들어봅시다.
먼저 필요한 모듈들을 설치해줍니다.
1 |
|
1. 데이터 불러오기
먼저, 뉴스 기사를 크롤링 한 csv파일을 읽어옵니다.
1 |
|
1 |
|
news | code | |
---|---|---|
0 | 파주시청. 사진제공=파주시 파주시청. 사진제공=파주시\n\n[파주=파이낸셜뉴스 강근... | 사회 |
1 | 동영상 뉴스\n\n이천 물류창고 화재 발화지점으로 지목된 지하 2층에서 산소절단기의... | 사회 |
2 | 황범순 의정부시 부시장 을지대학교 의정부캠퍼스 및 부속병원 공사현장 안전점검. 사진... | 사회 |
3 | 귀갓길 여성을 쫓아가 성범죄를 시도한 20대 남성이 구속됐습니다.서울 강남경찰서는 ... | 사회 |
4 | (서울=연합뉴스) 대한약사회가 6일부터 코로나바이러스 감염증 대응 체계를 '사회적 ... | 사회 |
5 | 질서정연 코로나19 확산 방지를 위한 ‘물리적 거리 두기’가 ‘생활 속 거리 두기’... | 사회 |
6 | “코로나19에 걸렸다 나은 친구는 아무래도 좀 멀리하게 될 것 같아요. 재발 가능성... | 사회 |
7 | 1977년 메이저리그 LA 다저스의 시즌 마지막 경기였다. 신인 타자 더스티 베이커... | 사회 |
8 | 6일 등교수업을 앞둔 경북 한 학교의 보건실에는 손소독제, 마스크 등 방역물품이 상... | 사회 |
9 | 경찰 로고./뉴스1 © News1 신채린 기자 경찰 로고./뉴스1 © News1 신... | 사회 |
2. 데이터 전처리
이제 이 뉴스 데이터에 대해 전처리를 진행해야하는데, 이 nenw 데이터는 각종 HTML 태그들이 섞여있습니다. 먼저, 한글 외에는 전부 제거하도록 정규표현식을 이용하여 전처리를 진행합니다.
1 |
|
1 |
|
그리고 데이터에 Null값이 있는지 확인해봅시다.
1 |
|
1 |
|
null값을 가진 샘플은 없습니다. 그러면 중복은 있을까요?
중복을 제거해봅시다.
1 |
|
1 |
|
와! 엄청 많이 줄었네요!!
3. 데이터 탐색
이제 각 카테고리별 샘플의 분포를 확인해봅시다.
먼저 matplotlib에서는 한글이 깨지는데, ubuntu 환경인 경우에는 아래와 같은 방법으로 한글 글꼴을 설치해봅시다.
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
4. 토큰화
자연어 처리에서 대부분의 경우 문자열은 특정 단위로 나누어져야만합니다. 자연어 처리에서는 이 특정 단위를 ‘토큰(token)’이라고 하며 이 과정은 토큰화(tokenization) 또는 토크나이징(tokenizing)이라고 합니다.
토큰을 찾고 분석하기 위해서는 형태소 패키지 라이브러리, Mecab을 설치해야 합니다.
OS별로 설치 방법이 다르니, 아래 링크에서 확인해보세요!
https://konlpy.org/en/latest/install/
Mecab의 .morphs
를 사용하면 입력 문자열을 형태소 단위로 나누어줍니다.
1 |
|
1 |
|
입력된 문자열이 토큰화 된 것을 볼 수 있습니다. 자연어 처리에서는 토큰화 결과가 얼마나 정확한지에 따라 그 성능에 많은 영향을 받기 때문에 항상 조심해주는 것이 좋습니다.
불용어(stopwords) 제거
이제 형태소 분석기를 사용해 토큰화 전처리를 해봅시다. 바로 불용어를 제거해주는 것인데요, 불용어란 데이터 전체에서 꽤 많이 등장하지만 자연어 처리에 큰 영향을 주지 않는, 중요하지 않은 단어들을 말합니다. 주로 조사나 접사 등이 불용어에 속합니다.
이 데이터의 불용어를 정의해봅시다.
1 |
|
불용어는 미리 짐작하여 한번에 정의하는 것이 아니라, 토큰화 과정을 거친 결과를 지속적으로 확인하면서 계속해서 추가하는 것이 일반적 입니다.
토큰화 및 토큰화 과정에서 불용어를 제거하는 함수를 만들어봅시다.
1 |
|
1 |
|
1 |
|
불용어가 제거된 상태로, 띄어쓰기 단위로 토큰화 된 데이터라고 볼 수 있습니다.
5. 머신러닝 사용하기
데이터에 대한 전처리가 끝났습니다. 이제 머신러닝 모델을 적용해보도록 해요.
우리가 사용할 머신러닝 모델은 나이브 베이즈 분류기라는 모델입니다. 나이브 베이즈 분류기는 아래 영상에서 확인해보세요!
5.1 필요한 라이브러리 및 모듈 import
우선 머신러닝 모델 적용을 위해 필요한 도구를 import 합니다.
1 |
|
사이킷런(scikit-learn 또는 sklearn)는 훈련 데이터와 테스트 데이터를 분리하는데 유용한 train_test_split()
함수를 제공합니다. train_test_split()
에 사용할 데이터를 입력하면 훈련 데이터와 테스트 데이터로 분리해줍니다.
1 |
|
1 |
|
기계는 텍스트보다는 숫자를 더 잘 처리합니다. 머신러닝 모델인 나이브 베이즈 분류기를 사용하기 위해서는 각 뉴스의 텍스트 데이터를 벡터로 변환할 필요가 있습니다. 이를 위해 전처리로 TF-IDF라는 방법을 사용하겠습니다.
TF-IDF에 대해서는 아래 링크에서 확인해보세요!
https://www.youtube.com/watch?v=meEchvkdB1U&feature=emb_title
각 뉴스 문서를 TF-IDF 벡터로 바꾸고, 이를 통해 나이브 베이즈 분류기를 학습해봅시다.
fit_transform()
함수는 fir과 transform을 연이어 수행하는 함수로, CountVectorizer.fit_transform()
은 단어 데이터를 학습하고 문서 데이터를 document-form matrix로 변환하는 두가지 작업을 해줍니다.
1 |
|
나이브 베이즈 분류기가 학습되었습니다. 모델이 학습되었다면 그 다음 해야 할 일은 바로 ‘테스트’입니다. 이 모델이 제대로 학습되었는지를 확인해봐야겠죠?
텍스트를 입력하면 자동으로 TF-IDF 벡터로 바꾸는 전처리 함수를 만들어보겠습니다. 이 함수를 통해 텍스트를 바로 나이브베이즈 분류기의 입력으로 사용함으로써 보다 용이하게 테스트 할 수 있습니다.
1 |
|
임의의 뉴스에 대해서 카테고리를 확인해봅시다. 이 뉴스들은 훈련 데이터, 테스트 데이터 그 어디에도 속하지 않는 임의로 가져온 뉴스입니다. clf.predict()
는 임의의 입력에 대해서 나이브 베이즈 분류기가 예측한 값을 리턴합니다.
1 |
|
1 |
|
내용을 봤을 때, 사회 뉴스로 예측하는 것이 적절합니다.
1 |
|
1 |
|
영화 관련 뉴스에서는 생활/문화 뉴스로 예측하네요!
1 |
|
1 |
|
LG전자의 LG벨벳 뉴스에 대해서는 IT/과학 뉴스라고 예측하고 있습니다. 이제 테스트 데이터에 대해서 모델을 예측하게 하고, 실제 값과 비교하여 점수를 측정해봅시다.
1 |
|
1 |
|
머신러닝 모델의 성능 측정 방법 중 하나인 F1-Score에서 81%의 준수한 정확도를 얻어냈습니다!
F1 스코어에 대해서는 아래 링크에서 확인해주세요!
1 |
|