본문 바로가기
NLP

[NLP] Text Data Preprocessing

by 단깅수 2024. 7. 2.
728x90

데이터 직무에 있는 모든 사람들은 데이터를 잘 활용할 수 있도록 전처리, 후처리 등 가공해야 할 일이 많다.

데이터 직무의 일반적인 데이터 처리 과정

가장 일반적인 전처리 기법들이라고 한다면

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 형태소 분석기에 대해 궁금한 사람은 아래 링크를 접속하면 좋을 것 같다.

 

GitHub - bab2min/Kiwi: Kiwi(지능형 한국어 형태소 분석기)

Kiwi(지능형 한국어 형태소 분석기). Contribute to bab2min/Kiwi development by creating an account on GitHub.

github.com

 

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 ( 데이터 정제 )

클렌징이란, 말 그대로 데이터를 깨끗하게 만드는 작업인데 이 작업에는 많은 작업이 포함될 수 있다.

아래는 이에 해당하는 예시들이다.

  1. 등장 빈도가 적은 데이터 제거
  2. 길이가 짧은 단어 제거
    • I, by, at, on 등등
  3. 오탈자 교정 및 제거
  4. 띄어쓰기 교정
  5. 불용어 제거
    • 이모티콘이나 ^^ 등 단어 혹은 문장의 의미 탐색에 도움되지 않는 불용어를 제거하는 작업
  6. 데이터 구조 확인 후 맞춰주기

데이터 클렌징은 토큰화 이후 뿐만 아니라 이전에도 진행할 수 있는 것이 특징이다.

 

 

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)

표제어 추출 전 후 결과

 

이상으로 텍스트 데이터 전처리하는 방법을 알아보았다.

모두 꼼꼼한 데이터 처리를 통해 원하는 인사이트, 분석 결과를 도출했으면 하는 바램이다.

 

 

[프로젝트] 국내 주요 게임사 텍스트 데이터 분석 프로젝트 리뷰 (1)

2024년 1학기 텍스트 데이터 분석 과목을 수강하면서 진행했던 프로젝트에 대해 리뷰해보려고 한다.해당 프로젝트는 데이터 분석 프로젝트이고 분야는 NLP, 데이터 분석이 되겠다.이번 포스팅에

dangingsu.tistory.com

 

 

[프로젝트] HR_면접자 정보 맞추기 프로젝트 (1)

논문 읽는 학회에 멤버로 참여해 매주 논문을 하나씩 읽어보면서 공부했던 시절에는 매주 블로그 소재가 하나씩 생겼는데 이 활동이 끝나니까 블로그 소재가 뚝 떨어졌네요.. ㅠㅠ 그래서 새로

dangingsu.tistory.com

 

728x90
반응형