Text-CNN 文本分类

合集下载

基于textcnn的公安诈骗案件警情分类

基于textcnn的公安诈骗案件警情分类
2.2 textcnn 词语向量化的提出使卷积神经网络在文本领域的应用成为可 能。Textcnn是将卷积神经网络用在自然语言处理领域的算法。 假设需要对以下文本进行分类:“我爱北京天安门。”假 定为二分类。使用textcnn方法,步骤如下: 首先,对文本分词,分词结果为:“我/爱/北京/天安门 /。”。分词后通过词嵌入将文本转化为矩阵。假设词向量的长 度为6,则这段文本转化为形状为(5,6)的矩阵。 取形状为(3,6), (4,6), (5,6)的卷积核各2个,分别对矩阵卷 积,得到形状为(3,1), (2,1), (1,1)的矩阵各2个。 对得到的每个矩阵做最大池化,得到6个形状为(1,1)的矩 阵。将6个矩阵拼接成为一个形状为(6,1)的向量。 对得到的向量做全连接,并使用softmax函数激活,得到形 状为(2,1)的向量,从而得出分类结果。 Textcnn基本流程图如图1所示。
文本分类任务是自然语言处理领域的研究热点之一。顾名 思义,文本分类任务指的是对于文本集,按照规定的分类体系 和分类准则,进行自动归类的过程。将文本分类任务应用于警 情领域,对案件信息进行自动分类,可以有效减轻用户在将案 件归档时的工作量,节约人力成本。
1 相关工作 随着自然语言处理领域的研究的不断突破,文本分类的技
词袋模型和TF-IDF方法都是针对整个文本进行特征提取的 方法,这两种方法都会忽略次序信息。而在深度学习兴起后, 研究者们开始探究将每个词语向量化的方法。One-hot encoder 方法是将词语向量化的方法之一。这种方法是将所有的词语都 转化为只有一个位置为1,其他位置全部为0的向量。假设某种 语言一共有N个词语(已去停用词),那么将这N个词语按照某
在2006年,Hinton等提出逐层训练的思想[4],深度学

基于Albert_与TextCNN_的中文文本分类研究

基于Albert_与TextCNN_的中文文本分类研究

第 22卷第 4期2023年 4月Vol.22 No.4Apr.2023软件导刊Software Guide基于Albert与TextCNN的中文文本分类研究李飞鸽,王芳,黄树成(江苏科技大学计算机学院,江苏镇江,212100)摘要:互联网数据众多,为高效管理互联网的海量中文文本数据,提出基于Albert与TextCNN的中文文本分类方法(ATT)。

该方法引入Albert模型解决一词多义问题,使用TF-IDF算法抽取当前文本数据中权重最高的5个词构建整个文档关键词表,将关键词表与Albert生成的词向量进行向量拼接,构成一个融合关键词信息的多义词向量。

并且,在传统TextCNN基础上根据中文语言特点调整卷积核窗口大小以提取文本数据的深层局部特征。

实验表明,ATT模型相较于未加入TF-IDF关键词表、未调整卷积核大小的传统模型,F1值分别提升1.88%和2.26%,为中文文本分类提供了一种新方法。

关键词:向量;文本特征提取;多标签;文本分类DOI:10.11907/rjdk.221591开放科学(资源服务)标识码(OSID):中图分类号:TP391.1 文献标识码:A文章编号:1672-7800(2023)004-0027-05Research on Chinese Text Classification Based on Albert and TextCNNLI Fei-ge, WANG Fang, HUANG Shu-cheng(School of Computer, Jiangsu University of Science and Technology, Zhenjiang 212100, China)Abstract:Due to the large amount of Internet data, in order to efficiently manage the massive Chinese text data on the Internet, a Chinese text classification method based on Albert and TextCNN (referred to as ATT) is proposed. This method introduces Albert model to solve the problem of polysemy. TF-IDF algorithm is used to extract the five words with the highest weight in the current text data to build the whole docu‐ment keyword table. The keyword table and the word vector generated by Albert are vector spliced to form a polysemy word vector that inte‐grates keyword information. Moreover, on the basis of traditional TextCNN, the window size of convolution kernel is adjusted according to the characteristics of Chinese language to extract the deep local features of text data. The experimental results show that the ATT model, compared with the traditional model without TF-IDF keyword list and without adjusting the size of convolution kernel, increases the F1 value by 1.88% and 2.26% respectively, providing a new method for Chinese text classification.Key Words:word vector; text feature extraction; multi-label; text classification0 引言在移动互联时代,文本数据呈现爆炸式增长。

中文文本分类大概的步骤

中文文本分类大概的步骤

