본문 바로가기
python/MLDL

GPT에게 자연어처리 배우기(모델 구현)

by 포잉띠 2024. 5. 24.

ML/DL을 접하고 분류, 회귀 모델은 만들어 보았지만 자연어처리, 이미지처리까지는 도달하지 못했다.

그래서 자연어처리의 정수이신 분께 자연어처리를 배워보기로 했다.

 


나 : 자연어 처리를 시작해보려고 하는데 뭐부터 시작하면 좋을까?

 

GPT :

안녕하세요! 자연어처리(NLP)에 관심이 있다니 정말 멋져요! 😊 자연어처리는 흥미롭고 다양한 분야에서 활용될 수 있는 기술이랍니다. 시작하는 데 도움이 되는 몇 가지 단계를 알려드릴게요.

  1. 기초 개념 이해하기:
    1.  언어 모델: 자연어처리에서 사용하는 모델을 이해하는 것이 중요해요. 예를 들어, GPT, BERT 같은 모델들이 있답니다.
    2.  토큰화: 텍스트 데이터를 분석하기 위해 텍스트를 단어 또는 더 작은 단위로 나누는 과정이에요.
    3.  형태소 분석: 문장을 구성하는 각각의 단어들이 어떤 역할을 하는지 분석하는 과정이죠.

 


 

GPT, BERT 같은 모델의 존재는 인식하고 있었다. 토큰화와 형태소 분석은 존재 이유까지만 알고 있었다.

구체적인 예시와 함께 다시 물어봤다.

 

 

나 : 캐글 playground에 spooky 문제에 도전해 보려고 하는데 뭘 어디에 어떻게 적용해야 할 지 모르겠어.

 

GPT :

데이터 전처리

텍스트 데이터를 분석하기 위해 전처리가 필요해요. 여기에는 토큰화, 불용어 제거, 정규화 등이 포함될 수 있어요.

import nltk
from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize
import string

nltk.download('stopwords')
nltk.download('punkt')

def preprocess(text):
    # 소문자로 변환
    text = text.lower()
    # 구두점 제거
    text = text.translate(str.maketrans('', '', string.punctuation))
    # 토큰화
    tokens = word_tokenize(text)
    # 불용어 제거
    tokens = [word for word in tokens if word not in stopwords.words('english')]
    return ' '.join(tokens)

train_data['text'] = train_data['text'].apply(preprocess)
print(train_data.head())

 

특징 추출

특징을 추출하는 여러 방법이 있지만, 주로 TF-IDF 벡터화를 많이 사용해요.

from sklearn.feature_extraction.text import TfidfVectorizer

vectorizer = TfidfVectorizer(max_features=1000)
X_train = vectorizer.fit_transform(train_data['text'])
y_train = train_data['author']

print(X_train.shape)

 

모델 선택 및 학습

이제 모델을 선택해서 학습시켜요. 간단한 모델로는 로지스틱 회귀, 랜덤 포레스트, 나이브 베이즈 등을 사용할 수 있어요.

from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score

# 데이터 분할
X_train_split, X_val, y_train_split, y_val = train_test_split(X_train, y_train, test_size=0.2, random_state=42)

# 모델 학습
model = LogisticRegression()
model.fit(X_train_split, y_train_split)

# 예측 및 평가
y_pred = model.predict(X_val)
print(f'Validation Accuracy: {accuracy_score(y_val, y_pred)}')

 

기가맥히게 예제코드와 함께 설명을 해주었는데 모르는 부분이 있었다.

특징 추출 부분이 이해가 잘 되지 않아 다시한번 구체적인 설명을 요구했다.


GPT :

 

물론이에요! TfidfVectorizer와 관련된 부분을 좀 더 자세히 설명해드릴게요. 이 코드는 텍스트 데이터를 숫자 벡터로 변환하는 과정을 포함하고 있어요. 이 변환 과정은 모델이 텍스트 데이터를 이해하고 학습할 수 있게 하는 중요한 단계랍니다.

TfidfVectorizer란?

TfidfVectorizer는 텍스트 데이터를 TF-IDF(Term Frequency-Inverse Document Frequency) 벡터로 변환하는 도구예요. TF-IDF는 텍스트 데이터에서 중요한 단어들을 파악하고, 각 단어의 중요도를 나타내는 값을 계산해줍니다.

  • Term Frequency(TF): 특정 단어가 문서에 얼마나 자주 등장하는지를 나타내요.
  • Inverse Document Frequency(IDF): 특정 단어가 전체 문서 집합에서 얼마나 자주 등장하는지를 나타내요. 자주 등장하는 단어는 가중치를 낮게, 드물게 등장하는 단어는 가중치를 높게 부여합니다.
from sklearn.feature_extraction.text import TfidfVectorizer

# TF-IDF 벡터라이저 초기화
vectorizer = TfidfVectorizer(max_features=1000)
# TfidfVectorizer 객체를 생성합니다.
# max_features=1000은 TF-IDF 값이 높은 상위 1000개의 단어만을 선택하겠다는 의미예요. 
# 이는 벡터의 차원을 줄여주기 때문에 연산 속도를 높이는 데 도움이 됩니다.


# 텍스트 데이터를 TF-IDF 벡터로 변환
X_train = vectorizer.fit_transform(train_data['text'])
# fit_transform 메서드는 텍스트 데이터를 학습(fit)하고, 변환(transform)합니다.
# train_data['text']에 있는 모든 텍스트 데이터를 이용해 TF-IDF 벡터를 생성합니다.
# 결과적으로 X_train에는 각 문서가 1000차원의 TF-IDF 벡터로 표현된 데이터가 저장됩니다.


