TensorFlow之文本分类算法-3

1 前言

2 收集数据

3 探索数据

4 选择模型

5 准备数据

N-gram向量集

序列向量集

序列向量集主要是用于序列模型中对文本执行分词与向量化,与n-gram向量集类似,也使用特征选择与标准化的技术优化序列向量集的表示。

在一些文本样例中,单词的顺序会对文本的意义产生关键的影响,也就是,单词顺序不同,则文本表示的意义不同。例如,文本【I used to hate my commute. My new bike changed that completely】,只能在按单词的顺序理解文本自身的意义。模型CNNs/RNNs(卷积神经网络/循环神经网络,在后续章节中详细描述)能按照样例中单词的顺序推断出文本的意义。因此,对于这些模型,使用分词的序列表示文本,而序列会体现出分词在原文中的顺序。

分词

文本可以表示成一个字符序列或者一个单词序列,实际证明单词序列的表示能提供更加优越的性能,在工业界这是一种常用而且高效的文本处理方法,而字符序列只适用于存在大量拼写错误的文本中,这是非常少见的场景。

向量化

向量化是将分词所得的单词序列转换成数字化的向量集,使用1-gram以及分词索引实现向量化的转换如下所示:

如上所示,Texts是原文本,包括两个文本,Index表示使用1-gram分词所得的索引列表,列表中每个分词是乱序的,其编号表示的索引位是从1到6,而索引位0用于标识未知的分词,索引位1表示分词the,由于the在原文中出现的频率高,因此,其索引位被赋予值1。Sequence表示第一个文本的数字化的单词序列,序列是按照原文的单词顺序排列,其中1表示索引位的the,2表示索引位的mouse,以此类推。

以下分别描述两类单词序列的编码方式,One-hot encoding、Word embeddings。

One-hot encoding

该编码方式是使用n维向量空间表示单词序列,其中,n表示分词所得的词汇总量,如上例中,n等于7。由于以词汇为单位的表示方式简单,因此,其耗费的工作量也很小,但是在实际的应用场景中,词汇总量通常达到几十万个,one-hot编码方式将使得向量集合变得非常稀疏以及低效,如下所示:

如上所示,文本是二维数组,其中,第一维的大小等于6,表示原文单词序列的大小。第二维的大小等于7,表示单词序列中每个元素在词汇中的索引位。例如,第一维对应的第一行是[0, 1, 0, 0, 0, 0, 0],对应词汇集合中的第一索引位的元素,表示the,第二维对应的第二行是[0, 0, 1, 0, 0, 0, 0],对应词汇集合中的第二索引位的元素,表示mouse,依次类推。

Word embeddings

该编码方式是使用嵌入层处理相似的分词集合,使用一个稠密的向量空间表示分词集合,向量空间中的单词位置以及单词之间的距离可以体现出单词的相似度,其关系模型如下所示:

如上所示,Male-Female表示性别的向量空间,Verb Tense表示动词时态的向量空间,Country-Capital表示国家与首都的向量空间。

在神经网络的机器学习模型中,通常提供一个嵌入层作为第一层,该层的主要作用是将单词编码所得的向量集合转换成word embedding向量集合用于训练,其中,每个单词的索引都可以表示成一个稠密类型的向量集合,该向量集合存储真实的单词以及体现出单词在语义空间中的位置,嵌入层的演进如下所示:

如上所示,从左边向右边演进,左边输入原文,随后分词,根据分词的索引对原文编码,随后对编码的向量集合执行转换,每个单词对应一个稠密类型的表示。

特征选择

并非所有的分词在标签预测中都发挥作用,需要对机器学习的过程进行优化,使用有效的方法从词汇集合中删除那些出现频率较低或者与预测不相关的单词,如前面所述,事实证明选择20k的分词数据量作为特征分析与预测是最有效的,序列向量模型的执行步骤如下所示:

  • 对文本执行分词

  • 选择使用top-20k的词汇量

  • 转换分词成序列向量集合

  • 转换序列向量集合成固定的序列长度(稠密类型)

使用TensorFlow的技术框架实现代码步骤如下所示:

标签向量化

前面部分所描述内容是与原文的向量化相关,在实际的应用环境中,也需要将标签向量化,例如,可以将标签分类成[0, num_classes - 1]范围的数组,其中,num_classes是类别的总数。

稀疏矩阵的数据结构

在一个矩阵中,如果0值元素个数远大于非0值元素个数,则该矩阵是稀疏矩阵,为了节省存储空间,通常将稀疏矩阵进行压缩存储,其数据结构描述如下所示:

稀疏矩阵的压缩存储使用三个一维数组:

数组1:将矩阵中每列的非0值存储在该一维数组中,从矩阵的第一列开始递增排列

数组2:存储数组1中的每个元素在矩阵的行索引

数组3:存储数组1的索引位,每个元素表示数组2中开始矩阵新列的列索引,列索引递增,最后一个元素表示数组1的长度

假设,存在如下的矩阵:

1 0

0 2

3 0

数组1:[1,3,2]

数组2:[0,2,1]

数组3:[0,2,3]

稠密矩阵的数据结构

在一个矩阵中,如果0值元素个数远小于非0值元素个数,则该矩阵是稠密矩阵,其数据结构一般是直接使用一维数组存储,其数据结构描述如下所示:

稠密矩阵的存储使用一个一维数组:

数组1:将矩阵中每列的所有元素存储在该一维数组中,从矩阵的第一列开始递增排列

