专栏首页拓端tecdatPython使用神经网络进行简单文本分类
原创

Python使用神经网络进行简单文本分类

原文链接:http://tecdat.cn/?p=8613

深度学习无处不在。在本文中,我们将使用Keras进行文本分类。

准备数据集

出于演示目的,我们将使用  20个新闻组  数据集。数据分为20个类别,我们的工作是预测这些类别。如下所示:

通常,对于深度学习,我们将训练和测试数据分开。

导入所需的软件包

Python

import pandas as pdimport numpy as npimport picklefrom keras.preprocessing.text import Tokenizerfrom keras.models import Sequentialfrom keras.layers import Activation, Dense, Dropoutfrom sklearn.preprocessing import LabelBinarizerimport sklearn.datasets as skdsfrom pathlib import Path

将数据从文件加载到Python变量

Python

# For reproducibilitynp.random.seed(1237)label_index = files_train.targetlabel_names = files_train.target_nameslabelled_files = files_train.filenamesdata_tags = ["filename","category","news"]data_list = []# Read and add data from file to a listdata = pd.DataFrame.from_records(data_list, columns=data_tags)

在我们的情况下,数据无法以CSV格式提供。我们有文本数据文件,文件存放的目录是我们的标签或类别。

我们将使用scikit-learn load_files方法。这种方法可以为我们提供原始数据以及标签和标签索引。

在以上代码的结尾,我们将有一个数据框,其中包含文件名,类别和实际数据。

拆分数据进行训练和测试

Python

# lets take 80% data as training and remaining 20% for test.train_size = int(len(data) * .8) train_posts = data['news'][:train_size]train_tags = data['category'][:train_size]train_files_names = data['filename'][:train_size] test_posts = data['news'][train_size:]test_tags = data['category'][train_size:]test_files_names = data['filename'][train_size:]

标记化并准备词汇

Python

# 20 news groupsnum_labels = 20vocab_size = 15000batch_size = 100 # define Tokenizer with Vocab Sizetokenizer = Tokenizer(num_words=vocab_size)tokenizer.fit_on_texts(train_posts)

在对文本进行分类时,我们首先使用Bag Of Words方法对文本进行预处理。

预处理输出标签/类

在将文本转换为数字向量后,我们还需要确保标签以神经网络模型接受的数字格式表示。

建立Keras模型并拟合

PowerShell

model = Sequential()

它为输入数据的形状以及构成模型的图层类型提供了简单的配置。

这是一些适合度和测试准确性的代码段

100/8145 [..............................] - ETA: 31s - loss: 1.0746e-04 - acc: 1.0000200/8145 [..............................] - ETA: 31s - loss: 0.0186 - acc: 0.9950    300/8145 [>.............................] - ETA: 35s - loss: 0.0125 - acc: 0.9967400/8145 [>.............................] - ETA: 32s - loss: 0.0094 - acc: 0.9975500/8145 [>.............................] - ETA: 30s - loss: 0.0153 - acc: 0.9960...7900/8145 [============================>.] - ETA: 0s - loss: 0.1256 - acc: 0.98548000/8145 [============================>.] - ETA: 0s - loss: 0.1261 - acc: 0.98558100/8145 [============================>.] - ETA: 0s - loss: 0.1285 - acc: 0.98548145/8145 [==============================] - 29s 4ms/step - loss: 0.1293 - acc: 0.9854 - val_loss: 1.0597 - val_acc: 0.8742Test accuracy: 0.8767123321648251

评估模型

Python

for i in range(10):    prediction = model.predict(np.array([x_test[i]]))    predicted_label = text_labels[np.argmax(prediction[0])]    print(test_files_names.iloc[i])    print('Actual label:' + test_tags.iloc[i])    print("Predicted label: " + predicted_label)

在Fit方法训练了我们的数据集之后,我们将如上所述评估模型。

混淆矩阵

混淆矩阵是可视化模型准确性的最佳方法之一。

保存模型

通常,深度学习的用例就像在不同的会话中进行数据训练,而使用训练后的模型进行预测一样。

# creates a HDF5 file 'my_model.h5'model.model.save('my_model.h5')# Save Tokenizer i.e. Vocabularywith open('tokenizer.pickle', 'wb') as handle:    pickle.dump(tokenizer, handle, protocol=pickle.HIGHEST_PROTOCOL)