中⽂⽂本分类⼤概的步骤⽂本分类问题:给定⽂档p(可能含有标题t),将⽂档分类为n个类别中的⼀个或多个⽂本分类应⽤:常见的有垃圾邮件识别,情感分析⽂本分类⽅向:主要有⼆分类,多分类,多标签分类⽂本分类⽅法:传统机器学习⽅法(贝叶斯,svm等),深度学习⽅法(fastText,TextCNN等)⽂本分类的处理⼤致分为⽂本预处理、⽂本特征提取、分类模型构建等。

和英⽂⽂本处理分类相⽐,中⽂⽂本的预处理是关键技术。

⼀、中⽂分词:针对中⽂⽂本分类时,很关键的⼀个技术就是中⽂分词。

特征粒度为词粒度远远好于字粒度,其⼤部分分类算法不考虑词序信息,基于字粒度的损失了过多的n-gram信息。

下⾯简单总结⼀下中⽂分词技术:基于字符串匹配的分词⽅法、基于理解的分词⽅法和基于统计的分词⽅法。

具体可参考:中⽂分词原理及分词⼯具介绍https:///flysky1991/article/details/73948971/1,基于字符串匹配的分词⽅法:过程:这是⼀种基于词典的中⽂分词,核⼼是⾸先建⽴统⼀的词典表,当需要对⼀个句⼦进⾏分词时,⾸先将句⼦拆分成多个部分,将每⼀个部分与字典⼀⼀对应,如果该词语在词典中,分词成功,否则继续拆分匹配直到成功。

核⼼:字典,切分规则和匹配顺序是核⼼。

分析:优点是速度快,时间复杂度可以保持在O(n),实现简单,效果尚可;但对歧义和未登录词处理效果不佳。

2,基于理解的分词⽅法:基于理解的分词⽅法是通过让计算机模拟⼈对句⼦的理解,达到识别词的效果。

其基本思想就是在分词的同时进⾏句法、语义分析,利⽤句法信息和语义信息来处理歧义现象。

它通常包括三个部分:分词⼦系统、句法语义⼦系统、总控部分。

在总控部分的协调下,分词⼦系统可以获得有关词、句⼦等的句法和语义信息来对分词歧义进⾏判断,即它模拟了⼈对句⼦的理解过程。

这种分词⽅法需要使⽤⼤量的语⾔知识和信息。

由于汉语语⾔知识的笼统、复杂性,难以将各种语⾔信息组织成机器可直接读取的形式,因此⽬前基于理解的分词系统还处在试验阶段。

多标签分类(multi-labelclassification)综述

多标签分类(multi-labelclassification)综述

多标签分类(multi-labelclassification)综述意义⽹络新闻往往含有丰富的语义,⼀篇⽂章既可以属于“经济”也可以属于“⽂化”。

给⽹络新闻打多标签可以更好地反应⽂章的真实意义,⽅便⽇后的分类和使⽤。

难点(1)类标数量不确定,有些样本可能只有⼀个类标,有些样本的类标可能⾼达⼏⼗甚⾄上百个。

 (2)类标之间相互依赖,例如包含蓝天类标的样本很⼤概率上包含⽩云,如何解决类标之间的依赖性问题也是⼀⼤难点。

(3)多标签的训练集⽐较难以获取。

⽅法⽬前有很多关于多标签的学习算法,依据解决问题的⾓度,这些算法可以分为两⼤类:⼀是基于问题转化的⽅法,⼆是基于算法适⽤的⽅法。

基于问题转化的⽅法是转化问题数据,使之使⽤现有算法;基于算法适⽤的⽅法是指针对某⼀特定的算法进⾏扩展,从⽽能够处理多标记数据,改进算法,适⽤数据。

基于问题转化的⽅法基于问题转化的⽅法中有的考虑标签之间的关联性,有的不考虑标签的关联性。

最简单的不考虑关联性的算法将多标签中的每⼀个标签当成是单标签,对每⼀个标签实施常见的分类算法。

具体⽽⾔,在传统机器学习的模型中对每⼀类标签做⼆分类,可以使⽤SVM、DT、Naïve Bayes、DT、Xgboost等算法;在深度学习中,对每⼀类训练⼀个⽂本分类模型(如:textCNN、textRNN等)。

考虑多标签的相关性时候可以将上⼀个输出的标签当成是下⼀个标签分类器的输⼊。

在传统机器学习模型中可以使⽤分类器链,在这种情况下,第⼀个分类器只在输⼊数据上进⾏训练,然后每个分类器都在输⼊空间和链上的所有之前的分类器上进⾏训练。

让我们试着通过⼀个例⼦来理解这个问题。

