쥬니어 분석가

[파이썬/NLP] 텍스트 전처리 - 정제 및 정규화 feat.replace,re 본문

python

[파이썬/NLP] 텍스트 전처리 - 정제 및 정규화 feat.replace,re

jyuuni 2024. 2. 16. 19:00
반응형

텍스트 정제 - replace( ) 함수

파이썬을 사용하다 보면 문장의 오탈자 수정 및 특정 단어를 다른 단어로 변환하고 싶을 때가 있습니다.
그럴 때 파이썬의 relace() 함수를 사용하면 빠르게 원하는대로 문장을 수정할 수 있습니다.
 

함수 사용 방법
str.replace(old, new, count)
  • str: 문자열
  • old: 바꾸고 싶은 문자열
  • new: 바꿀 문자열
  • count (선택 사항): old 문자열을 몇 번 바꿀 것인지 선택/ 기본값은 -1이며, 모든 old 문자열을 new 문자열로 변경
함수 사용 예시
import pandas as pd
text = "데이터분석은 어렵지만 유용해😊 데이터분석 공부를 으쌰으쌰 열심히해서 멋진 분석가가 될거야~^_^!"

# "데이터분석"을 "마케팅"으로 바꾸기
new_text = text.replace("데이터분석", "마케팅")

print(new_text)

'데이터분석'이 '마케팅'으로 변환된 문장

 
기존에 “데이터분석으로 작성되어있던 부분이 모두 “마케팅으로 변환된 것을 확인할 수 있습니다.
이 외에도 특정 단어를 제외하는 텍스트 전처리를 할 때에도 replace() 함수를 활용할 수 있습니다.

 

불용어 제거
text = "데이터분석은 어렵지만 유용해😊 데이터분석 공부를 으쌰으쌰 열심히해서 멋진 분석가가 될거야~^_^!"

# 불용어 설정
stopwords = ["으쌰으쌰 ", "멋진 "]

# 불용어 제거
for word in stopwords:
    text = text.replace(word, "")

print(text)

'으쌰으쌰' 와 '멋진' 단어가 제외된 문장

 
특정 단어를 삭제하고 싶을 때는 불용어 설정 후 replace로 해당 불용어를 제외하면 됩니다.
 
저의 경우 워드클라우드 생성 시 유사한 단어는 하나로 묶어서 확인하기 위해 replace를 사용해서 열 전체에 적용했습니다. 예를 들어 “좋았음”, “좋아요”, “좋았어요  단어 모두 “좋아요로 통일하고 싶을 때, 아래와 같은 코드를 사용할 수 있습니다.
 

열 전체에 적용하는 코드
words_to_replace = ["좋았음", "좋아요", "좋았어요"]

# 대체할 단어
replacement_word = "좋아요"

# 텍스트 변환 함수
def replace_words(text, words_to_replace, replacement_word):
    for word in words_to_replace:
        text = text.replace(word, replacement_word)
    return text

# df["text"]열 전체 텍스트에 적용
df["text"] = df["text"].apply(lambda x: replace_words(x, words_to_replace, replacement_word))

'좋았음', '좋았어요' 모두 '좋아요'로 변환된 데이터프레임


 

정규표현식 - import re

정규 표현식은 특정 문자열을 찾거나, 바꾸거나, 제거하는 등 다양한 작업을 수행하는 데 활용할 수 있습니다.
저는 보통 특수문자를 제거할 때 정규표현식을 사용하곤 합니다.
 

함수 사용 방법
re.sub(pattern, " ", text)
  • re.sub() 함수: 첫 번째 인수에 지정된 패턴에 매칭되는 문자열을 두 번째 인수에 지정된 문자열로 바꿉니다.
  • pattern: 자세한 정규표현식 patten은 아래 게시물 참고
    https://wikidocs.net/21703
함수 사용 예시
import re
text = "데이터분석은 어렵지만 유용해😊 데이터분석 공부를 으쌰으쌰 열심히해서 멋진 분석가가 될거야~^_^!"

# 한글 및 숫자, 기본 특수기호 외에 단어는 제외
new_text = re.sub(r"[^ㄱ-ㅎㅏ-ㅣ가-힣a-zA-Z0-9.,!? ]", " ", text)
new_text1 = re.sub(r"[^ㄱ-ㅎㅏ-ㅣ가-힣a-zA-Z0-9.,!? ]", "", text)

print(new_text)
print("")
print(new_text1)

특수문자를 제거한 문장(공백 포함 및 완전 제거)

 
new_text와 new_text1의 차이점이 보이시나요?
new_text의 경우는 특정 문자를 공백으로 치환하였고, new_text1은 특정 문자를 완전히 제거했다는 차이가 있습니다.
일반적으로 저는 문장의 형식을 위해서는 공백으로 치환하기 보다는 완전히 제거하는 방식을 주로 선호합니다.
 
 
마찬가지로 아래와 같이 열 전체에 정규표현식을 적용하여 손쉽게 텍스트 정규화를 할 수 있습니다.

# 한글 및 숫자를 제외한 단어를 공백으로 치환
df["text"] = df["text"].apply(lambda x: re.sub(r"[^ㄱ-ㅎㅏ-ㅣ가-힣a-zA-Z0-9.,!? ]", " ", x))

 
 
이렇게 텍스트 전처리 손쉽게 끄읕
 

반응형