데이터 받아오기
# 여기서 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 |