利用卷积神经网络(cnn)实现文本分类.docx





《利用卷积神经网络(cnn)实现文本分类.docx》由会员分享,可在线阅读,更多相关《利用卷积神经网络(cnn)实现文本分类.docx(7页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、利 卷 积 神 经 络 ( cnn) 实 现 本 分 类 卷 积 神 经 络 在 情 感 分 析 中 取 得 了 很 好 的 成 果 , 相 于 之 前 浅 层 的 机 器 学 习 法 如 NB、 SVM效 果 更 好 , 特 别 实 在 数 据 集 较 的 情 况 下 , 并且 CNN不 我 们 动 去 提 取 特 征 , 原 浅 层 ML是 需 要 进 本 特 征 提 取 、 本 特 征 表 、 归 化 、 最 后 进 本 分 类 , 本 特 征 提 取 主 要 可以 分 为 四 步 : ( 1) : 对 全 部 训 练 档 进 分 词 , 由 这 些 词 作 为 向 量 的 维 数 来
2、表 本 ;( 2) : 统 计 每 类 档 中 所 有 出 现 的 词 语 及 其 频 率 , 然 后 过 滤 , 剔 除 停 词 和 单 字 词 ;( 3) : 统 计 每 类 内 出 现 词 语 的 总 词 频 , 并 取 若 个 频 率 更 的 词 汇 作 为 这 类 的 特 征 词 集 ;( 4) : 去 除 每 类 别 中 都出 现 的 词 , 合并 所 有 类 别 的 特 征 词 集 , 形成 总 特 征 词 集 , 最 后 得 到的 特 征 词 集 是 我 们 到的 特 征 集 合, 再 该集 合去 筛选测试集 中 的 特 征 。 本 的 特 征 表 是 利 TF-IDF公式来
3、计 算词 的 权值, 这 也充分 利 的 是 特 征 提 取 时提 取 的 特 征 来 计 算特 征 权值 的 , 归 化 处理需 要 处理的 数 据 , 经 过 处理后 限制在 定范围内 , 经 过 处理后 , 我 们 原 来 的 本 信息已经 抽象成 个 向 量 化 的 样本 集 , 然 后 将样本集 和 训 练 好 的 模板进 相 似度计 算, 若 属于 该类 别 , 则与其 他类 别 的 模板 件进 计 算, 直到分 进 相 应的 类 别 , 这 是 浅 层 ML进 本 分 类的 式 ;CNN进 本 分 类 相 对 简单 些 , 我 结合最 近做的 些 实 验总 结了 下 : 在 利
4、CNN进 本 分 类 的 时候, 先要 将原 始 本 进 预处理, 主 要 还是 分 词 、 去 除 停 词 等, 然 后 对 预处理后 的 本 进 向 量 化 利 word2vec, 我 利 的 时word2vec中 的 skip-gram模型, 将搜狗数 据 集 表 为 了 200维 的 词 向 量 形式;转化 为 词 向 量 后 就可 以 将每 句话转化 为 个 矩阵的 形式, 这 样就跟利 CNN处理图像分 类 很 相 似;说 下 实 验, 我 的 实 验环境:# encoding=utf-from future import unicode_literalsimport tensor
5、flow as tf import numpyas npclass TextCNN(object):使 CNN 于 情 感 分 析 整个 CNN架构包括词 嵌层 , 卷 积 层 ,max-pooling层 和 softmax层def init (self, sequence_length, num_classes,vocab_size,embedding_size, embedding_table, filter_sizes, num_filters, l2_reg_lambda=0.0):# 输, 输出 , dropout的 placeholderself.input_x= tf.place
6、holder(tf.int32, None, sequence_length, name=input_x)self.input_y= tf.placeholder(tf.float32, None, num_classes, name=input_y) self.dropout_keep_prob = tf.placeholder(tf.float32, name=dropout_keep_prob)#eeping track of l2 regularization loss (optional) l2_loss = tf.constant(0.0)# 词 嵌层with tf.device(
7、/cpu:0), tf.name_scope(embedding):W = tf.Variable(embedding_table,name=W)#embedding_table就是 词 向 量 表 , W还有 另 种简单 的 表 达#W=tf.Variable(vocab_size,embedding_size,-1.0,1.0),随机 初始化 这 个 词 向 量 表 ;self.embedded_chars = tf.nn.embedding_lookup(W, self.input_x)#这 个 tf.nn.embedding_lookup()的 作 就是 从词 向 量 表 中 去 找i
8、nput_x所 对 应的 词 向 量 ;self.embedded_chars_expanded = tf.expand_dims(self.embedded_chars, -1)tensorflow1.2、 gpu1050Ti、 Ubuntu16.04、 pycharm、 python2.7#由 于 CNN输 都 是 四 维 , 所 以 在 最 后 维 添 加 个 维 度 , 与 CNN的 输 维 度 对 照 起 来 。 # 成 卷 积 层 和max-pooling层pooled_outputs = for i, filter_size in enumerate(filter_sizes):
9、with tf.name_scope(conv-maxpool-%s % filter_size): # Convolution Layerfilter_shape = filter_size, embedding_size, 1, num_filtersW = tf.Variable(tf.truncated_normal(filter_shape, stddev=0.1), name=W) b = tf.Variable(tf.constant(0.1, shape=num_filters), name=b)conv = tf.nn.conv2d( self.embedded_chars_
10、expanded, W,strides=1, 1, 1, 1, padding=VALID, name=conv)# Applynonlinearity# h = tf.nn.relu(tf.nn.bias_add(conv, b), name=relu) h=tf.nn.relu6(tf.nn.bias_add(conv,b),name=relu)#axpooling over the outputs # pooled = tf.nn.max_pool(#h,#ksize=1, sequence_length - filter_size + 1, 1, 1,#strides=1, 1, 1,
11、 1, #padding=VALID, #name=pool)# pooled_outputs.append(pooled) pooled = tf.nn.avg_pool(h,ksize=1, sequence_length - filter_size + 1, 1, 1,strides=1, 1, 1, 1, padding=VALID, name=pool)pooled_outputs.append(pooled)# 将 max-pooling层 的 各 种 特 征 整 合 在 起 num_filters_total = num_filters * len(filter_sizes)se
12、lf.h_pool = tf.concat(pooled_outputs,3)self.h_pool_flat = tf.reshape(self.h_pool, -1, num_filters_total)# 添 加 全 连 接 层 , 于 分 类with tf.name_scope(full-connection):W_fc1 = tf.Variable(tf.truncated_normal(num_filters_total,500, stddev=0.1) b_fc1 = tf.Variable(tf.constant(0.1,shape=500)self.h_fc1 = tf.nn
13、.relu6(tf.matmul(self.h_pool_flat, W_fc1) + b_fc1)# 添 加 dropout层 于 缓和 过拟化with tf.name_scope(dropout):# self.h_drop = tf.nn.dropout(self.h_pool_flat, self.dropout_keep_prob) self.h_drop = tf.nn.dropout(self.h_fc1, self.dropout_keep_prob)# 产 最 后 的 输 出和 预测with tf.name_scope(output):# W = tf.get_variabl
14、e( #W,#shape=num_filters_total, num_classes,#initializer=tf.contrib.layers.xavier_initializer() W = tf.get_variable(W,shape=500, num_classes, initializer=tf.contrib.layers.xavier_initializer()b = tf.Variable(tf.constant(0.1, shape=num_classes), name=b) l2_loss += tf.nn.l2_loss(W)l2_loss += tf.nn.l2_
15、loss(b)self.scores = tf.nn.xw_plus_b(self.h_drop, W, b, name=scores)self.scores = tf.nn.xw_plus_b(self.h_drop, W, b, name=scores)self.predictions = tf.argmax(self.scores, 1, name=predictions)定 义 模 型 的 损 失 函 数 with tf.name_scope(loss):losses = tf.nn.softmax_cross_entropy_with_logits(logits=self.score
16、s, labels=self.input_y) self.loss = tf.reduce_mean(losses) + l2_reg_lambda * l2_loss定 义 模 型 的 准 确 率 with tf.name_scope(accuracy):correct_predictions = tf.equal(self.predictions, tf.argmax(self.input_y, 1) self.accuracy = tf.reduce_mean(tf.cast(correct_predictions, float), name=accuracy)以 上 时 TextCNN
17、的 模 型 结 构 代 码 , 然 后 开 始 进 train, 并 利summary和checkpoints来记录模 型 和训练时 的 参数 等等, 利折交叉验证来产准 确 率 , 最后 利tensorboard查看accuracy、loss、w、b等等变化图;训练py的 代 码 :/usr/bin/env python encoding=utf-8import tensorflow as tf import numpy as np import osimport time import datetimeimport data_loaderfrom cnn_graph import Text
18、CNN from tensorflow.contrib import learn from sklearn import cross_validation import preprocessingtf.global_variables伴随tensorflow的 summary和checkout=odelyperparameterstf.flags.DEFINE_integer(embedding_dim, 200, Dimensionality of character embedding (default: 128) tf.flags.DEFINE_string(filter_sizes,
19、3,4,5, Comma-separated filter sizes (default: 3,4,5) tf.flags.DEFINE_integer(num_filters, 40, Number of filters per filter size (default: 128) tf.flags.DEFINE_float(dropout_keep_prob, 0.5, Dropout keep probability (default: 0.5) tf.flags.DEFINE_float(l2_reg_lambda, 3.0, L2 regularizaion lambda (defa
20、ult: 0.0)Training parameterstf.flags.DEFINE_integer(batch_size, 50, Batch Size (default: 64) tf.flags.DEFINE_integer(num_epochs, 100, Number of training epochs (default: 200)tf.flags.DEFINE_integer(evaluate_every, 100, Evaluate model on dev set after this many steps (default: 100) tf.flags.DEFINE_in
21、teger(checkpoint_every, 100, Save model after this many steps (default: 100)isc Parameterstf.flags.DEFINE_boolean(allow_soft_placement, True, Allow device soft device placement) tf.flags.DEFINE_boolean(log_device_placement, False, Log placement of ops on devices)w2v件路径tf.flags.DEFINE_string(w2v_path
22、, ./w2v_model/retrain_vectors_100.bin, w2v file) tf.flags.DEFINE_string(file_dir,./data_process/jd,train/test dataSet)FLAGS = tf.flags.FLAGS FLAGS._parse_flags() print(nParameters:)for attr, value in sorted(FLAGS. flags.items(): print(=.format(attr.upper(), value)print()Data Preparatopn=Load dataLoa
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 利用 卷积 神经网络 cnn 实现 文本 分类

限制150内