😒 저 저 저 개념없는 나/⛓️ DL & ML

[문서 제목 자동 분류 작업 | Clustering] 2. NLTK를 사용한 문서 제목 토큰화 및 어근 추출 | 인턴

우주수첩 2024. 1. 15. 09:44
728x90

 

# 데이터 프레임의 head 확인

CONTENT_CODE  LAST_MODIFIED_DATE  ... CONTENT_SECURITY_LEV DEPARTMENT_NM
0  C0000000............        1.9......+13  ...                   ..       OE개발기획팀
1  C0000000............        1.9......+13  ...                   ..       OE개발기획팀
2  C0000000............        1.9......+13  ...                   ..       OE개발기획팀
3  C0000000............        2.0......+13  ...                   ..       OE개발기획팀
4  C0000000............        2.0......+13  ...                   ..      R&D양산개발팀

[5 rows x 7 columns]

 

혹시모를 정보 유출 방지를 위해 수치적인 것 들은 일부 가리겠땨.

 


 

# 단어들의 어근 원형을 추출하기 위해 함수 생성

 

💡 NLTK의 Lemmatize 함수를 사용 

 

 

# 전체 코드

 

import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
from nltk.stem import WordNetLemmatizer
import nltk
import string


csv_file_path = '../sql_result.csv'

try:
    df = pd.read_csv(csv_file_path, encoding='utf-8')
except UnicodeDecodeError:
    print('utf-8으로 디코딩하는 중 오류 발생. 다른 인코딩 시도 필요.')


remove_punct_dict = dict((ord(punct), None) for punct in string.punctuation)
lemmar = WordNetLemmatizer()

def LemTokens(tokens):
    return [lemmar.lemmatize(token) for token in tokens]

def LemNormalize(text):
    return LemTokens(nltk.word_tokenize(text.lower().translate(remove_punct_dict)))

tfidf_vext = TfidfVectorizer(tokenizer=LemNormalize,stop_words='english', ngram_range=(1,2))

ftr_vector = tfidf_vext.fit_transform(df['CONTENT_TITLE'])

 


 

# 코드 설명

 

remove_punct_dict = dict((ord(punct), None) for punct in string.punctuation)
# string.punctuation : 모든 구두점문자(쉼표, 마침표, 물음표, 느낌표, 따옴표 등)를 담고있는 문자열
# ord : 입력받은 문자열의 아스키 코드(유사:유니코드)를 반환.

 

 

lemmar = WordNetLemmatizer()
# NLTK(Natural language Toolkit) 라이브러리에서 제공하는 표제어 추출기 중 하나. : 영어 텍스트에서 단어의 기본형을 추출하는데 사용.

 

 

 

def LemTokens_eng(tokens):
    return [lemmar.lemmatize(token) for token in tokens]
# 앞서 생성한 WordNetLemmatizer를 사용하여 입력된 토큰 리스트에 대해 표제어 추출(lemmatization)을 수행한다.

def LemNormalize_eng(text):
    return LemTokens_eng(nltk.word_tokenize(text.lower().translate(remove_punct_dict)))
# 입력받은 텍스트를 소문자로 변환 -> 구두점 제거 -> 단어 토큰화 -> 표제어 추출을 수행.

 

 

tfidf_vect_eng = TfidfVectorizer(tokenizer=LemNormalize_eng,stop_words='english', ngram_range=(1,2))
# TfidfVectorizer를 초기화한 후 앞서 정의한 LemNormalize 함수를 사용하여 텍스트 전처리를 수행한다.
# stop_words를 영어로 하여 불용어를 사용하도록 설정한다.
# ngram_range : 단어의 단일 및 이중(n-gram) 토큰을 모두 포함하도록 벡터화 한다.

 

 

ftr_vector_eng = tfidf_vect_eng.fit_transform(df['CONTENT_TITLE'])
# 원하는 컬럼을 가져와 fir_transform() 메소드를 통해 TF-IDF 모델을 학습하고 변환하며 그에 해당하는 행렬을 생성한다.

 

 

 

 

 

728x90