在下⾯给出的数据集⾥,我们将X作为输⼊空间,⽽Y作为标签。

在分类器链中,这个问题将被转换成4个不同的标签问题,就像下⾯所⽰。

黄⾊部分是输⼊空间,⽩⾊部分代表⽬标变量。

在深度学习中,于输出层加上⼀个时序模型,将每⼀时刻输⼊的数据序列中加⼊上⼀时刻输出的结果值。

利用CNN进行多分类的文档分类

利用CNN进行多分类的文档分类

利⽤CNN进⾏多分类的⽂档分类# coding: utf-8import tensorflow as tfclass TCNNConfig(object):"""CNN配置参数"""embedding_dim = 20 # 词向量维度seq_length = 100 # 序列长度num_classes = 73 # 类别数num_filters = 256 # 卷积核数⽬kernel_size = 5 # 卷积核尺⼨vocab_size = 5000 # 词汇表达⼩hidden_dim = 128 # 全连接层神经元dropout_keep_prob = 0.8 # dropout保留⽐例learning_rate = 0.001 # 学习率batch_size = 128 # 每批训练⼤⼩num_epochs = 5 # 总迭代轮次print_per_batch = 100 # 每多少轮输出⼀次结果save_per_batch = 10 # 每多少轮存⼊tensorboardclass TextCNN(object):"""⽂本分类,CNN模型"""def__init__(self, config):self.config = config# 三个待输⼊的数据self.input_x = tf.placeholder(tf.int32, [None, self.config.seq_length], name='input_x')self.input_y = tf.placeholder(tf.float32, [None, self.config.num_classes], name='input_y')self.keep_prob = tf.placeholder(tf.float32, name='keep_prob')n()def cnn(self):"""CNN模型"""# 词向量映射with tf.device('/cpu:0'):embedding = tf.get_variable('embedding', [self.config.vocab_size, self.config.embedding_dim])embedding_inputs = tf.nn.embedding_lookup(embedding, self.input_x)with _scope("cnn"):# CNN layerconv = yers.conv1d(embedding_inputs, self.config.num_filters, self.config.kernel_size, name='conv') # global max pooling layergmp = tf.reduce_max(conv, reduction_indices=[1], name='gmp')with _scope("score"):# 全连接层,后⾯接dropout以及relu激活fc = yers.dense(gmp, self.config.hidden_dim, name='fc1')fc = yers.dropout(fc, self.keep_prob)fc = tf.nn.relu(fc)# 分类器self.logits = yers.dense(fc, self.config.num_classes, name='fc2')self.y_pred_cls = tf.argmax(tf.nn.softmax(self.logits), 1) # 预测类别with _scope("optimize"):# 损失函数,交叉熵cross_entropy = tf.nn.softmax_cross_entropy_with_logits(logits=self.logits, labels=self.input_y)self.loss = tf.reduce_mean(cross_entropy)# 优化器self.optim = tf.train.AdamOptimizer(learning_rate=self.config.learning_rate).minimize(self.loss)with _scope("accuracy"):# 准确率correct_pred = tf.equal(tf.argmax(self.input_y, 1), self.y_pred_cls)self.acc = tf.reduce_mean(tf.cast(correct_pred, tf.float32))#!/usr/bin/python# -*- coding: utf-8 -*-from__future__import print_functionimport osimport sysimport timefrom datetime import timedeltaimport numpy as npimport tensorflow as tffrom sklearn import metricsfrom cnn_model import TCNNConfig, TextCNNfrom ews_loader import read_vocab, read_category, batch_iter, process_file, build_vocab base_dir = 'data/'train_dir = os.path.join(base_dir, 'train.txt')test_dir = os.path.join(base_dir, 'test.txt')val_dir = os.path.join(base_dir, 'test.txt')vocab_dir = os.path.join(base_dir, 'bbb.txt')save_dir = 'checkpoints/textcnn'save_path = os.path.join(save_dir, 'best_validation') # 最佳验证结果保存路径def get_time_dif(start_time):"""获取已使⽤时间"""end_time = time.time()time_dif = end_time - start_timereturn timedelta(seconds=int(round(time_dif)))def feed_data(x_batch, y_batch, keep_prob):feed_dict = {model.input_x: x_batch,model.input_y: y_batch,model.keep_prob: keep_prob}return feed_dictdef evaluate(sess, x_, y_):"""评估在某⼀数据上的准确率和损失"""data_len = len(x_)batch_eval = batch_iter(x_, y_, 128)total_loss = 0.0total_acc = 0.0for x_batch, y_batch in batch_eval:batch_len = len(x_batch)feed_dict = feed_data(x_batch, y_batch, 1.0)loss, acc = sess.run([model.loss, model.acc], feed_dict=feed_dict)total_loss += loss * batch_lentotal_acc += acc * batch_lenreturn total_loss / data_len, total_acc / data_lendef train():print("Configuring TensorBoard and Saver...")# 配置 Tensorboard,重新训练时,请将tensorboard⽂件夹删除,不然图会覆盖tensorboard_dir = 'tensorboard/textcnn'if not os.path.exists(tensorboard_dir):os.makedirs(tensorboard_dir)tf.summary.scalar("loss", model.loss)tf.summary.scalar("accuracy", model.acc)merged_summary = tf.summary.merge_all()writer = tf.summary.FileWriter(tensorboard_dir)# 配置 Saversaver = tf.train.Saver()if not os.path.exists(save_dir):os.makedirs(save_dir)print("Loading training and validation data...")# 载⼊训练集与验证集start_time = time.time()x_train, y_train = process_file(train_dir, word_to_id, cat_to_id, config.seq_length)x_val, y_val = process_file(val_dir, word_to_id, cat_to_id, config.seq_length)time_dif = get_time_dif(start_time)print("Time usage:", time_dif)# 创建sessionsession = tf.Session()session.run(tf.global_variables_initializer())writer.add_graph(session.graph)print('Training and evaluating...')start_time = time.time()total_batch = 0 # 总批次best_acc_val = 0.0 # 最佳验证集准确率last_improved = 0 # 记录上⼀次提升批次require_improvement = 1000 # 如果超过1000轮未提升,提前结束训练flag = Falsefor epoch in range(config.num_epochs):print('Epoch:', epoch + 1)batch_train = batch_iter(x_train, y_train, config.batch_size)for x_batch, y_batch in batch_train:feed_dict = feed_data(x_batch, y_batch, config.dropout_keep_prob)if total_batch % config.save_per_batch == 0:# 每多少轮次将训练结果写⼊tensorboard scalars = session.run(merged_summary, feed_dict=feed_dict)writer.add_summary(s, total_batch)if total_batch % config.print_per_batch == 0:# 每多少轮次输出在训练集和验证集上的性能feed_dict[model.keep_prob] = 1.0loss_train, acc_train = session.run([model.loss, model.acc], feed_dict=feed_dict)loss_val, acc_val = evaluate(session, x_val, y_val) # todoif acc_val > best_acc_val:# 保存最好结果best_acc_val = acc_vallast_improved = total_batchsaver.save(sess=session, save_path=save_path)improved_str = '*'else:improved_str = ''time_dif = get_time_dif(start_time)msg = 'Iter: {0:>6}, Train Loss: {1:>6.2}, Train Acc: {2:>7.2%},' \+ ' Val Loss: {3:>6.2}, Val Acc: {4:>7.2%}, Time: {5} {6}'print(msg.format(total_batch, loss_train, acc_train, loss_val, acc_val, time_dif, improved_str)) session.run(model.optim, feed_dict=feed_dict) # 运⾏优化total_batch += 1if total_batch - last_improved > require_improvement:# 验证集正确率长期不提升,提前结束训练print("No optimization for a long time, auto-stopping...")flag = Truebreak# 跳出循环if flag: # 同上breakdef test():print("Loading test data...")start_time = time.time()x_test, y_test = process_file(test_dir, word_to_id, cat_to_id, config.seq_length)session = tf.Session()session.run(tf.global_variables_initializer())saver = tf.train.Saver()saver.restore(sess=session, save_path=save_path) # 读取保存的模型print('Testing...')loss_test, acc_test = evaluate(session, x_test, y_test)msg = 'Test Loss: {0:>6.2}, Test Acc: {1:>7.2%}'print(msg.format(loss_test, acc_test))batch_size = 128data_len = len(x_test)num_batch = int((data_len - 1) / batch_size) + 1y_test_cls = np.argmax(y_test, 1)y_pred_cls = np.zeros(shape=len(x_test), dtype=np.int32) # 保存预测结果for i in range(num_batch): # 逐批次处理start_id = i * batch_sizeend_id = min((i + 1) * batch_size, data_len)feed_dict = {model.input_x: x_test[start_id:end_id],model.keep_prob: 1.0}y_pred_cls[start_id:end_id] = session.run(model.y_pred_cls, feed_dict=feed_dict)# 评估print("Precision, Recall and F1-Score...")print(metrics.classification_report(y_test_cls, y_pred_cls, target_names=categories))# 混淆矩阵print("Confusion Matrix...")cm = metrics.confusion_matrix(y_test_cls, y_pred_cls)print(cm)time_dif = get_time_dif(start_time)print("Time usage:", time_dif)if__name__ == '__main__':print('Configuring CNN model...')config = TCNNConfig()if not os.path.exists(vocab_dir): # 如果不存在词汇表,重建build_vocab(train_dir, vocab_dir, config.vocab_size)categories, cat_to_id = read_category()words, word_to_id = read_vocab(vocab_dir)config.vocab_size = len(words)model = TextCNN(config)# train()test()# coding: utf-8from__future__import print_functionimport osimport tensorflow as tfimport tensorflow.contrib.keras as krimport timefrom run_cnn import get_time_diffrom cnn_model import TCNNConfig, TextCNNfrom ews_loader import read_category, read_vocabbase_dir = 'data/'vocab_dir = os.path.join(base_dir, 'bbb.txt')save_dir = 'checkpoints/textcnn'save_path = os.path.join(save_dir, 'best_validation') # 最佳验证结果保存路径class CnnModel:def__init__(self):self.config = TCNNConfig()self.categories, self.cat_to_id = read_category()self.words, self.word_to_id = read_vocab(vocab_dir)self.config.vocab_size = len(self.words)self.model = TextCNN(self.config)self.session = tf.Session()self.session.run(tf.global_variables_initializer())saver = tf.train.Saver()saver.restore(sess=self.session, save_path=save_path) # 读取保存的模型def predict(self, message):# ⽀持不论在python2还是python3下训练的模型都可以在2或者3的环境下运⾏content = messagedata = [self.word_to_id[x] for x in content if x in self.word_to_id]feed_dict = {self.model.input_x: kr.preprocessing.sequence.pad_sequences([data], self.config.seq_length), self.model.keep_prob: 1.0}y_pred_cls = self.session.run(self.model.y_pred_cls, feed_dict=feed_dict)return self.categories[y_pred_cls[0]]if__name__ == '__main__':starttime = time.time()cnn_model = CnnModel()test_demo = [' 16-12-08 今年前11个⽉我国进出⼝总值21.83万亿元 ','16-12-08 英国知识产权局局长⼀⾏访问黄埔海关(图','16-12-08 厦门海关启动“互联⽹+⾃主报关”改⾰ ','16-12-08 江门海关“宪法⽇” 普法到⼀线(图)','16-12-08 27.5公⽄“萌萌哒”果实种⼦闯关被截获(图)','⼴州海关推动“主动披露” 体现执法“宽严相济”','16-12-07 胡伟在湛江出席全国沿海沿边地区基层反⾛私综合治理现场会(图)','16-12-07 锐意改⾰⾼效服务海关⼒助湛江书写蓝⾊经济梦想','16-12-07 红其拉甫海关查获毒品海洛因4.8千克(图)'] for i in test_demo:print(cnn_model.predict(i))print(get_time_dif(starttime))。

