1、因为最近学习牛津大学的深度学习nlp课程,练习nlp文本分类,便进行了相应的调研,在课件中进行了全连接神经网络的文本分类,rnn文本分类。作者在之后也上网查看资料,了解到CNN在文本分类中发展很快,于是打算实现一个CNN文本分类的算法,查看资料,主要参考如下博文:http://www.wildml.com/2015/12/implementing-a-cnn-for-text-classification-in-tensorflow/
2、 作者讲的较为清晰且有相应github代码,但是完全tensorflow布置,感觉有很多东西模型使用起来不方便,于是学习keras或者更大受scikit-learn的影响,构造了一个相应的CNN文本分类器,相应的使用方法较为简单,使用时和scikit-learn一样仅仅需要三步(模型实体化,模型训练,模型预测)
相应代码如下(文件名为:TextCNNClassifier.py):
# coding: utf-8
import tensorflow as tf
import numpy as np
import os
class NN_config(object):
def __init__(self, vocab_size, num_filters,filter_steps,num_seqs=1000,num_classes=2, embedding_size=200):
self.vocab_size = vocab_size
self.num_filters = num_filters
self.filter_steps = filter_steps
self.num_seqs = num_seqs
self.num_classes = num_classes
self.embedding_size = embedding_size
class CALC_config(object):
def __init__(self, learning_rate=0.0075, batch_size=64, num_epoches=20, l2_ratio=0.0):
self.learning_rate = learning_rate
self.batch_size = batch_size
self.num_epoches = num_epoches
self.l2_ratio = l2_ratio
class TextCNNClassifier(object):
'''
A class used to define text classifier use convolution network
the form of class like keras or scikit-learn
'''
def __init__(self,config_nn, config_calc):
self.num_seqs = config_nn.num_seqs
self.num_classes = config_nn.num_classes
self.embedding_size = config_nn.embedding_size
self.vocab_size = config_nn.vocab_size
self.num_filters = config_nn.num_filters
self.filter_steps = config_nn.filter_steps
self.learning_rate = config_calc.learning_rate
self.batch_size = config_calc.batch_size
self.num_epoches = config_calc.num_epoches
self.l2_ratio = config_calc.l2_ratio
#tf.reset_default_graph()
self.build_placeholder()
self.build_embedding_layer()
self.build_nn()
self.build_cost()
self.build_optimizer()
self.saver = tf.train.Saver()
def build_placeholder(self):
with tf.name_scope('inputs_to_data'):
self.inputs = tf.placeholder( tf.int32,shape=[None, self.num_seqs],name='inputs')
self.targets = tf.placeholder(tf.float32,shape=[None, self.num_classes], name='targets')
self.keep_prob = tf.placeholder(tf.float32, name='nn_keep_prob')
print('self.inputs.shape:',self.inputs.shape)
def build_embedding_layer(self):
with tf.device('/cpu:0'),tf.name_scope('embeddings'):
embeddings = tf.Variable(tf.truncated_normal(shape=[self.vocab_size,self.embedding_size],stddev=0.1),\
name = 'embeddings')
x = tf.nn.embedding_lookup(embeddings, self.inputs)
x = tf.expand_dims(x, axis=-1)
self.x = tf.cast(x, tf.float32 )
print('x shape is:',self.x.get_shape())
def build_nn(self):
conv_out = []
for i , filter_step in enumerate(self.filter_steps):
with tf.name_scope("conv-network-%s"%filter_step):
filter_shape = [filter_step,self.embedding_size, 1,self.num_filters]
filters = tf.Variable(tf.truncated_normal(s