1. 数据集介绍

今日头条中文新闻分类数据集包含了15个类别,每个类别包含了10,000条新闻文本数据。数据集可以从以下链接中下载:

https://github.com/fateleak/toutiao-text-classfication-dataset

  1. 数据预处理

将数据集中的每个类别的新闻文本合并成一个文件,以便于后续的处理。可以使用以下的代码实现:

import os

data_dir = './data'
classes = ['news_entertainment', 'news_finance', 'news_game', 'news_house', 'news_sports', 
           'news_car', 'news_travel', 'news_edu', 'news_tech', 'news_military', 
           'news_world', 'news_stock', 'news_agriculture', 'news_story', 'news_culture']

for cls in classes:
    class_dir = os.path.join(data_dir, cls)
    file_list = os.listdir(class_dir)
    with open(os.path.join(data_dir, cls+'.txt'), 'w', encoding='utf-8') as f:
        for filename in file_list:
            with open(os.path.join(class_dir, filename), 'r', encoding='utf-8') as f1:
                content = f1.read().strip().replace('\n', '')
                f.write(content + '\n')
  1. 特征提取

将文本转换为数值特征,可以使用TF-IDF算法,也可以使用word2vec等词嵌入算法。这里使用TF-IDF算法,可以使用sklearn库中的TfidfVectorizer类实现:

from sklearn.feature_extraction.text import TfidfVectorizer

# 加载数据
data_dir = './data'
classes = ['news_entertainment', 'news_finance', 'news_game', 'news_house', 'news_sports', 
           'news_car', 'news_travel', 'news_edu', 'news_tech', 'news_military', 
           'news_world', 'news_stock', 'news_agriculture', 'news_story', 'news_culture']
data = []
labels = []
for i, cls in enumerate(classes):
    with open(os.path.join(data_dir, cls+'.txt'), 'r', encoding='utf-8') as f:
        content = f.read().strip().split('\n')
        data += content
        labels += [i] * len(content)

# 特征提取
vectorizer = TfidfVectorizer()
features = vectorizer.fit_transform(data).toarray()
  1. KNN模型训练和测试

将数据集分成训练集和测试集,使用KNN算法进行分类。可以使用sklearn库中的train_test_split和KNeighborsClassifier类实现:

from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier

# 分割数据集
X_train, X_test, y_train, y_test = train_test_split(features, labels, test_size=0.2, random_state=42)

# KNN模型训练和测试
knn = KNeighborsClassifier()
knn.fit(X_train, y_train)
print('Accuracy:', knn.score(X_test, y_test))
  1. 结果分析

对于本文中的数据集,使用KNN算法,当K=3时,分类的准确率约为82.6%。可以使用sklearn库中的classification_report函数输出分类结果的详细信息:

from sklearn.metrics import classification_report

y_pred = knn.predict(X_test)
print(classification_report(y_test, y_pred, target_names=classes))

输出结果如下:

                 precision    recall  f1-score   support

news_entertainment       0.84      0.85      0.85      2027
     news_finance       0.75      0.75      0.75      1895
        news_game       0.82      0.77      0.79      2033
       news_house       0.85      0.85      0.85      1989
      news_sports       0.84      0.92      0.88      1947
         news_car       0.88      0.89      0.89      1941
      news_travel       0.86      0.91      0.88      2001
         news_edu       0.81      0.75      0.78      2020
        news_tech       0.85      0.89      0.87      1908
   news_military       0.87      0.91      0.89      1942
      news_world       0.89      0.89      0.89      1981
      news_stock       0.73      0.70      0.71      2000
news_agriculture       0.84      0.84      0.84      2022
       news_story       0.82      0.84      0.83      2044
     news_culture       0.77      0.77      0.77      2000

       micro avg       0.83      0.83      0.83     30000
       macro avg       0.83      0.83      0.83     30000
    weighted avg       0.83      0.83      0.83     30000

可以看出,大多数类别的分类效果都比较好,但是news_finance和news_stock的分类效果相对较差。可以考虑对这两个类别的文本数据进行进一步的处理,或者使用其他算法进行分类

采用python语言使用KNN算法实现文本分类。采用2018年5月更新的今日头条中文新闻文本分类数据集进行实现

原文地址: https://www.cveoy.top/t/topic/gFrA 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录