(未完待续)

### 文本分类 #### 数据预处理 要求训练集和测试集分开存储,对于中文的数据必须先分词,对分词后的词用空格符分开,并且将标签连接到每条数据的尾部,标签和句子用分隔符\分开。具体的如下: * 今天 的 天气 真好\积极 #### 文件结构介绍 * config文件:配置各种模型的配置参数 * data:存放训练集和测试集 * ckpt_model:存放checkpoint模型文件 * data_helpers:提供数据处理的方法 * pb_model:存放pb模型文件 * outputs:存放vocab,word_to_index, label_to_index, 处理后的数据 * models:存放模型代码 * trainers:存放训练代码 * predictors:存放预测代码 #### 训练模型 * python train.py --config_path="config/textcnn_config.json" #### 预测模型 * 预测代码都在predictors/predict.py中,初始化Predictor对象,调用predict方法即可。 #### 模型的配置参数详述 ##### textcnn:基于textcnn的文本分类 * model_name:模型名称 * epochs:全样本迭代次数 * checkpoint_every:迭代多少步保存一次模型文件 * eval_every:迭代多少步验证一次模型 * learning_rate:学习速率 * optimization:优化算法 * embedding_size:embedding层大小 * num_filters:卷积核的数量 * filter_sizes:卷积核的尺寸 * batch_size:批样本大小 * sequence_length:序列长度 * vocab_size:词汇表大小 * num_classes:样本的类别数,二分类时置为1,多分类时置为实际类别数 * keep_prob:保留神经元的比例 * l2_reg_lambda:L2正则化的系数,主要对全连接层的参数正则化 * max_grad_norm:梯度阶段临界值 * train_data:训练数据的存储路径 * eval_data:验证数据的存储路径 * stop_word:停用词表的存储路径 * output_path:输出路径,用来存储vocab,处理后的训练数据,验证数据 * word_vectors_path:词向量的路径 * ckpt_model_path:checkpoint 模型的存储路径 * pb_model_path:pb 模型的存储路径 ##### bilstm:基于bilstm的文本分类 * model_name:模型名称 * epochs:全样本迭代次数 * checkpoint_every:迭代多少步保存一次模型文件 * eval_every:迭代多少步验证一次模型 * learning_rate:学习速率 * optimization:优化算法 * embedding_size:embedding层大小 * hidden_sizes:lstm的隐层大小,列表对象,支持多层lstm,只要在列表中添加相应的层对应的隐层大小 * batch_size:批样本大小 * sequence_length:序列长度 * vocab_size:词汇表大小 * num_classes:样本的类别数,二分类时置为1,多分类时置为实际类别数 * keep_prob:保留神经元的比例 * l2_reg_lambda:L2正则化的系数,主要对全连接层的参数正则化 * max_grad_norm:梯度阶段临界值 * train_data:训练数据的存储路径 * eval_data:验证数据的存储路径 * stop_word:停用词表的存储路径 * output_path:输出路径,用来存储vocab,处理后的训练数据,验证数据 * word_vectors_path:词向量的路径 * ckpt_model_path:checkpoint 模型的存储路径 * pb_model_path:pb 模型的存储路径 ##### bilstm atten:基于bilstm + attention 的文本分类 * model_name:模型名称 * epochs:全样本迭代次数 * checkpoint_every:迭代多少步保存一次模型文件 * eval_every:迭代多少步验证一次模型 * learning_rate:学习速率 * optimization:优化算法 * embedding_size:embedding层大小 * hidd
实现端到端的K-means算法集成的文本分类,可以分为以下几个步骤: 1. 数据准备:准备文本数据集,并将文本转换为向量表示。可以使用词袋模型或者TF-IDF模型将文本转换为向量表示。 2. K-means聚类:使用TensorFlow实现K-means聚类算法,并将文本向量作为输入进行聚类。聚类的结果可以作为文本分类的特征向量。 3. 分类模型:使用TensorFlow实现分类模型,可以使用神经网络模型或者其他机器学习模型。将聚类得到的特征向量作为输入,训练分类模型。 4. 集成:将K-means聚类和分类模型集成起来,形成端到端的文本分类系统。 下面是一个简单的代码示例: ```python import tensorflow as tf from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.datasets import fetch_20newsgroups from sklearn.cluster import KMeans from sklearn.metrics import accuracy_score # 数据准备 newsgroups_train = fetch_20newsgroups(subset='train') tfidf = TfidfVectorizer(stop_words='english') X = tfidf.fit_transform(newsgroups_train.data) # K-means聚类 kmeans = KMeans(n_clusters=20, init='k-means++', max_iter=100, n_init=1) kmeans.fit(X) X_clusters = kmeans.predict(X) # 分类模型 model = tf.keras.Sequential([ tf.keras.layers.Input(shape=(20,)), tf.keras.layers.Dense(64, activation='relu'), tf.keras.layers.Dense(20, activation='softmax') ]) model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) # 集成 model.fit(X_clusters, newsgroups_train.target, epochs=10) ``` 在上面的代码中,我们使用20个类别的新闻数据集作为示例数据集,首先使用TF-IDF模型将文本转换为向量表示,然后使用K-means聚类算法文本向量聚类成20个簇,得到聚类结果作为分类的特征向量。然后使用一个简单的神经网络作为分类模型,将聚类结果作为输入进行训练,最后得到一个端到端的文本分类系统。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wangys2006

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值