Deep Learning

Deep Learning - GloVe Embedding Layer을 이용한 Fake News 구별하기 Part1

electronicprogrammer 2020. 10. 10. 11:43

데이터 출처 : www.kaggle.com/clmentbisaillon/fake-and-real-news-dataset

 

Fake and real news dataset

Classifying the news

www.kaggle.com

 

ipynb file :github.com/sangHa0411/DataScience/blob/main/FakeNews_Detection.ipynb

 

sangHa0411/DataScience

Contribute to sangHa0411/DataScience development by creating an account on GitHub.

github.com

 

참고 자료 : www.kaggle.com/madz2000/nlp-using-glove-embeddings-99-87-accuracy

 

NLP using GloVe Embeddings(99.87% Accuracy)

Explore and run machine learning code with Kaggle Notebooks | Using data from multiple data sources

www.kaggle.com

 

이번 포스팅에서는 GloVe Embedding Layer를 이용해서 Fake News와 Real News를 비교해보겠습니다.

이번 포스팅의 핵심 과정은 위 참고자료를 참고해서 구현하였습니다. 위 참고자료에 설명이 잘 되어있으니 읽어보시는 것을 추천드립니다.

Part1에서는 데이터 분석을 하고 Part2에서는 GloVe Embeddings을 이용해서 LSTM 기반 Text Classification 문제를 해결해보겠습니다.

먼저 Pandas를 이용해서 데이터를 불러오겠습니다.

 

Fake News 및 True News 각 데이터가 대략 22000개 정도 있는 것을 확인하였습니다.

데이터의 구조는 아래와 같습니다.

기사 제목 , 기사 내용 , subject 그리고 date가 있는 것을 확인하였습니다.

 

먼저 News의 Subject를 비교해서 확인해보겠습니다.

True News의 경우에는 politicsNews 및 worldnews subject가 2가지만 있는 것을 확인하였습니다.

그에 비해서 Fake News의 경우에는 여러가지의 subject가 있는 것을 확인하였습니다.

 

다음은 기사 제목의 길이에 대한 히스토그램을 만들어서 시각화해보겠습니다.

Fake News의 경우 제목의 길이가 Ture News보다 조금 더 긴 편인 것을 확인할 수 있습니다.

 

이제 기사 내용의 길이에 대해서 히스토그램을 만들어서 시각화하겠습니다.

기사 내용에 대해서는 길이가 대부분 비슷하다는 것을 확인할 수 있었습니다.

 

이제 Date에 대해서 분석해보겠습니다.

먼저 데이터의 Date Column에 있는 December등과 정보를 12 등으로 바꾸기 위해서 mapping Dictionary를 만듭니다.

 

이제 이를 이용해서 Date 정보를 변경해서 각 Date에 뉴스 기사가 몇 개인지를 파악합니다.

 

먼저 True News에 대해서 시각화 해보겠습니다.

각 날짜에 대한 뉴스 갯수가 500개 정도로 유지되다가 2017 9월 이후로 3000개로 급증한 것을 알 수 있습니다.

 

Fake News에 대해 시각화 해보겠습니다,

그에 비해 Fake News는 2016년 부터 계속 1000개 정도인 것을 확인할 수 있습니다,

 

이제 이를 비교해서 같은 bar chart에 표기해보도록 하겠습니다.

먼저 공통된 데이터의 인덱스의 길이의 총 3배가 되는 길이의 인덱스 리스트를 만듭니다.

처음은 True Data , 2번째는 Fake Data , 3번째는 공백으로 설정해서 한꺼번에 Bar Chart로 시각화할 계획입니다.

True Data는 3i + 0 즉 (0,3,6,9,12 ....) 

Fake Data는 3i + 1  (1,4,7,10,13 .....) 등으로 되는 인덱스 리스트를 만듭니다.

아래는 이를 이용해서 만든 Bar Chart입니다.

 

이제 Text Data에 대해서 분석해보겠습니다.

먼저 필요한 라이브러리를 불러옵니다.

 

첫번째로 각 데이터의 제목을 이용해서 word cloud를 만들어보겠습니다.

먼저 Fake 데이터 제목에 대한 word cloud입니다.

Hillary , Trump , Obama , 등의 단어가 눈에 띄는 것을 확인할 수 있으며 대부분 정치 용어가 많은 것을 확인할 수 있습니다.

 

다음은 True 데이터의 제목에 대한 word cloud입니다.

True 데이터의 제목들도 정치적인 단어가 상당히 보이지만 Fake 데이터와의 차이점은 'say' 단어가 눈에 띄는 것을 확인할 수 있습니다.

그리고 특정 인물을 언급하는 것이 아니라 조직 및 기관등을 언급되는 것을 확인할 수 있습니다.

 

이제 구체적인 수치로 어떤 단어가 많이 등장했는지를 확인해보겠습니다.

먼저 Text 데이터를 전처리하는 함수를 정의하겠습니다.

1. 먼저 알파벳은 모두 소문자로 변경합니다.

2. http로 시작하는 url를 삭제합니다.

3. #hasttag , @mention 의 단어들을 삭제합니다.

4. 알파벳 이외의 모든 특수문자는 삭제합니다,

5. 여기서 nltk의 STOPWORDS을 이용해서 필터링해서 유효단어만을 선정해서 리스트에 저장합니다.

 

그리고 이 함수를 이용해서 text 전처리를 합니다.

 

이제 Collections 의 Counter를 이용해서 각 단어와 수를 짝 지어서 어떠한 단어가 가장 많이 나왔는지 확인해보겠습니다,

생략된  과정은 위 github죽소에 가시면 확인하실 수 있습니다.

 

이제 여기서 상위 10개의 단어를 선택해서 bar chart로 그려보겠습니다.

 

이제 여기서 한개의 단어 뿐만 아니라 2개 , 3개의 단어 조합의 등장 횟수를 살펴보겠습니다.

위 함수는 Text에서  g개로 된 구성된 단어들의 등장 횟수를 파악하고 상위 n개만을 반환하는 함수입니다.

 

이제 많이 등장한 순서로 상위 12개의 biagram에 대해서 갯수를 파악하고 bar chart를 이용해서 시각화 해보겠습니다.

donald trump , united states와 같은 단어들이 많이 나온 것을 확인할 수 있습니다.

이제 많이 등장한 순서로 상위 12개의 triagram에 대해서 갯수를 파악하고 bar chart를 이용해서 시각화 해보겠습니다.

 

이렇게 해서 데이터 분석인 Part1을 마치고 Part2에서는 GloVe Embedding을 이용해서 Text Classification을 하는 RNN을 설계 및 학습시키도록 하겠습니다.