融合图卷积神经网络和BiGRU-TextCNN的罪名预测模型

融合图卷积神经网络和BiGRU-TextCNN的罪名预测模型

融合图卷积神经网络和BiGRU-TextCNN的罪名预测模型*江操 安德智 马雪洁甘肃政法大学 甘肃 兰州 730000摘 要 随着人工智能的发展和司法信息化体系的构建,运用人工智能解决司法领域的需求成为近年来自然语言处理领域的研究热点。

为了提升深度学习模型在罪名预测任务上的准确率,本文设想利用将图卷积神经网络提取文本之间的结构特征与传统的深度学习模型相融合,捕获更多潜在信息。

因此本文提出了一种融合图卷积神经网络和BiGRU-TextCNN的罪名预测模型,实验结果表明在Cail2018数据集上对罪名预测问题有较好的效果。

关键词 人工智能;自然语言处理;图卷积神经网络;深度学习;罪名预测Charge Prediction Model Integrating Graph Convolutional Neural Network and BiGRU-TextCNNJiang Cao, An De-zhi, Ma Xue-jieGansu University of Political Science and Law, Lanzhou 730000, Gansu Province, ChinaAbstract With the development of artificial intelligence and the construction of judicial information system, the need of using artificial intelligence to solve the issues in judicial field has become a research hotspot in the field of natural language processing in recent years. In order to improve the accuracy of deep learning models in charge prediction tasks, this paper envisages the integration of structural features in extracted texts by graph convolutional neural networks with traditional deep learning models to capture more potential information. Therefore, this paper proposes a charge prediction model that integrates graph convolutional neural network and BiGRU-TextCNN, and the experimental results show a good effect on the charge prediction problem in Cail2018 dataset.Key words artificial intelligence; natural language processing; graph convolutional neural networks; deep learning; charge prediction引言随着人工智能的发展和司法信息化体系的构建,将人工智能引入到司法领域成为近年来研究热点。

