영국 척척석사 유학생 일기장👩🏻‍🎓

(데이터분석) 파이썬으로 텍스트 데이터 정제 함수 만들기 본문

코딩공부/Data analysis

(데이터분석) 파이썬으로 텍스트 데이터 정제 함수 만들기

life-of-nomad 2024. 5. 20. 13:14
728x90
반응형

1. 텍스트 데이터 정제 함수 만들기

import nltk
from nltk.tokenize import word_tokenize
from collections import Counter
from text import TEXT
nltk.download('punkt')

corpus = TEXT
tokenized_words = word_tokenized(corpus)

#등장 빈도 기준 정제 함수
def clean_by_freq(tokenized_words, cut_off_count):
	#파이썬의 Counter 모듈을 통해 단어의 빈도수 카운트하여 단어 집합 생성
    vocab = Counter(tokenized_words)
    
    #빈도수가 cut_off_count 이하인 단어 set 추출
    uncommon_words = {key for key, value in vocab.item() if value <= cut_off_count}
    
    #uncommon_words에 포함되지 않는 단어 리스트 생성
    cleaned_words = [word for word in tokenized_words if word not in uncommon_words]
    
    return cleaned_words
    
#단어 길이 기준 정제 함수
def clean_by_len(tokenized_words, cut_off_length):
	#길이가 cut_off_length 이하인 단어 제거
    cleaned_words = []
    
    for word in tokenized_words
    	if len(word) > cut_off_length:
        	cleaned_words.append(word)
            
    return cleaned_words

 

2. 불용어 처리 함수 만들기

import nltk
from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize
from text import TEXT
nltk.download('stopwords')
nltk.download('punkt')

corpus = TEXT 
tokenized_words = word_tokenize(TEXT)

#NLTK에서 제공하는 불용어 목록 세트 자료형으로 받아오기
stop_words_set = set(stopwords.words('english'))

#불용어 제거 함수
def clean_by_stopwords(tokenized_words, stop_words_set):
	cleaned_words = []
    
    for word in tokenized_words:
    	if word not in stop_words_set:
        	cleaned_words.append(word)
            
    return cleaned_words

 

3. 정규화(Normalization)

1) 대소문자 통합

  • 영어 문법 상 대문자는 특수한 상황에서만 사용되고, 보통은 소문자가 많이 사용됩니다. 
  • 따라서 대문자를 소문자로 바꾸는게 일반적입니다. 해당 과정에는 파이썬의 문자열 내장함수인 lower()가 사용됩니다.
text = "What can I do for you? Do your homework now."

#소문자로 변환
print(text.lower())

 

 

2) 규칙 기반 정규화

  • USA, US, U.S.는 형태가 다르지만 의미는 같습니다. 
  • 표준어는 아니지만 Umm과 Ummmm도 같은 의미이기 때문에 정규화 할 수 있습니다. 
  • 이런 단어들은 규칙을 정의해서 하나의 표현으로 통합할 수 있습니다.
  • 아래 코드는 US를 USA로, Ummmm을 Umm으로 통합하는 코드입니다.
#동의어 사전
synonym_dict = {'US':'USA', 'U.S':'USA', 'Ummm':'Umm', 'Ummmm':'Umm' }
text = "She became a US citizen. Ummmm, I think, maybe and or."

#분석에 활용할 텍스트와 정규화 된 단어들을 저장할 리스트 생성
normalized_words = []

#단어 토큰화
tokenized_words = nltk.word_tokenize(text)

for word in tokenized_words:
	#동의어 사전에 있는 단어라면, value에 해당하는 값으로 반환
    if word in synonym_dict.keys():
    	word = synonym_dict[word]
        
    normalized_words.append(word)
    
#결과 확인
print(normalized_words)

3)  어간 추출(Stemming)

  • 특정한 단어의 핵심이 되는 부분을 어간(Stem)이라고 합니다. 
  • 그리고 단어에서 어간을 찾아내는 것을 어간 추출(Stemming)이라고 합니다. 
  • 서로 다른 형태의 단어들도 어간 추출을 하면 같은 단어로 통합되기 때문에 이를 정규화 방법 중 하나로 사용합니다.
  • NLTK는 어간 추출을 위한 알고리즘으로 포터 스테머(Porter Stemmer)와 랭커스터 스테머(Lancaster Stemmer)를 제공합니다. 
  • 두 알고리즘은 어간 추출을 하는 기준이 미세하게 다르기 때문에 무엇을 사용하느냐에 따라 결과가 조금씩 달라집니다. 
from nltk.stem import PorterStemmer

porter_stemmer = PorterStemmer()
text = "You are so lovely. I am loving you now."
porter_stemmed_words = []

#단어 토큰화
tokenized_words = nltk.word_tokenize(text)

#포터 스테머의 어간 추출
#토큰화 된 단어를 순회하며 어간을 추출하여 결과를 porter_stemmed_words에 추가합니다. 
#NLTK의 porter_stemmer.stem() 함수는 단어가 포터 스테머 알고리즘의 기준에 포함되면 추출된 어간을 반환하고,
#그렇지 않은 경우에는 원래의 단어를 반환해 줍니다.
for word in tokenized_words:
	stem = porter_stemmer.stem(word)
    porter_stemmed_words.append(stem)
    
#어간 추출 결과
print('어간 추출 전:', tokenized_words)
pritn('포터 스테머의 어간 추출 후:', porter_stemmed_words)

포터 스테머의 어간 추출 결과

  • loving이 love로 어간 추출 되었습니다. 
  • 위의 어간 추출 하는 코드를 하나의 함수로 만들어보겠습니다.
import nltk
import pandas as pd
from nltk.tokenize import word_tokenize
from nltk.stem import PorterStemmer
from text import TEXT
nltk.download('punkt')

corpus = TEXT
tokenized_words = word_tokenize(corpus)

#포터 스테머 어간 추출 함수
def stemming_by_porter(tokenized_words):
	porter_stemmer = PorterStemmer()
    porter_stemmed_words = []
    
    for word in tokenized_words:
    	stem = porter_stemmer.stem(word)
        porter_stemmed_words.append(stem)
        
    return porter_stemmed_words

 

728x90
반응형