Keras没有任何实用程序方法可将Tokenizer与模型一起保存。我们必须单独序列化它。

加载Keras模型

Python

预测环境还需要注意标签。

encoder.classes_ #LabelBinarizer

预测

如前所述,我们已经预留了一些文件进行实际测试。

Python

labels = np.array(['alt.atheism', 'comp.graphics', 'comp.os.ms-windows.misc','comp.sys.ibm.pc.hardware', 'comp.sys.mac.hardware', 'comp.windows.x','misc.forsale', 'rec.autos', 'rec.motorcycles', 'rec.sport.baseball','rec.sport.hockey', 'sci.crypt', 'sci.electronics', 'sci.med', 'sci.space','soc.religion.christian', 'talk.politics.guns', 'talk.politics.mideast','talk.politics.misc', 'talk.religion.misc']) ...for x_t in x_tokenized:    prediction = model.predict(np.array([x_t]))    predicted_label = labels[np.argmax(prediction[0])]    print("File ->", test_files[i], "Predicted label: " + predicted_label)    i += 1

输出量

File -> C:\DL\20news-bydate\20news-bydate-test\comp.graphics\38758 Predicted label: comp.graphicsFile -> C:\DL\20news-bydate\20news-bydate-test\misc.forsale\76115 Predicted label: misc.forsaleFile -> C:\DL\20news-bydate\20news-bydate-test\soc.religion.christian\21329 Predicted label: soc.religion.christian

我们知道目录名是文件的真实标签,因此上述预测是准确的。

结论

在本文中,我们使用Keras python库构建了一个简单而强大的神经网络。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python使用神经网络进行简单文本分类

    出于演示目的,我们将使用 20个新闻组 数据集。数据分为20个类别,我们的工作是预测这些类别。如下所示:

    拓端
  • matlab使用样条插值重采样估计INR数据研究

    易患血液凝固的人用华法林治疗,血液稀释剂。国际标准化比率(INR)衡量药物的效果。较大剂量会增加INR,较小剂量会降低INR。患者由护士定期监测,当他们的INR...

    拓端
  • R语言里的非线性模型:多项式回归、局部样条、平滑样条、广义加性模型分析

    在这里,我们放宽了流行的线性技术的线性假设。有时线性假设只是一个很差的近似值。有许多方法可以解决此问题,其中一些方法可以通过使用正则化方法降低模型复杂性来  解...

    拓端
  • FCN 的简单实现

    学习了沐神的 gluon 课程,觉得里面有关于 fcn 的课程(http://t.cn/RQI7iD7 ) 特别有用,于是总结一下,同时使用 pytorch 重...

    啦啦啦
  • FCN 的简单实现

    学习了沐神的 gluon 课程,觉得里面有关于 fcn 的课程(http://t.cn/RQI7iD7 ) 特别有用,于是总结一下,同时使用 pytorch 重...

    AI研习社
  • 用R语言做时间序列分析(附数据集和源码)

    时间序列(time series)是一系列有序的数据。通常是等时间间隔的采样数据。如果不是等间隔,则一般会标注每个数据点的时间刻度。 下面以time serie...

    机器学习AI算法工程
  • (一)Tensorflow搭建普通神经网络实现MNIST手写字体识别及预测

    输入层数据为维度(1, 784),其中1表示数据数量,因为网络一次只处理一张图片,所以为1,784是图像数据维度,将$28\times 28 \times1$的...

    xdq101
  • 用R语言做时间序列分析(附数据集和源码)

    时间序列(time series)是一系列有序的数据。通常是等时间间隔的采样数据。如果不是等间隔,则一般会标注每个数据点的时间刻度。 下面以time seri...

    机器学习AI算法工程
  • [编程经验] TensorFlow实现线性支持向量机SVM

    [点击蓝字,一键关注~] 今天要说的是线性可分情况下的支持向量机的实现,如果对于平面内的点,支持向量机的目的是找到一条直线,把训练样本分开,使得直线到两个样本的...

    用户1622570
  • 获取元素的样式属性 原

    document.getElementById("test").style.color 这种方式获取的只是内联样式,并不能获取内部样式和外部样式,下面为内部样式

    tianyawhl

扫码关注云+社区

领取腾讯云代金券