티스토리 뷰

자연어처리

[2] 정제와 추출

up_one 2025. 3. 24. 17:30

2025.03.21 - [자연어처리] - [1] 토큰화(Tokenizer)

 

[1] 토큰화(Tokenizer)

NLP(Natural Language Processing)은 인간의 언어를 이해하고 해석하기 위한 목적으로 발전해 왔습니다. 다만 분석 모델의 학습 데이터셋은 수치형으로만 입력이 가능하기 때문에 텍스트 데이터 자체로

up-one-coding.tistory.com

 

토큰화 작업에 이어 Token을 정제하고 추출하는 방법에 대해 알아보겠습니다. Text 데이터에서 토큰을 추출해도 그 토큰에는 특수 문자, 오탈자 등이 포함되어 있을 수 있습니다. 그러한 문자들을 제거하고 Clean text로 만드는 작업이 '정제'입니다.

 

1. 정제

정제 작업은 데이터 사용 목적에 따라 노이즈를 제거하는 작업입니다. 대표적으로,

  • 대 소문자 변환
  • 출현 횟수가 적은 단어 제거
  • 길이가 짧거나 지시대명사, 관사와 같은 단어 제거

등이 존재합니다. 정제 작업을 효율적으로 할 수 있는 방법은 정규표현식입니다. '정규표현식'은 're' 라이브러리를 통해 활용할 수 있고 특정 규칙에 맞는 문자를 추출할 수 있는 기능이 존재합니다.

import re

#한글 찾기
text = "Hello 안녕하세요"
korean = re.findall(r'[가-힣]+', text)
print(korean)		#['안녕하세요']

#전화번호 추출하기
text = 'Call me at 010-1234-5678'
pattern = r'\d{3}[-\s]\d{4}[-\s]\d{4}'
number = re.findall(pattern, text)
print(number)		#['010-1234-5678']

#특정 확장자 찾기
files = [
	'image.jpeg', 'docuemtn,pdf', 'musd.mp3', 'phtot.jpg', 'arcfsdjk.gv', 'qwekj.py', 'cjfji.JPEG'
]

print(re.findall(r'\w+.jpeg|\w+.JPEG', str(files)))		#['image.jpeg', 'cjfji.JPEG']

 

2. 추출

추출의 2가지 방법인 어간 추출과 표제어 추출은 다양한 형태의 텍스트 단어의 원래 유형을 찾아 문자의 복잡성을 줄여주는 역할을 합니다. 예를 들어, 과거형 / 현재형 / 미래형이 형태가 다른 영어의 경우 동사 원형의 형태를 알기 위해서 추출 방법을 사용하는 것입니다.

 

어간 추출과 표제어 추출의 차이는 품사 정보를 가지고 있는지의 여부입니다. 표제어 추출은 품사 정보를 가지고 있지만, 어간 추출은 가지고 있지 않습니다.

 

[어간 추출]

어간 추출은 문맥 정보를 고려하지 않고 문법적인 어근만 찾아서 추출하는 방법입니다. 어간 추출 방법은 일부 철자가 훼손된 어근을 그대로 추출하기 때문에 정확도가 높지는 않습니다. NLTK 패키지 내 어간 추출 방법에는 대표적으로 PorterStemmer와 LancasterStemmer가 존재합니다.

from nltk.stem import PorterStemmer, LancasterStemmer

port = PorterStemmer()
lanc = LancasterStemmer()

print(port.stem('Working'), port.stem('Works'), port.stem('Worked'))
#work work work

print(lanc.stem('Working'), lanc.stem('Works'), lanc.stem('Worked'))
#work work work

print(port.stem('happier'), port.stem('happiest'), port.stem('happily'))
#happier happiest happili

print(lanc.stem('happier'), lanc.stem('happiest'), lanc.stem('happily'))
#happy happiest happy

 

[표제어 추출]

표제어 추출은 단어들이 다른 형태를 가지더라도, 그 원형 단어를 찾아가서 단어의 개수를 줄일 수 있는지 판단합니다. NLTK 패키지에는 WordNetLemmatizer 함수를 사용합니다. WordNetLemmatizer은 단어의 품사를 옵션으로 설정할 수 있습니다.

from nltk.stem import WordNetLemmatizer    #nltk의 표제어추출 라이브러리

lemma = WordNetLemmatizer()   #단어의 품사(명사, 대명사, 동사 등)를 옵션으로 줄 수 있다
print(lemma.lemmatize('amusing', 'v'), lemma.lemmatize('amused','v'), lemma.lemmatize('amuses','v'))
print(lemma.lemmatize('was', 'v'), lemma.lemmatize('love', 'v'))

#amuse amuse amuse
#be love

 

[Class을 이용한 어간 추출]

import nltk
nltk.download('punkt')
nltk.download('wordnet')
nltk.download('punkt_tab')
from nltk.tokenize import word_tokenize
from nltk.stem import PorterStemmer, LancasterStemmer

class PreProcessing:
  def __init__(self, text):
    self.text = text
    self.tokens = word_tokenize(text)
    self.porter = PorterStemmer()
    self.lanc = LancasterStemmer()

  def porter_result(self):
    return [self.porter.stem(token) for token in self.tokens]

  def lanc_result(self):
    return [self.lanc.stem(token) for token in self.tokens]

text = "Working hard was happier than singing"
example1 = PreProcessing(text)
print('The result of PorterStemmer : ',example1.porter_result())
print('The result of LancStemmer : ', example1.lanc_result())

#The result of PorterStemmer :  ['work', 'hard', 'wa', 'happier', 'than', 'sing']
#The result of LancStemmer :  ['work', 'hard', 'was', 'happy', 'than', 'sing']

'자연어처리' 카테고리의 다른 글

[4] TF - IDF을 이용한 특징 추출  (0) 2025.03.29
[3] 정수 인코딩  (0) 2025.03.28
[1] 토큰화(Tokenizer)  (0) 2025.03.21
TAG more
글 보관함
최근에 올라온 글