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


# 为了复现性

np.random.seed(1237)

label_index = files_train.targetlabel_names = files_train.target_nameslabelled_files = files_train.filenames

data_tags = ["filename","category","news"]data_list = []

# 读取文件中的数据并将其添加到列表





data = pd.DataFrame.from_records(data_list, columns=data_tags)

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

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

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

拆分数据进行训练和测试

Python


# 让我们以80%的数据作为训练,剩下的20%作为测试。



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个新闻组



num_labels = 20vocab_size = 15000batch_size = 100 # 用Vocab Size定义Tokenizer



tokenizer = 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.8742

Test 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方法训练了我们的数据集之后,我们将如上所述评估模型。

混淆矩阵

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

保存模型

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


# 创建一个HDF5文件'my_model.h5'



model.model.save('my_model.h5')

# 保存令牌生成器,即词汇表



with 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库构建了一个简单而强大的神经网络。

(0)

相关推荐

  • NS之VGG(Keras):基于Keras的VGG16实现之《复仇者联盟3》灭霸图像风格迁移设计(A Neural Algorithm of Artistic Style)

    NS之VGG(Keras):基于Keras的VGG16实现之<复仇者联盟3>灭霸图像风格迁移设计(A Neural Algorithm of Artistic Style) 导读 通过代码 ...

  • Keras: 基于Python的深度学习库

    Keras 是一个用 Python 编写的高级神经网络 API,它能够以TensorFlow, CNTK或者 Theano作为后端运行.Keras 的开发重点是支持快速的实验.能够以最小的时延把你的想 ...

  • 使用深度学习进行视频修剪

    介绍 在本教程中,我们将构建深度学习任务,自动修剪我们的视频使用标志!这样的应用程序可以让那些不擅长编辑视频的人们的生活变得更容易. 我们使用像"拇指朝上"和"拇指朝下& ...

  • kapre- Keras音频预处理python库

    kapre是Keras音频预处理器,用于在GPU上实时计算STFT,ISTFT,Melspectrogram. 在Python 3.6和3.7上通过测试. 为什么选择Kapre? 与预计算 您可以优化 ...

  • Python爬取腾讯视频跑男的评论,并做了简单文本可视化分析

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 以下文章来源于菜J学Python,作者: J哥 前言 「<奔跑吧>第五季」已经播出两期 ...

  • python数据挖掘第三篇-垃圾短信文本分类

    文本分类总体上包括8个步骤.数据探索分析->数据抽取->文本预处理->分词->去除停用词->文本向量化表示->分类器->模型评估.重要python库包括num ...

  • 如何将关键词信息融入到文本分类任务

    在知乎看到这样一个问题[如何将关键词信息融入到文本分类任务],简单说一下自己的经验,供大家参考: 首先说,现在基本各组都有自己的关键词词库,构造方法也都基本上相似. 简单点的就是TF-IDF筛选,复杂 ...

  • Python和JavaScript哪个简单?Python入门!

    在编程界,Python和JavaScript都是非常具有影响力的编程语言,占据着主导性的地位,而且简单易学.通俗易懂,非常适合0基础小白.那么Python和JavaScript哪个更容易上手呢?我们通 ...

  • Python常用的库简单介绍

    Python常用的库简单介绍一下 fuzzywuzzy ,字符串模糊匹配.   esmre ,正则表达式的加速器.   colorama 主要用来给文本添加各种颜色,并且非常简单易用.   Prett ...

  • 深度学习其实并不难:卷积神经网络的简单介绍

    关于CNN, 第1部分:卷积神经网络的介绍 CNN是什么?:它们如何工作,以及如何在Python中从头开始构建一个CNN. 在过去的几年里,卷积神经网络(CNN)引起了人们的广泛关注,尤其是因为它彻底 ...

  • Python基础手册17——简单语句

    Python语句 Python的语法实际上是由语句和表达式组成的(语句使用关键字来组成,只执行某种操作,可以没有返回值:而表达式没有关键字,是使用数学运算符构成的算数表达式,是一个单纯的运算求值过程, ...

  • python读取pdf中的文本

    python处理pdf也是常用的技术了,对于python3来说,pdfminer3k是一个非常好的工具. pip install pdfminer3k 首先,为了满足大部分人的需求,我先给一个通用一点 ...

  • 长短期记忆网络LSTM在时间序列预测和文本分类中的应用

    长短期记忆网络或LSTM网络是深度学习中使用的一种递归神经网络,可以成功地训练非常大的体系结构. 什么是LSTM? LSTM代表长短期记忆网络,在深度学习领域使用.它是各种循环神经网络(RNN),能够 ...