import pandas as pd
import numpy as np
import nltk
from nltk.corpus import stopwords
from nltk.stem import WordNetLemmatizer
from nltk.tokenize import word\_tokenize
from sklearn.feature\_extraction.text import TfidfVectorizer
from sklearn.naive\_bayes import MultinomialNB
from sklearn.metrics import f1\_score
from sklearn.model\_selection import KFold
from sklearn.utils.class\_weight import compute\_class\_weight
from tqdm import tqdm

# Set seed for reproducibility
np.random.seed(42)

# Load the train.csv file
train\_df = pd.read\_csv('train.csv')

# Print the number of examples for each class
print(train\_df['label'].value\_counts())

# Compute class weights
class\_weights = compute\_class\_weight(class\_weight='balanced', classes=np.unique(train\_df['label']), y=train\_df['label'])

# Download necessary NLTK resources
nltk.download('omw-1.4')
nltk.download('wordnet')

# Define NLTK objects
lemmatizer = WordNetLemmatizer()
stopwords\_set = set(stopwords.words('english'))

# Define function to preprocess text
def preprocess\_text(text):
 # Tokenize text
 tokens = word\_tokenize(text.lower())
 # Remove stopwords
 tokens = [token for token in tokens if token not in stopwords\_set]
 # Lemmatize tokens
 tokens = [lemmatizer.lemmatize(token) for token in tokens]
 # Join tokens back into text
 preprocessed\_text = ' '.join(tokens)
 return preprocessed\_text

# Preprocess the text in the train dataframe
train\_df['text'] = train\_df['text'].apply(preprocess\_text)

# Define TF-IDF vectorizer
tfidf\_vectorizer = TfidfVectorizer()

# Define Naive Bayes classifier
nb\_classifier = MultinomialNB(alpha=1.0, class\_prior=None, fit\_prior=True)

# Define KFold cross-validation object
kf = KFold(n\_splits=5, shuffle=True)

# Initialize list to store F1 scores for each epoch
f1\_scores = []

# Loop over each fold
for fold\_idx, (train\_indices, val\_indices) in enumerate(kf.split(train\_df)):
 # Split train and validation data
 train\_data = train\_df.iloc[train\_indices]
 val\_data = train\_df.iloc[val\_indices]

 # Fit TF-IDF vectorizer on train data
 tfidf\_vectorizer.fit(train\_data['text'])

 # Transform train and validation data using TF-IDF vectorizer
 train\_features = tfidf\_vectorizer.transform(train\_data['text'])
 val\_features = tfidf\_vectorizer.transform(val\_data['text'])

 # Fit Naive Bayes classifier on train features
 nb\_classifier.fit(train\_features, train\_data['label'], class\_weight=class\_weights)

 # Predict on validation features
 val\_predictions = nb\_classifier.predict(val\_features)

 # Compute F1 score for validation predictions
 val\_f1 = f1\_score(val\_data['label'], val\_predictions, average='macro')
 f1\_scores.append(val\_f1)

 # Print F1 score for current epoch
 print(f'Fold {fold\_idx + 1} F1 Score: {val\_f1}')

# Compute average F1 score over all epochs
avg\_f1\_score = sum(f1\_scores) / len(f1\_scores)
print(f'Average F1 Score: {avg\_f1\_score}')

# Load the test.csv file
test\_df = pd.read\_csv('test.csv')

#Preprocess the text in the test dataframe
test\_df['text'] = test\_df['text'].apply(preprocess\_text)

#Tokenize the words
test\_df['text'] = test\_df['text'].apply(word\_tokenize)

#Normalize the words
test\_df['text'] = test\_df['text'].apply(normalize)

#Remove stop words
test\_df['text'] = test\_df['text'].apply(remove\_stopwords)

#Correct typos
test\_df['text'] = test\_df['text'].apply(correct\_typos)

#Lemmatize words
test\_df['text'] = test\_df['text'].apply(lemmatize)

#Convert text to string
test\_df['text'] = test\_df['text'].apply(' '.join)

#Vectorize the text using TfidfVectorizer
tfidf = TfidfVectorizer()
X\_test = tfidf.transform(test\_df['text'])

#Use the trained model to make predictions on the test set
y\_pred = model.predict(X\_test)

#Create a new dataframe for the test set predictions
test\_preds\_df = pd.DataFrame({'id': test\_df['id'], 'label': y\_pred})

#Save the test set predictions to a CSV file
test\_preds\_df.to\_csv('./0317\_test.csv', index=False)

