본문 바로가기

Artificial Intelligence/Machine Learning

[Machine Learning] 가짜 뉴스 분류 모델 - 데이터 전처리

728x90

[Machine Learning] 가짜 뉴스 분류 모델 - 데이터 수집 및 확인의 내용에서 이어집니다. result_df에 있는 title과 text 열에 있는 데이터에서 필요한 부분과 필요하지 않은 부분으로 나누어서 데이터 전처리를 진행하겠습니다.

 

import nltk
nltk.download('stopwords')
nltk.download("names")

[nltk_data] Downloading package stopwords to
.
.
.
[nltk_data]   Package names is already up-to-date!
True

 

영어 텍스트 데이터 전처리를 위해서 nltk를 import 하고, stopwords와 names를 다운로드해준다. 마지막에 True가 출력되어야 정성적으로 설치가 진행된 것이다.

 

from nltk.corpus import stopwords
from nltk.corpus import names

 

stopwords와 names를 설치했다면 stopwords와 names를 import 해준다.

 

all_names = set(names.words())

 

names.words를 all_names에 저장해준다.

 

all_names_copy = list(all_names)
print(all_names_copy[:5])

['Alane', 'Welbie', 'Carolann', 'Teador', 'Elwyn']

 

all_names에는 영어로 된 이름들이 저장되어있다.

 

import string
def clean_text(mess):
    stop_words = stopwords.words('english')
    del_punctuation = [char.lower() for char in mess if char not in string.punctuation]
    del_punctuation = ''.join(del_punctuation)
    
    return ' '.join([word for word in del_punctuation.split() if word.lower() not in (stop_words or all_names)])

 

string.punctuation에는 특수기호들이 포함되어있다. stop_words에는 i, me, my와 같은 단어들이 포함되어있다. 따라서 clean_text 함수는 mess에 있는 string.punctuation, stop_words, all_names의 값들을 모두 제거해주고, 모든 대문자 알파벳을 소문자로 바꿔준다.

 

stopwords.words('english')[:10]

['i', 'me', 'my', 'myself', 'we', 'our', 
'ours', 'ourselves', 'you', "you're"]

 

stopwords에 있는 단어들을 10개만 보여준 것이다.

 

result_df['clean_message'] = result_df['text'].apply(clean_text)
result_df['clean_message'] += result_df['title'].apply(clean_text)

 

text와 title 열에 clean_text 함수를 적용시켜준다.

 

print(result_df[['clean_message', 'text']].tail())

                                           clean_message  \
44893  brussels reuters nato allies tuesday welcomed ...   
44894  london reuters lexisnexis provider legal regul...   
44895  minsk reuters shadow disused sovietera factori...   
44896  moscow reuters vatican secretary state cardina...   
44897  jakarta reuters indonesia buy 11 sukhoi fighte...   

                                                    text  
44893  BRUSSELS (Reuters) - NATO allies on Tuesday we...  
44894  LONDON (Reuters) - LexisNexis, a provider of l...  
44895  MINSK (Reuters) - In the shadow of disused Sov...  
44896  MOSCOW (Reuters) - Vatican Secretary of State ...  
44897  JAKARTA (Reuters) - Indonesia will buy 11 Sukh...  

 

clean_message와 text를 비교해보면 불필요한 표현들이 없어진 것을 확인할 수 있다.

 

from collections import Counter

words = result_df[result_df['label']==0]['clean_message'].apply(lambda x: [word for word in x.split()])
true_news_words = Counter()

for msg in words:
    true_news_words.update(msg)
    
print(true_news_words.most_common(15))

[('said', 96956), ('trump', 44495), ('us', 43216), ('would', 31640), 
('reuters', 28287), ('president', 25622), ('state', 19061), 
('government', 18168), ('house', 17426), ('new', 17402), ('states', 16133), 
('also', 15944), ('republican', 15675), ('united', 15607), ('people', 14633)]

 

Counter를 import하여 진짜 뉴스의 clean_message에 가장 빈도수가 높은 값 15개를 출력해보았다.

 

words = result_df[result_df['label']==1]['clean_message'].apply(lambda x: [word for word in x.split()])
fake_news_words = Counter()

for msg in words:
    fake_news_words.update(msg)
    
print(fake_news_words.most_common(15))

[('trump', 78981), ('said', 31145), ('president', 26336), ('people', 26325), 
('would', 23650), ('one', 23319), ('us', 22903), ('obama', 19133), ('clinton', 18828), 
('like', 17944), ('donald', 17700), ('video', 15666), ('also', 15247), ('hillary', 14895), 
('new', 14825)]

 

가짜 뉴스의 clean_message에 가장 빈도수가 높은 값 15개를 출력해보았다. 진짜 뉴스의 값과 비교해보면 다르다는 것을 알 수 있다.

728x90