中文新闻分类 数据集_直播案例 | 使用KNN对新闻主题进行自动分类

获取案例链接、直播课件、数据集在本公众号内发送“机器学习”。

本案例旨在用新闻主题分类这一简单任务演示机器学习的一般流程。具体地,我们使用了一个搜狐新闻数据集。使用 Python 的 jieba 分词工具对中文新闻进行了分词处理。然后使用 Scikit-learn 工具的 K近邻算法构建 KNN 模型。最后对新闻分类的效果进行了简单的分析。

ae366b59788272b1bbc515d70e18ac24.png

1 数据读取

搜狐中文新闻数据存放在 train_sample_utf8.csv 和 test_sample_utf8.csv 两个文件中,在后面的分析中我们分别当做训练集和测试集来使用。我们首先使用 Pandas 中的 read_csv 函数读取。

import pandas as pd
%matplotlib inline
raw_train = pd.read_csv("./input/train_sample_utf8.csv",encoding="utf8")
raw_test = pd.read_csv("./input/test_sample_utf8.csv",encoding="utf8")

查看两个文件的前五行数据。

raw_train.head(5)
e16c68ebac0f1302c40c8c7a353a7471.png
raw_test.head(5)
ab03264e1015b1eedec1e215903409f1.png
raw_train.shape

(5521, 3)

raw_test.shape

(3111, 2)

可见,训练集包含 5521 条新闻,测试集中包含 3111 条新闻。那么,训练集和测试集中,不同主题的新闻分布如何?我们可以借助 DataFrame 某列的 value_counts 方法完成统计。然后使用 plot 函数进行可视化显示。

import matplotlib.pyplot as plt
plt.figure(figsize=(15, 8))
plt.subplot(1, 2, 1)
raw_train["分类"].value_counts().sort_index().plot(kind="barh",title='训练集新闻主题分布')
plt.subplot(1, 2, 2)
raw_test["分类"].value_counts().sort_index().plot(kind="barh",title='测试集新闻主题分布')
e30ca7ece760fbb18950d30950d5b6f5.png
d867060e44568e063d0829b4331622a3.png

一共包含 12 种主题的新闻,无论是在训练集还是测试集,各个主题的新闻分布较均衡。

2 对新闻内容进行分词

由于新闻为中文,再进一步进行处理之前,我们需要先对新闻内容进行分词。简单来说,分词就是将连在一起的新闻内容中的词进行分割。这里我们使用 Python 中一个著名的中文分析器 jieba 完成这项任务。为了后续方便,我们封装一个 news_cut 函数,它接受的输入为新闻内容,输出为分词后的结果。分词后,词与词之间使用空格进行分隔。

import jieba
def news_cut(text):
    return " ".join(list(jieba.cut(text)))
#简单测试下分词效果
test_content = "六月初的一天,来自深圳的中国旅游团游客纷纷拿起相机拍摄新奇刺激的好莱坞环球影城主题公园场景。"
print(news_cut(test_content))
afaa2e2fcf55ffbfe8384c55ad96dbee.png
31ace6ab00da559393467f57967a5413.png

现在利用封装的分词函数,对训练集和测试集中的新闻内容进行分词处理,分词结果保存到对应 DataFrame 对象的 ”分词文章“ 一列。这里我们使用了 Pandas 中的 Series 对象的 map 函数。它能够接受一个函数,对 Series 中的每一个元素作为该函数的输入,然后将函数的输出返回。

raw_train["分词文章"] = raw_train["文章"].map(news_cut)
raw_test["分词文章"] = raw_test["文章"].map(news_cut)
raw_test.head(5)
37f95d1de37c3df6d178345707f4bd8b.png

3 将新闻表示为向量

#加载停用词
stop_words = []
file = open("./input/stopwords.txt") 
for line in file:
    stop_words.append(line.strip())
file.close()
from sklearn.feature_extraction.text import CountVectorizer
vectorizer = CountVectorizer(stop_words=stop_words)
X_train = vectorizer.fit_transform(raw_train["分词文章"])
X_test = vectorizer.transform(raw_test["分词文章"])

4 构建 KNN 分类器

使用 sklearn 中 neighbors 模块的 KNeighborsClassifier 类构建一个 KNN 分类器。我们将邻居数 n_neighbors 设置为 5 。使用邻居的标签进行投票时,用预测样本与邻居样本的距离的倒数作为权重。然后使用 fit方法,在训练集中训练模型。

from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=5,weights="distance")
knn.fit(X_train, raw_train["分类"])
65253980a709254b6266837b518c3a57.png

5 测试集新闻主题预测

模型训练完成后,可以使用 predict 方法对测试集中的样本进行预测,得到预测标签列表 Y_test 。

Y_test = knn.predict(X_test)

6 新闻主题分类效果进行评估

下面使用混淆矩阵来分析模型在测试样本上的表现。混淆矩阵从样本的真实标签和模型预测标签两个维度对测试集样本进行分组统计,然后以矩阵的形式展示。借助混淆矩阵可以很好地分析模型在每一类样本上的分类效果。为了更直观地分析,我们借助 Python 中可视化包 seaborn 提供的 heatmap 函数,将混淆矩阵可视化。

from sklearn.metrics import confusion_matrix
import seaborn as sns
import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(9, 7))
## 设置正常显示中文
sns.set(font='SimHei')
## 绘制热力图
ax = sns.heatmap(confusion_matrix(raw_test["分类"].values,Y_test),linewidths=.5,cmap="Greens",
                 annot=True, fmt='d',xticklabels=knn.classes_, yticklabels=knn.classes_)
ax.set_ylabel('真实')
ax.set_xlabel('预测')
ax.xaxis.set_label_position('top') 
ax.xaxis.tick_top()
ax.set_title('混淆矩阵热力图')
b92fb0f6b81790a1bb611595082424d1.png
a29007c34e04af4acab706cf34705468.png

这还不是一个完美的新闻主题分类器,这个分类器倾向于将主题预测为"教育"或"文化"。要获得更好的效果,我们可能还需要做很多工作,例如更好的文本预处理和表示,尝试不同的 K 值的效果,甚至利用其它的机器学习算法等。感兴趣的同学可以自己进一步进行尝试。

往期直播

65f1a843268ef77d15339352cb845935.png
5aa9d2ff2c23bbfa64b00318d64ce7d3.png
8a53c19f9ea5df2a7c45477835046df7.png
a2f0dbc8e3ccc5bff3ffa4e270c52642.png
2489460e55532211b6677f25f8347985.png

3e0c2211de8ce1bfd3d12fd7ca93b763.png

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值