文心一言 文本分类

文心一言 文本分类

文心一言文本分类全文共四篇示例,供读者参考第一篇示例:文心一言是一种古代汉语文学体裁,是一种短小的诗文形式,主要用来记录作者的情感、感慨或者观察,具有浓厚的文学氛围。

文心一言的形式简洁明了,通常由五言句或七言句组成,内容简明扼要,表达深远。

文心一言在中国文学史上具有重要的地位,被誉为一种精炼、富有哲理的文学形式。

在现代社会中,文心一言虽然已经不再被使用于正式文学创作之中,但是却得到了新的应用领域——文本分类。

文本分类是信息检索与文本挖掘领域的一个重要分支,它的主要目的是将大量的文本数据按照一定的规则分类和整理,以便更好地进行信息检索和分析。

在文本分类过程中,文心一言可以被应用于不同的文本主题,例如文学作品、新闻报道、评论文章等。

通过将文心一言与不同主题进行匹配,我们可以更好地识别文本数据的主题和内容,从而更好地进行文本分类。

第二篇示例:文心一言是中国传统文学名著之一,是中国古代文学理论家刘勰所着的文学评论著作。

其中包含了很多关于文学艺术的见解和评价,被誉为文学的瑰宝之一。

在当今信息爆炸的时代,我们要学会对海量文本进行分类,以方便人们阅读和搜索。

