삶을 살다가 이런 저런 문제들에서 공통점을 발견할 때가 있습니다. 매번 다르게 문제를 해결하는 것도 좋지만, 에너지와 시간을 절약하기 위해서 공통된 문제를 특정 값으로 처리하는 자동화 시스템을 만드는 과정도 있습니다. ML, AI...
머신러닝 분야에서 자주 언급되는 것 중 하나가 분류 과제입니다.
텍스트 분류 활용
텍스트 분류 과제는 여러 곳에서 활용되는데,
민원 분류
보이스피싱 분류
혐오 발언 분류
채용 및 사내 인사 평가 분류
스팸 메일
감성 분석
의도 분석
등과 같은 실무에서 활용할 일이 많은 과제 중 하나라고 생각합니다. 지도 학습, 비지도 학습 있지만,,, 대체로 지도 학습으로 많이 활용하지 않을까 싶습니다. 텍스트 분류에서 분류해야 할 범주가 2가지이면 Binary Classification, 이진 분류라고 하며, 3가지 이상 분류는 Multi-Class Classification, 다중 분류라고 합니다.
https://scikit-learn.org/stable/tutorial/machine_learning_map/index.html
관련 라이브러리
텍스트 분류 모델과 관련해서 다음과 같은 라이브러리가 많이 사용됩니다.
- Tensorflow : google에서 개발한 딥러닝 프레임 워크. 한국어 NLP 작업 등에 많이 사용. 자주 사용됨
- Pytorch : facebook에서 개발한 딥러닝 프레임워크. tensorflow와 유사한 기능 제공. 자주 사용됨.
- Scikit-Learn : 분류, 회귀, 클러스터링 등을 할 수 있는 ML 라이브러리. 가끔 사용...
관련 모델링
텍스트 분류를 수행하기 위해 다양한 ML 모델을 사용할 수 있는데, 가장 일반적으로 언급되는 모델은 ,SVM, Naive Bayes, Decision Tree, Random Forest, 앙상블, Neural Network 등이 있습니다.
- ML 알고리즘
CatBoost, XGBoost, LGBM, Linear SVC, Random Forest....
- DLML 알고리즘
BiLSTM(Bidirectional Long Short Term Memory), GRU(Gated Recurrent Unit), RNN(Recurrent Neural Networks) ....
처리 과정
크게 다음과 같은 process로 이루어지는데, 과제에 따라 다를 수 있습니다.
1 전처리
- 외부 텍스트인 경우 띄어쓰기 처리
- 특수 문자 제거
- 대소문자는 소문자로
- 토큰화(Tokenize)
- 불용어 제거
- 어근 동일화(Lemmatize)
- 그 외의 정제 과정
2 데이터 분리
- 훈련, 검증, 테스트 셋으로 분리
3 특성 추출
BoW 혹은 TF-IDF 방법을 활용해서 해당 말뭉치의 특성을 숫자로 추출하는 과정을 거칩니다.
-Bag of Words (Count vectorizer)
: 말뭉치에서 각 단어가 나온 갯수를 count 해서 해당 문서에 대해 벡터를 생성
-TF-IDF (Term Frequency-Inverse Document Frequency)
: 특정 단어가 해당 문서에서 얼마나 자주 나타나는지를 측정함. 해당 값이 높을 수록 해당 문서에서 특정 단어가 더 중요하다는 것을 측정. 해당 단어의 문서 내의 빈도, 전체 문서 집합 내의 빈도를 모두 고려할 수 있음
4 모델 훈련
5 모델 평가
예시
텍스트 분류와 관련한 자주 사용되는 예시는 IMDB 영화 리뷰 데이터 분류입니다. 참고할 수 있는 링크를 걸었는데, 여기에서 pytorch로 모델링 한 것과, tensorflow로 모델링 한 것의 예시를 볼 수 있습니다.
IMDB 영화 리뷰 데이터 텍스트 분류 - tensorflow NN 모델
model = tf.keras.Sequential([
layers.Embedding(max_features + 1, embedding_dim),
layers.Dropout(0.2),
layers.GlobalAveragePooling1D(),
layers.Dropout(0.2),
layers.Dense(1)])
model.summary()
IMDB 영화 리뷰 데이터 텍스트 분류 - pytorch RNN 모델
class GRU(nn.Module):
def __init__(self, n_layers, hidden_dim, n_vocab, embed_dim, n_classes, dropout_p=0.2):
super(GRU, self).__init__()
self.n_layers = n_layers
self.hidden_dim = hidden_dim
self.embed = nn.Embedding(n_vocab, embed_dim)
self.dropout = nn.Dropout(dropout_p)
self.gru = nn.GRU(embed_dim, self.hidden_dim,
num_layers=self.n_layers,
batch_first=True)
self.out = nn.Linear(self.hidden_dim, n_classes)
def forward(self, x):
x = self.embed(x)
h_0 = self._init_state(batch_size=x.size(0))
x, _ = self.gru(x, h_0)
h_t = x[:,-1,:]
self.dropout(h_t)
logit = self.out(h_t)
return logit
def _init_state(self, batch_size=1):
weight = next(self.parameters()).data
return weight.new(self.n_layers, batch_size, self.hidden_dim).zero_()
마무리
방대한 양이라 겉만 돌았던 것 같은데 임베딩.... BoW, TF-IDF에 대해서도 한 번 파고 들고, 모델링 중 SVM, Seq2Seq 등등에 대해서도 파고 들기 시작하면 사실 끝이 없단 느낌이 들어서 여기까지만 작성했습니다. 나중에 한 번 이어서 다뤄보면 좋을 것 같습니다. 오늘은 여기까지!
'NLP-writing' 카테고리의 다른 글
BERT와 OpenAI GPT 란 (0) | 2023.06.18 |
---|---|
텍스트 유사도-벡터 유사도 (0) | 2023.06.04 |
한국어 텍스트 데이터 전처리 (5) | 2023.05.07 |
미적분 - 경사 하강법(gradient descent) (0) | 2023.04.27 |
Linear Algebra 선형대수학 with NLP (0) | 2023.04.09 |