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 相关文章推荐
Python 自动安装 Rising 杀毒软件
Apr 24 Python
Python 类与元类的深度挖掘 I【经验】
May 06 Python
Android 兼容性问题:java.lang.UnsupportedOperationException解决办法
Mar 19 Python
python利用lxml读写xml格式的文件
Aug 10 Python
Python利用multiprocessing实现最简单的分布式作业调度系统实例
Nov 14 Python
python实现随机调用一个浏览器打开网页
Apr 21 Python
Pandas Shift函数的基础入门学习笔记
Nov 16 Python
python scp 批量同步文件的实现方法
Jan 03 Python
Python中关于浮点数的冷知识
Sep 22 Python
Python 绘制可视化折线图
Jul 22 Python
Python中Cookies导出某站用户数据的方法
May 17 Python
Python实现的扫码工具居然这么好用!
Jun 07 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
php实现比较全的数据库操作类
2015/06/18 PHP
PHP Yaf框架的简单安装使用教程(推荐)
2016/06/08 PHP
功能强大的php分页函数
2016/07/20 PHP
PHPWind9.0手动屏蔽验证码解决后台关闭验证码但是依然显示的问题
2016/08/12 PHP
工作中常用到的JS表单验证代码(包括例子)
2010/11/11 Javascript
Javascript 面试题随笔
2011/03/31 Javascript
在网站上应该用的30个jQuery插件整理
2011/11/03 Javascript
javascript 实现简单的table排序及table操作练习
2012/12/28 Javascript
JQuery判断子iframe何时加载完成解决方案
2013/08/20 Javascript
Javascript倒计时页面跳转实例小结
2013/09/11 Javascript
JavaScript中的apply和call函数详解
2014/07/20 Javascript
javascript抽象工厂模式详细说明
2014/12/16 Javascript
Web前端新人笔记之jquery入门心得(新手必看)
2016/05/17 Javascript
Angular 通过注入 $location 获取与修改当前页面URL的实例
2017/05/31 Javascript
JS按条件 serialize() 对应标签的使用方法
2017/07/24 Javascript
谈谈对vue响应式数据更新的误解
2017/08/01 Javascript
JS同步、异步、延迟加载的方法
2018/05/05 Javascript
Vue实现用户自定义字段显示数据的方法
2018/08/28 Javascript
详解JavaScript实现动态的轮播图效果
2019/04/29 Javascript
vue实现购物车的小练习
2020/12/21 Vue.js
[02:39]DOTA2国际邀请赛助威团西雅图第一天
2013/08/08 DOTA
Python模拟登陆淘宝并统计淘宝消费情况的代码实例分享
2016/07/04 Python
python3实现全角和半角字符转换的方法示例
2017/09/21 Python
Python实现的选择排序算法示例
2017/11/29 Python
Python处理文本换行符实例代码
2018/02/03 Python
Python实现的括号匹配判断功能示例
2018/08/25 Python
深入了解和应用Python 装饰器 @decorator
2019/04/02 Python
python 解决函数返回return的问题
2020/12/05 Python
css3 线性渐变和径向渐变示例附图
2014/04/08 HTML / CSS
美国一家全面的在线零售鞋类公司:SHOEBACCA
2017/01/06 全球购物
纽约海:Sea New York
2018/11/04 全球购物
某公司面试题
2012/03/05 面试题
爱牙日活动总结
2014/08/29 职场文书
迎新生欢迎词2015
2015/07/16 职场文书
MySQL系列之四 SQL语法
2021/07/02 MySQL
漫画「请问您今天要来点兔子吗?」最新杂志彩页公开
2022/03/24 日漫