자연어를 분석하기 위해서는 전처리가 필요한데, 텍스트 데이터는 어떻게 전처리를 해야할까?
1. 텍스트 정규화
1) 클렌징
: 불필요한 문자, 기호 등을 제거하는 방법
ex) 특수문자, 공백, 태그 등
import re
text = re.sub(r'<[^>]+>', '', text) # HTML 태그 제거
text = re.sub(r'\d+', '', text) # 숫자 제거
text = re.sub(r'[^\w\s]', '', text) # 특수문자 제거
text = re.sub(r'\s+', ' ', text).strip() #공백 제거
2) 소문자 변환
: 대소문자 구분을 없애 분석의 일관성 유지
text = text.lower()
2. 불용어 제거
: 의미 없는 단어 제거
from nltk.corpus import stopwords
stop_words = set(stopwords.words('english'))
tokens = [word for word in tokens if word not in stop_words]
3. 토큰화(Tokenization)
: 텍스트를 단어 또는 문장 단위로 나누는 것
# 단어 토큰화
from nltk.tokenize import word_tokenize
tokens = word_tokenize(text)
# 문장 토큰화
from nltk.tokenize import sent_tokenize
sentences = sent_tokenize(text)
c.f) 단어에 Apostrophy(')가 있을 때 (ex. Don't)
02-01 토큰화(Tokenization)
자연어 처리에서 크롤링 등으로 얻어낸 코퍼스 데이터가 필요에 맞게 전처리되지 않은 상태라면, 해당 데이터를 사용하고자하는 용도에 맞게 토큰화(tokenization) & 정제(c…
wikidocs.net
# NLTK Library
from nltk.tokenize import word_tokenize
print('단어 토큰화1 :',word_tokenize("Don't be fooled by the dark sounding name, Mr. Jone's Orphanage is as cheery as cheery goes for a pastry shop."))
"""
단어 토큰화1 : ['Do', "n't", 'be', 'fooled', 'by', 'the', 'dark', 'sounding', 'name', ',', 'Mr.', 'Jone', "'s", 'Orphanage', 'is', 'as', 'cheery', 'as', 'cheery', 'goes', 'for', 'a', 'pastry', 'shop', '.']
"Do", "n't"로 따로 분리됨
고유명사인 경우 "Jone", "'s"로 분리됨
"""
from nltk.tokenize import WordPunctTokenizer
print('단어 토큰화2 :',WordPunctTokenizer().tokenize("Don't be fooled by the dark sounding name, Mr. Jone's Orphanage is as cheery as cheery goes for a pastry shop."))
"""
단어 토큰화2 : ['Don', "'", 't', 'be', 'fooled', 'by', 'the', 'dark', 'sounding', 'name', ',', 'Mr', '.', 'Jone', "'", 's', 'Orphanage', 'is', 'as', 'cheery', 'as', 'cheery', 'goes', 'for', 'a', 'pastry', 'shop', '.']
# "Don", "'", "t"로 분리됨
# "Jone", "'", "s"로 분리됨
"""
# Keras Library
from tensorflow.keras.preprocessing.text import text_to_word_sequence
print('단어 토큰화3 :',text_to_word_sequence("Don't be fooled by the dark sounding name, Mr. Jone's Orphanage is as cheery as cheery goes for a pastry shop."))
"""
단어 토큰화3 : ["don't", 'be', 'fooled', 'by', 'the', 'dark', 'sounding', 'name', 'mr', "jone's", 'orphanage', 'is', 'as', 'cheery', 'as', 'cheery', 'goes', 'for', 'a', 'pastry', 'shop']
# 분리하지 않음
"""
4. 어간 추출(Stemming) 및 표제어 추출(Lemmatization)
: 단어의 기본형태로 변환
1) Stemming
: 어형이 변형된 단어로부터 접사 등을 제거하고 그 단어의 어간을 분리해내는 것
ex) 'Automate', 'Automatic', 'Automation' 이렇게 세 개의 단어가 있을 때, 모두 'Automat'이라는 어간을 갖는다.
2) Lemmatization
: 한 단어가 여러 형식으로 표현되어 있는 것을 단일 형식으로 묶어주는 기법
ex) be 동사인 'am', 'are', 'is'를 'be'로 만들어 주는 것을 Lemmatization 기법이라 한다.
영어로된 텍스트 데이터의 경우 Stemming과 Lemmatization이 명확하게 구분되어 텍스트 전처리 과정에서 무엇을 사용할지 결정해야 한다. 한글로된 텍스트 데이터의 경우 형태소 분석 과정에서 Stemming과 Lemmatization이 함께 이루어진다고 볼 수 있다.
# 어간 추출
from nltk.stem import PorterStemmer
stemmer = PorterStemmer()
stemmed_words = [stemmer.stem(word) for word in tokens]
#표제어 추출
from nltk.stem import WordNetLemmatizer
lemmatizer = WordNetLemmatizer()
lemmatized_words = [lemmatizer.lemmatize(word) for word in tokens]
5. TF-IDF (Term Frequency-Inverse Document Frequency)
: 시간별 단어의 중요도를 계산하여 텍스트를 벡터화
tf-idf - 위키백과, 우리 모두의 백과사전
위키백과, 우리 모두의 백과사전. TF-IDF(Term Frequency - Inverse Document Frequency)는 정보 검색과 텍스트 마이닝에서 이용하는 가중치로, 여러 문서로 이루어진 문서군이 있을 때 어떤 단어가 특정 문서
ko.wikipedia.org
- 자주 등장하는 단어에 낮은 가중치를 부여하고, 중요한 단어에 높은 가중치를 부여하는 방법
- 단어도의 상대적 중요도를 고려한 가중치 계산으로 불용어 제거도 가능
- 단어 등장 빈도에 영향을 크게 받아 단어의 순서 정보를 고려하지 않음
- 데이터 희소성으로 인해 모델 성능이 저하될 수 있음
- 한 단어에 여러 뜻이 존재할 때 TF-IDF가 의미를 구분하지는 않음
from sklearn.feature_extraction.text import TfidfVectorizer
vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(corpus)
c.f) TF(Term Frequency) vs TF-IDF
TF는 특정 단어가 얼마나 자주 등장하는지 단어의 빈도수만 고려하고 단어의 중요성을 고려하지 않는다. 즉, 특정 단어가 자주 사용되면 중요한 단어로 인식한다.
TF-IDF는 중요성을 고려하는 방식으로 TF값에 IDF값을 곱하는 방식이다. IDF는 특정 단어가 얼마나 많은 문서에 등장하는지 반비례(inverse)한 값으로 흔하게 등장하는 불용어들은 IDF값이 작아져서 TF-IDF값이 작아져 불용어의 중요도를 낮춘다.
6. 워드 임베딩(Word Embedding)
: 텍스트를 숫자로 변환하는 방법
[NLP] Word Embedding
자연어처리 공부중입니다. 잘못된 부분은 편히 댓글 부탁드립니다.1. 워드 임베딩이란?단어를 인공신경망 학습을 통해 벡터화하는 하는 것즉 텍스트를 숫자로 변환하는 방법2. 희소 표현(Sparse Re
hello-heehee.tistory.com
c.f) Word2Vec, BERT, GloVe, FastText, GPT
1) Word2Vec: 단어 간 유사도를 반영한 벡터 생성
from gensim.models import Word2Vec
model = Word2Vec(sentences, vector_size=100, window=5, min_count=1, workers=4)
2) GloVe: 단어의 전역 동시 등장 확률을 기반으로 벡터 생성
from gensim.models import KeyedVectors
glove_vectors = KeyedVectors.load_word2vec_format("test.txt", binary=False)
3) FastText: Subword 정보를 활용하여 희귀 단어 처리
4) Transformer 기반 임베딩: BERT, GPT등 모델 사용
#BERT
from transformers import BertTokenizer, BertModel
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertModel.from_pretrained('bert-base-uncased')
inputs = tokenizer("Example sentence", return_tensors="pt")
outputs = model(inputs)
단, 이러한 전처리를 무조건 한다고 좋은 것은 아니다. 텍스트의 품질, 언어 의존성, 해석 가능성 등을 고려하여 선택하는 것이 중요하다.
위 전처리 과정을 끝냈다면 본격적인 분석작업에 들어가기에 앞서 추가적으로 전처리분석과정을 하면 좋다.
1. 단어 빈도 분석
from collections import Counter
word_freq = Counter(tokens)
2. N-그램 생성
: 단어 시퀀스를 기반으로 N개의 연속된 단어 그룹 생성
from sklearn.feature_extraction.text import CountVectorizer
vectorizer = CountVectorizer(ngram_range=(2, 2)) # Bi-grams
X = vectorizer.fit_transform(corpus)
3. 차원축소
: 벡터화된 데이터가 고차원일 경우 차원 축소를 통해 효율성을 높임
from sklearn.decomposition import PCA
pca = PCA(n_components=2)
X_reduced = pca.fit_transform(X.toarray())
c.f) 텍스트 데이터 증강방법(Augmentation)
- Synonym Replacement
- Back Translation
02-10 한국어 전처리 패키지(Text Preprocessing Tools for Korean Text)
유용한 한국어 전처리 패키지를 정리해봅시다. 앞서 소개한 형태소와 문장 토크나이징 도구들인 KoNLPy와 KSS(Korean Sentence Splitter)와 함께 유용하게 사…
wikidocs.net
'DeepLearning > NLP' 카테고리의 다른 글
[NLP] Drain3 - Python (0) | 2025.02.19 |
---|---|
[NLP] 텍스트 데이터 전처리 - Log Template (3) | 2025.01.13 |
[NLP] Transformer - BERT (4) | 2025.01.11 |
[NLP] Encoder-Decoder와 Attention (5) | 2025.01.06 |
[NLP] Word Embedding (4) | 2024.11.28 |