本文将探讨如何利用文心一言中的文学评价理论来进行文本分类。

文心一言中对文学作品进行评价的方法可以帮助我们对文本进行分类。

刘勰在文心一言中提出了“言志、言文、言辞、言技、言事、言理”等六大评价标准,这些标准可以帮助我们对文本进行细致的评判。

通过“言辞”可以评判文本的语言表达是否清晰流畅,通过“言理”可以判断文本的逻辑是否严谨,通过“言事”可以评判文本是否立意深刻等。

通过这些评价标准,我们可以更加科学地对文本进行分类,将其归类到不同的主题或类型之中。

文心一言中提到的文学风格和表现手法也可以帮助我们进行文本分类。

刘勰在文心一言中对文学作品的风格和表现手法进行了深入的分析和评价,比如“雄壮”、“严肃”、“幽婉”、“娇丽”等诸多评价词汇。

通过对文本的风格和表现手法进行分析,我们可以将其归类到对应的文学流派或类型之中,比如将一篇表现出幽婉风格的诗歌与其他幽婉风格的诗歌进行分类,以方便读者进行阅读。

人工智能自然语言技术练习(试卷编号181)

人工智能自然语言技术练习(试卷编号181)

人工智能自然语言技术练习(试卷编号181)1.[单选题]以下是softmax函数的是()A)概率B)归一化C)损失函数D)空间答案:B解析:2.[单选题]关于距离空间其主要目的是A)求相关性B)构成线性空间C)度量后比较D)求信息熵答案:C解析:3.[单选题]语料库的加工方式不包括A)人工方式B)半自动方式C)自动方式D)干预方式答案:D解析:4.[单选题]如果对数据的特征做了归一化,会有什么优点A)提高复杂关系的拟合能力B)不确定C)训练数据归一化后,容易更快地通过梯度下降找 到最优解。

