데이터 직무에 있는 모든 사람들은 데이터를 잘 활용할 수 있도록 전처리, 후처리 등 가공해야 할 일이 많다.
가장 일반적인 전처리 기법들이라고 한다면
1. 결측치 처리
2. 이상치 처리
등이 있겠으나, 오늘은 데이터 중 텍스트 데이터에 집중해서 텍스트 데이터 전처리 기법에 대해 얘기해보려고 한다.
자연어 (Natural Language)
텍스트 데이터, 즉 사람이 사용하는 말은 '문자'로 구성되어 있고 단어나 문장 등을 생성하는 방식이다.
하지만 컴퓨터는 자연어 형식을 이해하지 못하기 때문에 우리는 텍스트 데이터를 벡터 형식으로 바꿔줄 필요가 있다.
이를 어떻게 구체적으로 하는지 알아보자.
텍스트 데이터 전처리 과정
전처리 기법 | 의미 |
Tokenization, 토큰화 | 텍스트 데이터를 '토큰'으로 쪼개는 작업 |
Pos Tagging, 품사 태깅 | 토큰화 후 쪼개진 토큰이 어떤 품사인지 태그를 붙이는 작업 |
Cleansing | 노이즈를 제거하는 방법, 오타 처리, 띄어쓰기 등이 이 작업에 포함될 수 있음 |
Stopword, 불용어 제거 | 무의미한 단어 토큰을 제거하는 작업 |
Lemmatization, 표제어 추출 | 기본 사전형 단어, 표제어를 추출하는 작업 |
Tokenization ( 토큰화 )
토큰화란, 주어진 텍스트 데이터를 토큰이라는 단위로 쪼개는 작업을 얘기한다.
보통 단어 토큰화, 문장 토큰화 등으로 나눌 수 있고 한글은 형태소 단위로도 쪼개는 경우가 있다.
그래서 토큰화를 왜 하냐? 라고 궁금할 수 있다.
수집 목적이 정해지지 않은 대량의 텍스트 데이터에서 의미 혹은 핵심을 효율적으로 추출하기 위해서 토큰화 작업을 수행하고 한 문서 내의 엄청나게 많은 문장과 단어가 있을텐데 컴퓨터로 하여금 각 문장과 단어의 의미를 정확하게 파악하기 위한 목적도 있다.
토큰화할 때 고려해야 할 사항으로는 다음과 같다.
- 단어 토큰화 시 특수문자를 제거하고 공백으로만 토큰화
- Don't -> Don / t 로 잘못 쪼개질 수 있어 주의가 필요함
- 문장 토큰화 시 문장부호를 기준으로만 토큰화
- IP 주소 : 255.255.255.0 -> 255 / 255 / 255 / 0 으로 잘못 쪼개질 수 있어 주의가 필요함
- 줄임말을 옳게 처리해야 함
- We're -> We are, I'm -> I am 으로 인식하도록 설정해야 함
- 단어 내에 띄어쓰기가 사용된 경우
- New York, Los Angeles -> 하나의 단어로 인식해야 함
Pos Tagging ( 품사 태깅 )
품사 태깅이란, 토큰화 후 문맥상 적절한 품사를 붙이는 작업을 말한다.같은 단어라도 다른 품사로 사용될 수 있다.예를 들어 fly 는 명사로는 파리(N), 동사로는 날다(V)의 의미를 가질 수 있어서 이러한 작업이 더욱 중요하다고 할 수 있다.
Konlpy나 nltk 등 많은 형태소 분석 패키지 자체적으로 품사 태깅의 기능을 수행할 수 있다.필자는 Kiwi 형태소 분석기로 품사 태깅한 사례를 가져와보았다.Kiwi 형태소 분석기에 대해 궁금한 사람은 아래 링크를 접속하면 좋을 것 같다.
from kiwipiepy import Kiwi
kiwi = Kiwi(typos='basic') ## 오탈자 제거 기능 추가\
def extract_pos(text):
tokens = []
results = kiwi.analyze(text)
for result in results:
for token in result[0]:
## 동사, 명사, 형용사, 영어, 숫자만 남기기
if token.tag in ['NNG', 'NNP', 'VV', 'VA', 'SL', 'SN']:
tokens.append(token.form)
return ' '.join(tokens)
보통 N 으로 시작하는 태그는 명사, V로 시작하는 태그는 동사, 형용사가 많다.
주로 품사 태깅은 문서 내에서 중추 역할을 담당하는 핵심 키워드나 단어가 무엇인지 알고자 할 때 사용할 수 있다.
Cleansing ( 데이터 정제 )
클렌징이란, 말 그대로 데이터를 깨끗하게 만드는 작업인데 이 작업에는 많은 작업이 포함될 수 있다.
아래는 이에 해당하는 예시들이다.
- 등장 빈도가 적은 데이터 제거
- 길이가 짧은 단어 제거
- I, by, at, on 등등
- 오탈자 교정 및 제거
- 띄어쓰기 교정
- 불용어 제거
- 이모티콘이나 ^^ 등 단어 혹은 문장의 의미 탐색에 도움되지 않는 불용어를 제거하는 작업
- 데이터 구조 확인 후 맞춰주기
데이터 클렌징은 토큰화 이후 뿐만 아니라 이전에도 진행할 수 있는 것이 특징이다.
Lemmatization ( 표제어 추출 )
표제어 추출이란, 단어 품사에 맞는 표제어를 추출하는 작업을 얘기한다.
표제어란 기본 사전형 단어이고
예를 들어, is, are, am --> be / cooking --> cook 등 기본 사전형 단어로 바꿔주는 작업이다.
아래는 nltk 패키지의 WordNetLemmatizer를 사용해 표제어를 추출하는 코드 예시이다.
클렌징, 토큰화, 품사 태깅 후에 표제어 추출을 진행해주었다.
from nltk.stem import WordNetLemmatizer
my_str = """I am actively looking for Ph.D. students.
And you are a Ph.D. student.
Would you like to join my laboratory?"""
my_str = my_str.replace('\n','') ## 줄바꿈문자(\n) 제거
sent_tokens = nltk.sent_tokenize(my_str) ## 문장 단위로 tokenize
tokenizer = nltk.TreebankWordTokenizer() ## word tokenizer 선언
p = re.compile(r"^[^0-9A-Za-z]+") ## 특수문자 제거
results = []
for sent in sent_tokens:
sent = sent.lower() ## 문장을 소문자로 변환
result = tokenizer.tokenize(sent) ## 각 문장을 단어 토큰화
for token in result: ## 각 단어 토큰에 대해서
if p.match(token): ## 특수문자이면
result.remove(token) ## 문장의 단어 토큰화 결과에서 제외한다
results.extend(result) ## 특수문자가 아니면 문장의 단어 토큰화 결과에 포함한다
tags = nltk.tag.pos_tag(results)
lemmatizer = WordNetLemmatizer()
print("표제어 추출 전: ")
print(results)
converted_tags = [(tag[0], convert_tag(tag[1])) for tag in tags]
lemmas = []
for tag in converted_tags:
if tag[1] is None:
lemmas.append(lemmatizer.lemmatize(tag[0]))
else:
lemmas.append(lemmatizer.lemmatize(tag[0], tag[1]))
print("표제어 추출 후: ")
print(lemmas)
이상으로 텍스트 데이터 전처리하는 방법을 알아보았다.
모두 꼼꼼한 데이터 처리를 통해 원하는 인사이트, 분석 결과를 도출했으면 하는 바램이다.
'NLP' 카테고리의 다른 글
[NLP] Korean LLM Leaderboard (3) | 2024.10.16 |
---|---|
[NLP] Survey of Chatbot, Persona (7) | 2024.09.04 |
[NLP] NLP Task Review, 감정분석 (0) | 2024.07.11 |
[NLP] Similarity, 문서 유사도 측정 (0) | 2024.07.06 |
[NLP] 정규 표현식, Regular Expression (0) | 2024.07.01 |
[NLP] API를 활용한 Web Crawling (0) | 2024.06.29 |
[NLP] Web Crawling, Selenium (0) | 2024.06.28 |
[NLP] Web Scraping, BeautifulSoup (0) | 2024.06.27 |