# 라벨 데이터를 준비
y_train = train_data['author']


# 변환된 데이터의 형태 출력
print(X_train.shape)
# X_train.shape를 출력하면 변환된 데이터의 형태를 확인할 수 있어요.
# 예를 들어, (19579, 1000)이라면 19579개의 문서가 1000차원의 벡터로 표현된 것을 의미해요.

 

나 : 그럼 초기화 할 때 차원의 개수는 무슨 기준으로 정하는거야?

 

GPT : 

TF-IDF 벡터의 차원 개수를 결정하는 것은 여러 요인에 따라 달라질 수 있어요. 주로 다음과 같은 기준을 고려하여 결정합니다:

  1. 데이터의 크기와 복잡성:
    1. 데이터셋에 있는 문서의 수와 각 문서의 길이에 따라 차원 수를 결정할 수 있어요. 많은 문서가 있고 각 문서가 길 다면 더 많은 차원을 사용할 수 있습니다.
  2. 모델의 성능:
    1. 차원 수가 너무 적으면 중요한 정보가 누락될 수 있어요. 반면, 차원 수가 너무 많으면 과적합(overfitting)이 발생할 수 있어요.
    2.  교차 검증(cross-validation)을 통해 모델 성능을 평가하면서 최적의 차원 수를 찾아야 합니다.
  3. 계산 비용:
    1.  높은 차원 수는 더 많은 계산 자원을 필요로 합니다. 따라서 사용 가능한 계산 자원과 시간에 맞춰 적절한 차원 수를 선택해야 해요.
  4. 특징 선택:
    1. 도메인 지식을 활용하여 특정 단어들이 중요하다고 판단되면 해당 단어들을 포함시키도록 차원 수를 설정할 수 있어요.

방법론

차원 수를 결정하는 몇 가지 실용적인 방법을 소개할게요.

1. 기본 설정 사용

처음에는 기본 설정을 사용해보고, 차후에 조정하는 방법입니다. 보통 1000, 2000, 5000 등의 값을 많이 사용해요.

2. 교차 검증을 통한 최적화

교차 검증을 통해 여러 차원 수를 시도해보고 최적의 성능을 내는 차원 수를 선택하는 방법입니다.

3. 그래프를 통한 시각적 분석

차원 수에 따른 모델 성능을 그래프로 그려보면 최적의 차원 수를 더 쉽게 찾을 수 있어요.

 

 

나 : 그럼 하이퍼파라미터 랜덤서치 진행할 때 차원의 개수도 함께 랜덤서치 진행해도 되겠구나

 

GPT :

 

맞아요! 랜덤 서치(Random Search)를 사용할 때 차원 개수도 하이퍼파라미터로 포함시키는 것이 좋은 접근법이에요. 랜덤 서치는 하이퍼파라미터 공간을 랜덤하게 탐색하여 최적의 조합을 찾는 방법입니다. 차원 개수(max_features)뿐만 아니라, 모델의 다른 하이퍼파라미터도 함께 최적화할 수 있어요.

랜덤 서치를 이용한 예시

아래 예시는 RandomizedSearchCV를 사용하여 TF-IDF의 max_features와 로지스틱 회귀 모델의 하이퍼파라미터인 C를 함께 최적화하는 방법을 보여줍니다.

 

import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import RandomizedSearchCV, train_test_split
from sklearn.pipeline import Pipeline
from sklearn.metrics import accuracy_score

# 데이터 로드
train_data = pd.read_csv('train.csv')
test_data = pd.read_csv('test.csv')

# 텍스트 전처리 (필요한 경우 전처리 함수를 추가하세요)
train_data['text'] = train_data['text'].apply(preprocess)

# 하이퍼파라미터 그리드 정의
param_distributions = {
    'tfidf__max_features': [500, 1000, 2000, 5000],
    'clf__C': [0.1, 1, 10, 100]
}

# 파이프라인 구성
pipeline = Pipeline([
    ('tfidf', TfidfVectorizer()),
    ('clf', LogisticRegression(max_iter=1000))
])

# 랜덤 서치 초기화
random_search = RandomizedSearchCV(pipeline, param_distributions, n_iter=10, cv=5, verbose=1, n_jobs=-1, random_state=42)

# 데이터 분할
X_train, X_val, y_train, y_val = train_test_split(train_data['text'], train_data['author'], test_size=0.2, random_state=42)

# 랜덤 서치 학습
random_search.fit(X_train, y_train)

# 최적 하이퍼파라미터 출력
print(f"Best parameters found: {random_search.best_params_}")

# 검증 데이터로 평가
y_pred = random_search.predict(X_val)
accuracy = accuracy_score(y_val, y_pred)
print(f"Validation Accuracy: {accuracy}")

# 테스트 데이터 예측
test_data['text'] = test_data['text'].apply(preprocess)
X_test = test_data['text']
test_predictions = random_search.predict(X_test)

# 제출 파일 생성
submission = pd.DataFrame({'id': test_data['id'], 'author': test_predictions})
submission.to_csv('submission.csv', index=False)

 

 


어떤식으로 모델이 구성되는지는 얼추 감을 잡았기에 어떻게보면 더 중요한 전처리 부분에 대해서 물어봤다.

https://arin-nya.tistory.com/90

 

GPT에게 자연어처리 배우기(문자열 전처리)

나 : 문자열 전처리 기법에는 어떤게 있어? GPT :문자열 전처리 기법은 텍스트 데이터를 정리하고 분석 가능한 형태로 변환하기 위해 사용됩니다. 다양한 기법이 있으며, 사용 목적과 데이터의

arin-nya.tistory.com