D)以上都正确答案:C解析:5.[单选题]常用的激活函数relu,下列对该激活函数描述正确的是?A)引用了无效的单元格地址B)过滤无效神经元C)不是激发函数D)将正数保留,将负数置06.[单选题]LSTM可以做特征提取,在以下的几个模型当中,哪个模型中使用到了A)bertB)GPTC)GPT-2D)ELMO答案:D解析:7.[单选题]集成学习是机器学习的重要组成部分,以下说法正确的是A)通过变量和因变量之间的一次函数关系构建的B)通过找到一个最优的超平面去完美的分类C)就是将多个机器学习模型组合起来,共同工作以达到优化算法的目的D)以上都正确答案:C解析:8.[单选题]在做传统NLP中的情感分析中,我们可以如何去思想这类人物A)使用机器学习的算法获取最终的情感B)使用深度学习的知识获取情感C)使用神经网络进行判断D)手工手机情感极性词典答案:D解析:9.[单选题]RNN和CNN下面说法正确的是A)RNN在处理长依赖序列问题的时候效果会比较好B)RNN属于卷积神经网络C)CNN在处理长序列问题会更好D)CNN又叫循环神经网络答案:A解析:10.[单选题]使用的TensorFlow中的一个方法进行数据的计算tf.subtract,最终会返回什么类型的数据A)TensorB)数组C)矢量D)范数答案:A11.[单选题]向量空间的别称是:A)线性空间B)内积空间C)赋范空间D)希尔伯特空间答案:A解析:12.[单选题]国标码用()个字节表示一个汉字,每个字节的ASCII码都大于()。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Text-CNN 文本分类1.简介TextCNN 是利用卷积神经网络对文本进行分类的算法,由Yoon Kim 在“Convolutional Neural Networks for Sentence Classification” 一文(见参考[1]) 中提出. 是2014年的算法.图1-1 参考[1] 中的论文配图图1-2 网络盗图合理性:深度学习模型在计算机视觉与语音识别方面取得了卓越的成就. 在NLP 也是可以的.卷积具有局部特征提取的功能, 所以可用CNN 来提取句子中类似n-gram 的关键信息.2.参数与超参数•sequence_lengthQ: 对于CNN, 输入与输出都是固定的,可每个句子长短不一, 怎么处理?A: 需要做定长处理, 比如定为n, 超过的截断, 不足的补0. 注意补充的0对后面的结果没有影响,因为后面的max-pooling只会输出最大值,补零的项会被过滤掉.•num_classes多分类, 分为几类.•vocabulary_size语料库的词典大小, 记为|D|.•embedding_size将词向量的维度, 由原始的|D| 降维到embedding_size.•filter_size_arr多个不同size的filter.3.Embedding Layer通过一个隐藏层, 将one-hot 编码的词投影到一个低维空间中.本质上是特征提取器,在指定维度中编码语义特征. 这样, 语义相近的词, 它们的欧氏距离或余弦距离也比较近.4.Convolution Layer为不同尺寸的filter 都建立一个卷积层. 所以会有多个feature map.图像是像素点组成的二维数据, 有时还会有RGB三个通道, 所以它们的卷积核至少是二维的.从某种程度上讲, word is to text as pixel is to image, 所以这个卷积核的size 与stride 会有些不一样.•x ix i∈R k, 一个长度为n的句子中, 第i 个词语的词向量, 维度为k.•x i:jx i:j=x i⊕x i+1⊕...⊕x j表示在长度为n的句子中, 第[i,j] 个词语的词向量的拼接.•h卷积核所围窗口中单词的个数, 卷积核的尺寸其实就是hk.•ww∈R hk, 卷积核的权重矩阵.•c ic i=f(w⋅x i:i+h−1+b), 卷积核在单词i位置上的输出. b∈R K, 是bias. f是双曲正切之类的激活函数.•c=[c1,c2,...,c n−h+1]filter在句中单词上进行所有可能的滑动, 得到的feature map.5.Max-Pooling Layermax-pooling只会输出最大值, 对输入中的补0 做过滤.6.SoftMax 分类Layer最后接一层全连接的softmax 层,输出每个类别的概率。

7.小的变种在word representation 处理上会有一些变种.•CNN-rand设计好embedding_size 这个Hyperparameter 后, 对不同单词的向量作随机初始化, 后续BP的时候作调整.•static拿pre-trained vectors from word2vec, FastText or GloVe 直接用, 训练过程中不再调整词向量. 这也算是迁移学习的一种思想.•non-staticpre-trained vectors + fine tuning , 即拿word2vec训练好的词向量初始化, 训练过程中再对它们微调.•multiple channel类比于图像中的RGB通道, 这里也可以用static 与non-static 搭两个通道来搞.一些结果表明,max-pooling 总是优于average-pooling ,理想的filter sizes 是重要的,但具体任务具体考量,而用不用正则化似乎在NLP任务中并没有很大的不同。

8. Text CNN 的tf实现参见[4], [6]. 挺详细的。

