使用CNN进行文本分类代码实现

本文档介绍了如何使用Keras构建一个CNN文本分类器,参考了wildml的博文并结合Tensorflow的实现。通过四步操作(数据处理、模型构建、训练、预测),实现了类似于scikit-learn的简便使用方式。在训练过程中,使用了data_helpers.py进行数据预处理,模型训练后的测试结果显示,准确率在72.503%到74.03%之间波动。
摘要由CSDN通过智能技术生成

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
  • 6
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
使用CNN模型进行文本分类,需要将文本转换为数字向量,常用的方式是使用词嵌入(Word Embedding),将每个单词映射为一个向量。 以下是一个使用Python实现CNN模型文本分类的示例代码: ```python import numpy as np from keras.datasets import imdb from keras.preprocessing import sequence from keras.models import Sequential from keras.layers import Dense, Dropout, Activation, Embedding, Conv1D, GlobalMaxPooling1D # 设置超参数 max_features = 5000 # 保留最常见的5000个单词 maxlen = 400 # 文本最大长度 batch_size = 32 # 批大小 embedding_dims = 50 # 词嵌入维度 filters = 250 # 卷积核数量 kernel_size = 3 # 卷积核尺寸 hidden_dims = 250 # 隐藏层大小 epochs = 2 # 训练轮数 # 加载数据 (x_train, y_train), (x_test, y_test) = imdb.load_data(num_words=max_features) # 填充序列,确保所有序列长度相同 x_train = sequence.pad_sequences(x_train, maxlen=maxlen) x_test = sequence.pad_sequences(x_test, maxlen=maxlen) # 构建模型 model = Sequential() # 添加嵌入层 model.add(Embedding(max_features, embedding_dims, input_length=maxlen)) # 添加卷积层和最大池化层 model.add(Conv1D(filters, kernel_size, padding='valid', activation='relu', strides=1)) model.add(GlobalMaxPooling1D()) # 添加全连接层和输出层 model.add(Dense(hidden_dims)) model.add(Dropout(0.2)) model.add(Activation('relu')) model.add(Dense(1)) model.add(Activation('sigmoid')) # 编译模型 model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) # 训练模型 model.fit(x_train, y_train, batch_size=batch_size, epochs=epochs, validation_data=(x_test, y_test)) # 评估模型 score, acc = model.evaluate(x_test, y_test, batch_size=batch_size) print('Test score:', score) print('Test accuracy:', acc) ``` 该示例使用了Keras深度学习框架,加载了IMDB电影评论数据集,并将每个评论转换为一个长度为400的向量。然后搭建了一个包含嵌入层、卷积层、全连接层和输出层的CNN模型,并使用二元交叉熵作为损失函数,Adam作为优化器进行训练。最后评估模型的准确率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值