Coding Diary.

(데이터분석) 파이썬으로 텍스트 데이터 정제하기 본문

Coding/Data analysis

(데이터분석) 파이썬으로 텍스트 데이터 정제하기

life-of-nomad 2024. 5. 20. 13:52
728x90
반응형
지난 글에 이어서 간단한 예시로 텍스트 데이터를 정제해보겠습니다.
 

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

1. 텍스트 데이터 정제 함수 만들기import nltkfrom nltk.tokenize import word_tokenizefrom collections import Counterfrom text import TEXTnltk.download('punkt')corpus = TEXTtokenized_words = word_tokenized(corpus)#등장 빈도 기준 정제 함

life-of-nomad.tistory.com

 

import pandas as pd
txt_data = pd.read_csv('text_data.csv')

 

1. Nomalize data 정규화

txt_data.head()

  • post 열은 기술에 대한 소셜 미디어 게시물을 나타내며 sentiment 열은 해당 텍스트의 정서가 긍정적인지, 부정적인지, 중립적인지를 나타냅니다. 
  • 이 데이터 형식을 컴퓨터가 읽을 수 있는 형식으로 변환하기 위해서는 먼저 텍스트를 표준 형식으로 변환해야 합니다.
  • 모든 문자를 소문자로 변환해보겠습니다. => 대소문자 정규화
  • pandas에서는 series 데이터 뒤에 .string.capitalize를 추가해 이 작업을 수행할 수 있습니다.
  • 여기서 series는 DataFrame의 post 열입니다.
txt_data['post'] = txt_data['post'].str.capitalize()
txt_data['post']

  • 그 다음, 구두점을 삭제해보겠습니다.
  • 구두점을 제거할 때는 정규 표현식을 사용하면 됩니다. 이 정규 표현식은 마침표, 느낌표 등의 모든 문장부호를 나타냅니다.
  • .str.replace 메서드에 이 정규표현식을 입력함으로써 모든 구두점을 빈 문자열로 교체합니다.
txt_data["post"] = txt_data['post'].str.replace('[^\w\s]', '')
txt_data["post"]

  • 그 다음, pandas의 문자열 메서드인 str.contains로 할 수 있는 작업에 대해 알아보겠습니다.
  • 먼저, .loc를 사용해 텍스트 DataFramedp 액세스 합니다.
  • 그 다음, post 열의 문자열에 data sceince라는 단어가 포함되어 있는지를 확인합니다.
  • 이 단어가 포함되어 있다면 topic이라는 이름의 새로운 열을 만들고 그 행의 값을 data sceince로 지정합니다.
txt_data.loc[txt_data['post'].str.contains('data sceince'), 'Topic'] = 'data science'
txt_data.head()

  • 이제, post 열에 존재하는 소셜 미디어 게시물에서 data sceince 라는 단어가 등장할 때마다 topic 열의 해당하는 행에 값이 채워질 것입니다.
  • 이런 코드를 사용하면 각종 텍스트에서 특정 문자 시퀀스를 자동으로 추출할 수 있습니다.

2. Tokenize data 

  • 이제, a, the, is 등과 같이 별다른 가치가 존재하지 않는 불용어(stopword)를 제거해야 합니다.
  • (불용어 제거 방법은 이전 글에 있습니다)
  • 예를 들어, gone을 모두 go로 변형하는 것입니다. 
  • 이러한 작업을 어간 추출(stemming)이라고 합니다.
  • 제일 먼저 단어를 토큰화해야 합니다.
import nltk
nltk.download('punkt')

#DataFrame txt_data에서 인덱싱으로 post열을 지정한 다음
#apply 함수로 nltk의 word_tokenize 메서드를 적용해 문자열을 하위 문자열로 구성된 리스트로 만들어 단어 추출
#txt_data DaraFrame에서 token이라는 새로운 열 생성
txt_data["token"] = txt_data["post"].apply(nltk.word_tokenize)
txt_data

  • 결과를 보면 토큰화된 텍스트가 문자열 리스트로 token 열에 입력되어 있습니다.

3. Vectorize data 벡터화

  • 이 예시에서는 scikit-learn을 사용하겠습니다.
from sklearn.feature_extraction.txt import CountVectorizer

#CountVectorizer의 인스턴트 생성
vectorizer = CountVectorizer()

#post열에 존재하는 텍스트 벡터화
#텍스트 문서의 모음을 토큰별 개수를 나타내는 행렬로 반환
#fit_transform 함수 호출
#fit부분 : 입력된 텍스트 데이터를 기반으로 어휘 사전 구축
#transform : 어휘 사전 기반으로 입력된 텍스트 데이터를 숫자 형식으로 변환
#즉, 토큰화와 벡터화 작업 자동으로 차례로 수행하므로 정규화된 문자열로 구성된 post열에 대해 직접 사용 가능
words_matrix = vectorizer.fit_transform(txt_data["post"].values)

#.toarray함수를 사용해서 희소 행렬의 형태로 인코딩된 벡터의 결과물 확인
words_matrix.toarray()

  • 이 결과를 더욱 보기 좋게 하기 위해 벡터를 DaraFrame으로 나타내고 
  • vectorizer.get_feature_names를 사용해 각 변수의 이름 표시
counts = pd.DataFrame(words_matrix.toarray(), columns=vectorizer.get_feature_names_out())
counts

  • 이제 post 열에 존재하는 값들이 텍스트를 구성하는 어휘들로 인코딩되었으며 개별 문서에서 각 단어가 등장하는 횟수가 정수로 나타나 있다는 것을 알 수 있습니다.
  • 이 words_matrix 배열은 머신 러닝 모델에 곧바로 전달하여 sentiment 열에 나타난 정서를 예측하는 모델 등을 훈련하는 데 사용할 수 있습니다.
  • 또한, vocabulary 속성은 위 DaraFrame의 각 열에 대응하는 어휘 사전 내의 각 단어에 대한 인덱스를 보여줍니다.
  • 어휘 사전의 각 단어에는 기본적으로 고유의 정수 인덱스가 할당됩니다.
print(vectorizer.vocabulary_)

 

728x90
반응형