图8-1 Text CNN 网络中的卷积与池化结构需要注意的细节有:tf.nn.embedding_lookup() creates the actual embedding operation. The result of the embedding operation is a 3-dimensional tensor of shape [None, sequence_length, embedding_size].TensorFlow’s convolutional conv2d operation expects a 4-dimensional tensor with dimensions corresponding to batch, width, height and channel. The result of our embedding doesn’t contain the channel dimension, so we add it manually, leaving us with a layer of shape [None, sequence_length, embedding_size, 1].9. 与LeNet 作比较# LeNet5conv1_weights = tf.get_variable("weight",[CONV1_SIZE, CONV1_SIZE, NUM_CHANNELS, CONV1_DEEP],initializer=tf.truncated_normal_initializer(stddev=0.1))tf.nn.conv2d(input_tensor,conv1_weights,strides=[1, 1, 1, 1],padding='SAME')tf.nn.max_pool(relu1,ksize = [1,POOL1_SIZE,POOL1_SIZE,1],strides=[1,POOL1_SIZE,POOL1_SIZE,1],padding="SAME")#TextCNNconv1_weights = tf.get_variable("weight",[FILTER_SIZE, EMBEDDING_SIZE, 1, NUM_FILTERS],initializer=tf.truncated_normal_initializer(stddev=0.1))tf.nn.conv2d(self.embedded_chars_expanded,conv1_weights,strides=[1, 1, 1, 1],padding="VALID")tf.nn.max_pool(h,ksize=[1, SEQUENCE_LENGTH - FILTER_SIZE + 1, 1, 1],strides=[1, 1, 1, 1],padding='VALID')先来比较卷积Lenet是正方形的, 且每一层都只用了同一种尺寸的卷积核.Text中, filter是矩形, 长度有好几种, 一般取(2,3,4), 而宽度是定长的, 同word的embedding_size 相同. 每种尺寸都配有NUM_FILTERS 个数目, 类比于Lenet中的output_depth. 所以得到的featuremap是长条状, 宽度为1.因为是卷积, 所以stride每个维度都是1.再说池化层.Lenet的kernel是正方形, 一般也是2*2等, 所以会把卷积后的featurmap尺寸缩小一半. TextCNN依旧是长方形, 将整个featuremap映射到一个点上. 一步到位, 只有一个池化层.全连接层都是多分类, 这一步的处理比较类似. 将池化后的矩阵reshape为二维, 用tf.nn.sparse_softmax_cross_entropy_with_logits() 计算损失.10. TextCNN 论文中的网络结构windows size 分别取(3,4,5), 每个尺寸都会有100个filter.3.1 Hyperparameters and TrainingFor all datasets we use: rectified linear units, filterwindows (h) of 3, 4, 5 with 100 feature maps each,dropout rate (p) of 0.5, l2 constraint (s) of 3, andmini-batch size of 50. These values were chosenvia a grid search on the SST-2 dev set.参考Tensorflow版TextCNN主要代码解析上一篇转载了一些大规模文本分类的方法,其中就有TextCNN,这篇博客就主要解析一下Tensorflow版TextCNN的主要代码。

1.import tensorflow as tf2.import numpy as np3.4.5.class TextCNN(object):6."""7. A CNN for text classification.8. Uses an embedding layer, followed by a convolutional, max-pooling and softmax layer.9. """10.def __init__(11. self, sequence_length, num_classes, vocab_size,12. embedding_size, filter_sizes, num_filters, l2_reg_lambda=0.0):首先导入了tensorflow与numpy包,然后代码主要是建立一个可复用的TextCNN类,类的初始化参数sequence_length:CNN需要固定输入与输出,所以每个句子的输入都是定长*词向量长度,定长一般设为最大句子长度,如果输入的句子词数没到定长就补充零,补充的零对后面的结果没有影响,因为后面的max-pooling只会输出最大值,补零的项会被过滤掉num_classes:输出的文本类别总数也就是文本中有几个类别vocab_size:字典大小,在之前的文本预处理阶段需要对文本进行分词与对单词进行编号,在训练的时候也是输入单词的id然后再词向量化,字典大小用通俗的话来说就是文本中出现了多少个词embedding_size:嵌入长度,指的是词向量长度也就是用一个多大维的向量来表示词语,一般来说根据文本的规模定词向量的维度大小,样本数太少时使用较大维的词向量会造成难以收敛与容易过拟合的问题,有的TextCNN在这里会有一些区别,有的会采用固定的word2vec、fasttext、glove预先训练好的词向量filter_sizes:卷积核大小的List,TextCNN里面的卷积和大小其实对应了传统NLP的n元语法的概念,这里的卷积核都是filter_size*embedding_size,其实就是filter_size个词作为一个整体来考虑,也可以理解为中文中有的词是一个字有的词是两个字,在不同卷积核的情况下对应数量字数的词会表现出更好的效果num_filters:每个卷积核大小对应的卷积核个数,这里为了偷了一点懒,将不同大小卷积核的数量都设为一个常量l2_reg_lambda:这个就是L2正则的权值,就不多解释了[python]view plain copy1.# Placeholders for input, output and dropout2. self.input_x = tf.placeholder(tf.int32, [None, sequence_length], name="input_x")3. self.input_y = tf.placeholder(tf.float32, [None, num_classes], name="input_y")4. self.dropout_keep_prob = tf.placeholder(tf.float32, name="dropout_keep_prob")5.6.# Keeping track of l2 regularization loss (optional)7. l2_loss = tf.constant(0.0)定义了输入与输出、dropout比例的占位符,设立了一个常量记录L2正则损失,每当出现新的变量时就会用变量的L2正则损失乘上L2正则损失权值加入到这个l2_loss里面来。

相关文档
最新文档