본문 바로가기

캐글 코드

캐글 NLP 뉴스데이터 분석 1탄

반응형

데이터 받아오기

# 여기서 lines=true는 라인별로 데이터를 받겠다는 의미임

df = pd.read_json('/kaggle/input/news-category-dataset/News_Category_Dataset_v3.json', lines=True)
df.head()

 

 

고윳값 출력하기

#카테고리를 라는 컬럼에 고윳갑 가져오기

categories = df.category.unique()
categories

 

한컬럼의 고윳값 일부 변경

#지정한 카테고리 외에는 전부 other로 표현

selected_categories = ['POLITICS', 'WELLNESS', 'ENTERTAINMENT', 'TRAVEL', 'STYLE & BEAUTY', 'QUEER VOICES', 'FOOD & DRINK', 'BUSINESS', 'SPORTS']
df.loc[~df['category'].isin(selected_categories), 'category'] = 'OTHER'

 

필요한 데이터만 컬럼만 남기기

#headline,category만 남기기

df_selected = df[['headline','category']]

 

필요한 데이터갯수(행)만큼 남기기

#10000개의 데이터갯수만큼 남기기
df_selected = df[:10000] #Reduce the number of rows to train Fast -- remove that tine to train on the whole data

 

 

데이터를 숫자형태로 바꾸기

#category의 컬럼의 고윳값을 0~26과같이 숫자형태로 바꾸어줌

label_encoder = LabelEncoder()
df_selected['category'] = label_encoder.fit_transform(df_selected['category'])

 

 

학습데이터와 테스트데이터로 나누기

#여기서 test_size는 학습데이터와 테스트데이터의 비율을 의미함

#random_statae는 같은 결과가 나오도록 랜덤하게 돌리는 일을 함

X_train, X_test, y_train, y_test = train_test_split(df_selected['headline'], df_selected['category'], test_size=0.15, random_state=42)


print('Shape of training feature:', X_train.shape)
print('Shape of testing feature:', X_test.shape)
print('Shape of training label:', y_train.shape)
print('Shape of training label:', y_test.shape)

 

TF-IDF 사용하기

 

max_features = 100 #the number of feature also to train faster -- remove that max_features to increase the accuracy
vectorizer = CountVectorizer(max_features = max_features)
X_train_bow = vectorizer.fit_transform(X_train)
X_test_bow = vectorizer.transform(X_test)

 

 

학습모델 사용하기

# Train models
svm_classifier_bow = SVC()
nb_classifier_bow = MultinomialNB()

svm_classifier_bow.fit(X_train_bow, y_train)
nb_classifier_bow.fit(X_train_bow, y_train)

 

svc모델은 다음과같이 데이터를 나눌때 잘 나눈 선을 그려주는 모델

 

 

MultinomialNB()의 경우는 단어의 빈도를 벡터로 표현하여 각클래스에 속할확률을 계산합니다.

 

 

테스트하기

# zero_division은 분모가 0이 된다면 1로 대체하여 계산하도록 하는방식
y_pred_svm = svm_classifier_bow.predict(vectorizer.transform(X_test))
y_pred_nb = nb_classifier_bow.predict(vectorizer.transform(X_test))

print("SVM Results:")
print(classification_report(y_test, y_pred_svm, zero_division=1))

print("Naive Bayes Results:")
print(classification_report(y_test, y_pred_nb, zero_division=1))

 

 

predict함수를 통해서 예측 결과를 저장후  classification_report라는 함수로 예측결과를 비교함

 

 

def named_entities(text):
    words = word_tokenize(text)
    ner_tags = ne_chunk(pos_tag(words))
    return ' '.join([tag.label() for tag in ner_tags if isinstance(tag, nltk.Tree)])

X_train_ner = X_train.apply(named_entities)
X_test_ner = X_test.apply(named_entities)

vectorizer_ner = CountVectorizer()
X_train_ner_bow = vectorizer_pos.fit_transform(X_train_ner)
X_test_ner_bow = vectorizer_pos.transform(X_test_ner)

 

 

from nltk.tokenize import word_tokenize의 word_tokenize는 월드 문자를 단어기준으로 나누는 것입니다.

from nltk import pos_tag는 그 단어가 동사인지 명사인지 구분해주는 것입니다.

 

apply( named_entities)을 통해서 X_train에게 만들어낸 함수를 적용하기

이후 tf-idf를 사용하기

 

 

 

위와 같은 모델로 예측하기


y_pred_svm = svm_classifier_pos.predict(X_test_pos_bow)
y_pred_nb = nb_classifier_pos.predict(X_test_pos_bow)

print("SVM Results:")
print(classification_report(y_test, y_pred_svm, zero_division=1))

print("Naive Bayes Results:")
print(classification_report(y_test, y_pred_nb, zero_division=1))

 

 

 

 

def named_entities(text):
    words = word_tokenize(text)
    ner_tags = ne_chunk(pos_tag(words))
    return ' '.join([tag.label() for tag in ner_tags if isinstance(tag, nltk.Tree)])

X_train_ner = X_train.apply(named_entities)
X_test_ner = X_test.apply(named_entities)

vectorizer_ner = CountVectorizer()
X_train_ner_bow = vectorizer_pos.fit_transform(X_train_ner)
X_test_ner_bow = vectorizer_pos.transform(X_test_ner)

 

 

from nltk import ne_chunk의 뜻은 ner로 사람인지 장소인지등을 명명해주는 라이브러리로 

이전과같이 단어분리와 pos_tag로 동사인지 명사인지등을 구분해주는 작업을 함

이후 ner을 적용함

 

두전처리 데이터합치기

 

X_train_mix =np.concatenate([ X_train_ner_bow.toarray()  , X_train_pos_bow.toarray()] , axis = 1)
X_test_mix = np.concatenate([ X_test_ner_bow.toarray()  , X_test_pos_bow.toarray()] , axis = 1)

 

# Evaluate models
y_pred_svm = svm_classifier_mix.predict(X_test_mix)
y_pred_nb = nb_classifier_mix.predict(X_test_mix)

print("SVM Results:")
print(classification_report(y_test, y_pred_svm, zero_division=1))

print("Naive Bayes Results:")
print(classification_report(y_test, y_pred_nb, zero_division=1))

 

반응형

'캐글 코드' 카테고리의 다른 글

캐글 우주 타이타닉 예측 1탄  (0) 2024.02.23
캐글 자전거 수요예측  (0) 2024.02.22
캐글 SMS Spam Collection Dataset 2탄  (0) 2024.01.31
캐글 SMS Spam Collection Dataset 1탄  (0) 2024.01.31
캐글 News Detection 1탄  (1) 2024.01.30