at above code please use Laplace Smoothing.
and also use tqdm to check progress with progress bar each epoch
임포트 판다로 PDnumpy를 np로 임포트import nltknltk.corpus에서 중지어 가져오기nltk.stem에서 WordNetLemmatizer를 가져옵니다.nltk.tokenize에서 word\_tokenize 가져오기sklearn.feature\_extraction.text에서 TfidfVectorizer를 가져옵니다.sklearn.naive\_bayes에서 MultinomialNB를 가져옵니다.sklearn.metrics에서 f1\_score 가져오기sklearn.model\_selection에서 KFold를 가져옵니다.sklearn.utils.class\_weight에서 compute\_class\_weight를 가져옵니다.tqdm에서 tqdm 가져오기# 재현성을 위한 시드 설정np.random.seed(42)# train.csv 파일 로드train\_df = pd.read\_csv('train.csv')# 각 클래스에 대한 예제 수를 인쇄합니다.print(train\_df['label'].value\_counts())# 클래스 가중치 계산class\_weights = compute\_class\_weight(class\_weight='balanced', classes=np.unique(train\_df['label']), y=train\_df['label'])# 필요한 NLTK 리소스 다운로드nltk.download('omw-1.4')nltk.download('wordnet')# NLTK 객체 정의lemmatizer = WordNetLemmatizer()stopwords\_set = set(stopwords.words('english'))# 텍스트 전처리 함수 정의def preprocess\_text(text): # 텍스트 토큰화 tokens = word\_tokenize(text.lower()) # 중지어 제거 토큰 = [토큰이 스톱워드\_set에 없는 경우 토큰의 토큰에 대한 토큰] # 토큰 레매타이즈 토큰 = [토큰의 토큰에 대해 lemmatizer.lemmatize(토큰)] # 토큰을 다시 결합합니다. # 토큰을 다시 텍스트로 결합 preprocessed\_text = ' '.join(tokens) 반환 전처리된\_text# 기차 데이터 프레임의 텍스트를 전처리합니다.train\_df['text'] = train\_df['text'].apply(preprocess\_text)# TF-IDF 벡터라이저 정의tfidf\_vectorizer = TfidfVectorizer()# 나이브 베이즈 분류기 정의nb\_classifier = MultinomialNB(alpha=1.0, class\_prior=None, fit\_prior=True)# KFold 교차 검증 객체 정의하기kf = KFold(n\_splits=5, shuffle=True)# 각 에포크에 대한 F1 점수를 저장하도록 목록을 초기화합니다.F1\_SCORES = []# 각 폴드에 대해 반복for fold\_idx, (train\_indices, val\_indices) in enumerate(kf.split(train\_df)): # 훈련과 유효성 검사 데이터 분할 train\_data = train\_df.iloc[train\_indices] val\_data = train\_df.iloc[val\_indices] # 열차 데이터에 TF-IDF 벡터라이저 맞추기 tfidf\_vectorizer.fit(train\_data['text']) # TF-IDF 벡터라이저를 사용하여 훈련 및 검증 데이터 변환 train\_features = tfidf\_vectorizer.transform(train\_data['text']) val\_features = tfidf\_vectorizer.transform(val\_data['text']) # 기차 특징에 나이브 베이즈 분류기 맞추기 nb\_classifier.fit(train\_features, train\_data['label'], class\_weight=class\_weights) # 검증 피처에 대한 예측 val\_predictions = nb\_classifier.predict(val\_features) # 유효성 검사 예측을 위한 F1 점수 계산 val\_f1 = f1\_score(val\_data['label'], val\_predictions, average='macro') F1\_SCORES.APPEND(VAL\_F1) # 현재 에포크에 대한 F1 점수 인쇄 print(f'Fold {fold\_idx + 1} F1 Score: {val\_f1}')# 모든 에포크의 평균 F1 점수를 계산합니다.avg\_f1\_score = sum(f1\_scores) / len(f1\_scores)print(f'평균 F1 점수: {avg\_f1\_score}')# test.csv 파일 로드test\_df = pd.read\_csv('test.csv')#테스트 데이터 프레임의 텍스트를 전처리합니다.test\_df['text'] = test\_df['text'].apply(preprocess\_text)#단어 토큰화test\_df['text'] = test\_df['text'].apply(word\_tokenize)#단어 정규화test\_df['text'] = test\_df['text'].apply(normalize)#중지 단어 제거test\_df['text'] = test\_df['text'].apply(remove\_stopwords)#오타 수정test\_df['text'] = test\_df['text'].apply(correct\_typos)#단어의 의미화test\_df['text'] = test\_df['text'].apply(lemmatize)#텍스트를 문자열로 변환test\_df['text'] = test\_df['text'].apply(' '.join)#TfidfVectorizer를 사용하여 텍스트 벡터화하기tfidf = TfidfVectorizer()X\_test = tfidf.transform(test\_df['text'])#학습된 모델을 사용하여 테스트 세트에 대한 예측을 수행합니다.y\_pred = model.predict(X\_test)#테스트 세트 예측을 위한 새 데이터 프레임 만들기test\_preds\_df = pd.DataFrame({'id': test\_df['id'], 'label': y\_pred})#테스트 세트 예측을 CSV 파일에 저장하기test\_preds\_df.to\_csv('./0317\_test.csv', index=False)위 코드에서 라플라스 평활화를 사용하세요.그리고 각 에포크마다 진행률 표시줄로 진행률을 확인하려면 tqdm을 사용하세요.