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


Posted in Python onFebruary 25, 2021

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

准备数据集

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

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

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

导入所需的软件包

Python

import pandas as pd
import numpy as np
import pickle
from keras.preprocessing.text import Tokenizer
from keras.models import Sequential
from keras.layers import Activation, Dense, Dropout
from sklearn.preprocessing import LabelBinarizer
import sklearn.datasets as skds
from pathlib import Path

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

Python

# 为了复现性

np.random.seed(1237)
  
label_index = files_train.target
label_names = files_train.target_names
labelled_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 = 20
vocab_size = 15000
batch_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.0000
200/8145 [..............................] - ETA: 31s - loss: 0.0186 - acc: 0.9950    
300/8145 [>.............................] - ETA: 35s - loss: 0.0125 - acc: 0.9967
400/8145 [>.............................] - ETA: 32s - loss: 0.0094 - acc: 0.9975
500/8145 [>.............................] - ETA: 30s - loss: 0.0153 - acc: 0.9960
...
7900/8145 [============================>.] - ETA: 0s - loss: 0.1256 - acc: 0.9854
8000/8145 [============================>.] - ETA: 0s - loss: 0.1261 - acc: 0.9855
8100/8145 [============================>.] - ETA: 0s - loss: 0.1285 - acc: 0.9854
8145/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方法训练了我们的数据集之后,我们将如上所述评估模型。

混淆矩阵

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

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

保存模型

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

# 创建一个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_ #标签二值化

预测

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

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:DL20news-bydate20news-bydate-testcomp.graphics38758 Predicted label: comp.graphics
File -> C:DL20news-bydate20news-bydate-testmisc.forsale76115 Predicted label: misc.forsale
File -> C:DL20news-bydate20news-bydate-testsoc.religion.christian21329 Predicted label: soc.religion.christian

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

结论

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

以上就是Python如何使用神经网络进行简单文本分类的详细内容,更多关于python 神经网络进行文本分类的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
一个基于flask的web应用诞生 组织结构调整(7)
Apr 11 Python
django文档学习之applications使用详解
Jan 29 Python
Python中 传递值 和 传递引用 的区别解析
Feb 22 Python
Python实现的knn算法示例
Jun 14 Python
使用Python OpenCV为CNN增加图像样本的实现
Jun 10 Python
python实现websocket的客户端压力测试
Jun 25 Python
python随机数分布random均匀分布实例
Nov 27 Python
python基于opencv检测程序运行效率
Dec 28 Python
Python各种扩展名区别点整理
Feb 27 Python
python实现最速下降法
Mar 24 Python
使用pygame实现垃圾分类小游戏功能(已获校级二等奖)
Jul 23 Python
python3列表删除大量重复元素remove()方法的问题详解
Jan 04 Python
Matlab使用Plot函数实现数据动态显示方法总结
Feb 25 #Python
如何用 Python 制作一个迷宫游戏
Feb 25 #Python
Django和Ueditor自定义存储上传文件的文件名
Feb 25 #Python
Python 图片处理库exifread详解
Feb 25 #Python
python中if嵌套命令实例讲解
Feb 25 #Python
Matplotlib animation模块实现动态图
Feb 25 #Python
python连接手机自动搜集蚂蚁森林能量的实现代码
Feb 24 #Python
You might like
浅析Dos下运行php.exe,出现没有找到php_mbstring.dll 错误的解决方法
2013/06/29 PHP
php将字符串全部转换成大写或者小写的方法
2015/03/17 PHP
完美解决在ThinkPHP控制器中命名空间的问题
2017/05/05 PHP
CodeIgniter框架实现的整合Smarty引擎DEMO示例
2019/03/28 PHP
PHP pthreads v3下的Volatile简介与使用方法示例
2020/02/21 PHP
javascript 选择文件夹对话框(web)
2009/07/07 Javascript
asp.net网站开发中用jquery实现滚动浏览器滚动条加载数据(类似于腾讯微博)
2012/03/14 Javascript
使用js完成节点的增删改复制等的操作
2014/01/02 Javascript
七夕情人节丘比特射箭小游戏
2015/08/20 Javascript
基于jQuery Ajax实现上传文件
2016/03/24 Javascript
JSON格式的时间/Date(2367828670431)/格式转为正常的年-月-日 格式的代码
2016/07/27 Javascript
AngularJs页面筛选标签小功能
2016/08/01 Javascript
js仿腾讯QQ的web登陆界面
2016/08/19 Javascript
Node.js开发教程之基于OnceIO框架实现文件上传和验证功能
2016/11/30 Javascript
Vue.js:使用Vue-Router 2实现路由功能介绍
2017/02/22 Javascript
Bootstrap警告(Alerts)的实现方法
2017/03/22 Javascript
Vuex之理解state的用法实例
2017/04/19 Javascript
使用Vue写一个datepicker的示例
2018/01/27 Javascript
微信小程序页面生命周期详解
2018/01/31 Javascript
layDate插件设置开始和结束时间
2018/11/15 Javascript
autojs 蚂蚁森林能量自动拾取即给指定好友浇水的实现方法
2020/05/03 Javascript
[02:29]完美世界高校联赛上海赛区回顾
2015/12/15 DOTA
python实现的用于搜索文件并进行内容替换的类实例
2015/06/28 Python
Python通过future处理并发问题
2017/10/17 Python
Python zip()函数用法实例分析
2018/03/17 Python
Django中多种重定向方法使用详解
2019/07/17 Python
基于tensorflow __init__、build 和call的使用小结
2021/02/26 Python
HTML5打开本地app应用的方法
2016/03/31 HTML / CSS
美国基督教约会网站:ChristianCafe.com
2020/02/04 全球购物
毕业生自荐信格式
2014/03/07 职场文书
小学生常见病防治方案
2014/06/06 职场文书
体育节口号
2014/06/19 职场文书
党员自评材料范文
2014/12/17 职场文书
小学新教师个人总结
2015/02/05 职场文书
搞笑Gif:这么白这么长的腿像极了一楼的女朋友
2022/03/21 杂记
table不让td文字溢出操作方法
2022/12/24 HTML / CSS