欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 明星 > TexTCNN

TexTCNN

2025/2/21 4:32:48 来源:https://blog.csdn.net/yuange1666/article/details/145702783  浏览:    关键词:TexTCNN

目录

TextCNN 的由来

TextCNN 的应用

1. 文本分类

2. 情感分析

3. 推荐系统

4. 语义匹配

5. 多标签分类

TextCNN 的优势

代码解析

1. __init__: 初始化函数

2. build_model: 搭建模型架构

3. fit: 训练模型

4. evaluate: 评估模型

5. single_predict: 单个文本预测

6.小结


TextCNN 的由来

TextCNN 是一种用于文本分类的卷积神经网络(CNN)模型,由 Yoon Kim 在 2014 年的论文《Convolutional Neural Networks for Sentence Classification》中首次提出。其核心思想是将卷积神经网络(CNN)从图像领域引入到自然语言处理(NLP)领域,利用卷积操作提取文本中的局部特征(类似于 n-gram),从而实现高效的文本分类任务

在提出 TextCNN 之前,CNN 主要应用于图像领域,而 NLP 领域更多使用循环神经网络(RNN)及其变体(如 LSTM)。TextCNN 的出现为 NLP 提供了一种新的视角,证明了 CNN 在处理文本数据时的高效性和有效性

TextCNN 的应用

TextCNN 在自然语言处理领域有广泛的应用,主要包括以下几个方面:

1. 文本分类

TextCNN 最经典的应用是文本分类任务,例如情感分析、新闻分类、垃圾邮件检测等。通过卷积操作提取文本中的关键特征,再通过池化和全连接层进行分类

2. 情感分析

TextCNN 可以用于对文本的情感倾向进行分类,例如判断影评是正面还是负面。通过提取文本中的局部特征,TextCNN 能够捕捉到情感相关的关键词和短语

3. 推荐系统

TextCNN 可以用于推荐系统中的文本处理,例如对用户评论进行分类,从而推荐用户可能感兴趣的内容

4. 语义匹配

TextCNN 可以用于语义匹配任务,例如判断两个句子是否语义相似。通过提取句子的局部特征,TextCNN 能够捕捉到句子中的关键信息

5. 多标签分类

TextCNN 也可以用于多标签分类任务,例如对文本进行多主题分类。通过调整模型的输出层,TextCNN 可以同时预测多个标签

TextCNN 的优势

  1. 高效性:TextCNN 的结构相对简单,计算效率高,适合处理大规模文本数据
  2. 局部特征提取:通过卷积操作,TextCNN 能够提取文本中的局部特征(类似于 n-gram),从而捕捉到文本中的关键信息
  3. 灵活性:TextCNN 支持多种卷积核大小,可以灵活调整模型的参数以适应不同的任务

代码解析

# 步骤 7 定义TextCNN 主类,包括模型构建、训练、测试函数
class TextCNN(object): def __init__(self, config): 
        self.config = config 
        self.preprocessor = Preprocessor(config) 
        self.class_name = {0: '负面', 1: '正面'} def build_model(self): #模型架构搭建
        idx_input = tf.keras.layers.Input((self.config.max_seq_len,)) 
        input_embedding = tf.keras.layers.Embedding(len(self.preprocessor.token2idx), 
        self.config.embedding_dim, 
        input_length=self.config.max_seq_len, 
            mask_zero=True)(idx_input)         convs = []     for kernel_size in [3, 4, 5]: 
            c = tf.keras.layers.Conv1D(128, kernel_size, activation='relu')(input_embedding) 
            c = tf.keras.layers.GlobalMaxPooling1D()(c) 
            convs.append(c)         fea_cnn = tf.keras.layers.Concatenate()(convs)         fea_dense = tf.keras.layers.Dense(128, activation='relu')(fea_cnn) 
        output = tf.keras.layers.Dense(2, activation='softmax')(fea_dense)         model = tf.keras.Model(inputs=idx_input, outputs=output) 
        model.compile(loss='sparse_categorical_crossentropy', 
            optimizer='adam',
            metrics=['accuracy'])         model.summary()         self.model = model def fit(self, x_train, y_train, x_valid=None, y_valid=None, epochs=5, batch_size=128, **kwargs): #训练
        self.build_model() 
        x_train = self.preprocessor.transform(x_train) if x_valid is not None and y_valid is not None: 
            x_valid = self.preprocessor.transform(x_valid)         self.model.fit( 
            x=x_train, 
            y=y_train, 
            validation_data= (x_valid, y_valid) if x_valid is not None and y_valid is not None else None, 
            batch_size=batch_size, 
            epochs=epochs, **kwargs )def evaluate(self, x_test, y_test): #评估
        x_test = self.preprocessor.transform(x_test) 
        y_pred_probs = self.model.predict(x_test) 
        y_pred = np.argmax(y_pred_probs, axis=-1) 
        result = classification_report(y_test, y_pred, target_names=['负面', '正面']) print(result) def single_predict(self, text): #预测
        input_idx = self.preprocessor.transform([text]) 
        predict_prob = self.model.predict(input_idx)[0] 
        predict_label_id = np.argmax(predict_prob) 
        predict_label_name = self.class_name[predict_label_id] 
        predict_label_prob = predict_prob[predict_label_id] return predict_label_name, predict_label_prob

图片引用【深度学习】textCNN论文与原理-CSDN博客

TextCNN 类是一个基于卷积神经网络(Convolutional Neural Network, CNN)的文本分类模型,主要用于对文本数据进行情感分析、主题分类等任务。

1. __init__: 初始化函数

def __init__(self, config): 
    self.config = config 
    self.preprocessor = Preprocessor(config) 
    self.class_name = {0: '负面', 1: '正面'} 

  • 作用
    • 初始化 TextCNN 类的实例。
    • 接收配置参数 config,用于配置模型的超参数。
    • 初始化预处理器 Preprocessor,用于对文本数据进行预处理(如分词、转换为词索引等)。
    • 定义分类结果的标签名称,0 表示“负面”,1 表示“正面”。
  • 关键点
    • config 是模型的配置参数,通常包含最大序列长度 (max_seq_len)、词嵌入维度 (embedding_dim) 等。
    • Preprocessor 是一个外部类,负责对文本数据进行预处理,包括分词、转换为词索引等操作。
2. build_model: 搭建模型架构

def build_model(self): # 模型架构搭建
    idx_input = tf.keras.layers.Input((self.config.max_seq_len,)) 
    input_embedding = tf.keras.layers.Embedding(len(self.preprocessor.token2idx), 
        self.config.embedding_dim, 
        input_length=self.config.max_seq_len, 
        mask_zero=True)(idx_input)     convs = []     for kernel_size in [3, 4, 5]: 
        c = tf.keras.layers.Conv1D(128, kernel_size, activation='relu')(input_embedding) 
        c = tf.keras.layers.GlobalMaxPooling1D()(c) 
        convs.append(c)     fea_cnn = tf.keras.layers.Concatenate()(convs)     fea_dense = tf.keras.layers.Dense(128, activation='relu')(fea_cnn) 
    output = tf.keras.layers.Dense(2, activation='softmax')(fea_dense)     model = tf.keras.Model(inputs=idx_input, outputs=output) 
    model.compile(loss='sparse_categorical_crossentropy', 
        optimizer='adam',
        metrics=['accuracy'])     model.summary()     self.model = model 

  • 作用:搭建 TextCNN 模型的架构。
  • 模型架构
    • 输入层
      • 使用 tf.keras.layers.Input 定义输入层,输入形状为 (max_seq_len,)(最大序列长度)。
      • 输入数据为词索引序列。
    • 嵌入层
      • 使用 tf.keras.layers.Embedding 将词索引转换为词向量。
      • 参数:
        • input_dim=len(self.preprocessor.token2idx):词典大小。
        • output_dim=self.config.embedding_dim:词向量维度。
        • input_length=self.config.max_seq_len:输入序列长度。
        • mask_zero=True:对填充(0)进行掩码处理,避免影响模型训练。
    • 卷积层
      • 使用三种不同大小的卷积核(3、4、5)提取文本特征。
      • 每个卷积层的输出通过 GlobalMaxPooling1D 层进行全局最大池化,保留最重要的特征。
    • 全连接层
      • 将卷积层的输出拼接后,通过一个全连接层(Dense)进行特征融合。
      • 最后使用 softmax 激活函数输出分类概率。
    • 模型编译
      • 使用 sparse_categorical_crossentropy 作为损失函数。
      • 使用 adam 作为优化器。
      • 监控指标为准确率(accuracy)。
3. fit: 训练模型

def fit(self, x_train, y_train, x_valid=None, y_valid=None, epochs=5, batch_size=128, **kwargs): # 训练
    self.build_model() 
    x_train = self.preprocessor.transform(x_train) if x_valid is not None and y_valid is not None: 
        x_valid = self.preprocessor.transform(x_valid)     self.model.fit( 
        x=x_train, 
        y=y_train, 
        validation_data= (x_valid, y_valid) if x_valid is not None and y_valid is not None else None, 
        batch_size=batch_size, 
        epochs=epochs, **kwargs )

  • 作用:对模型进行训练。
  • 流程
    • 数据预处理
      • 将训练数据 x_train 和验证数据 x_valid 转换为词索引序列(使用 self.preprocessor.transform)。
    • 模型训练
      • 调用 self.model.fit 进行模型训练。
      • 参数:
        • x_trainy_train:训练数据和标签。
        • validation_data:验证数据和标签(如果提供)。
        • batch_sizeepochs:批量大小和训练周期。
        • kwargs:传递给 fit 方法的其他参数。
4. evaluate: 评估模型

def evaluate(self, x_test, y_test): # 评估
    x_test = self.preprocessor.transform(x_test) 
    y_pred_probs = self.model.predict(x_test) 
    y_pred = np.argmax(y_pred_probs, axis=-1) 
    result = classification_report(y_test, y_pred, target_names=['负面', '正面']) print(result) 

  • 作用:对模型进行评估。
  • 流程
    • 数据预处理
      • 将测试数据 x_test 转换为词索引序列。
    • 模型预测
      • 使用 self.model.predict 获取预测的概率值。
      • 使用 np.argmax 将概率值转换为预测的标签。
    • 评估报告
      • 使用 classification_report 输出分类报告,包括准确率、召回率、F1 分值等。
5. single_predict: 单个文本预测

def single_predict(self, text): # 预测
    input_idx = self.preprocessor.transform([text]) 
    predict_prob = self.model.predict(input_idx)[0] 
    predict_label_id = np.argmax(predict_prob) 
    predict_label_name = self.class_name[predict_label_id] 
    predict_label_prob = predict_prob[predict_label_id] return predict_label_name, predict_label_prob

  • 作用:对单个文本进行情感预测。
  • 流程
    • 数据预处理
      • 将输入文本 text 转换为词索引序列。
    • 模型预测
      • 使用 self.model.predict 获取预测的概率值。
    • 结果提取
      • 提取预测的概率值、标签索引和标签名称。
    • 返回结果
      • 返回预测的标签名称和对应的概率值。
6.小结
  • TextCNN
    • 通过 build_model 搭建模型架构。
    • 使用 fit 对模型进行训练。
    • 使用 evaluate 对模型进行评估。
    • 使用 single_predict 对单个文本进行预测。
  • 特点
    • 结合了卷积神经网络(CNN)和全局最大池化(GlobalMaxPooling1D)来提取文本特征。
    • 支持多尺度卷积核(3、4、5)和多种池化方式。
    • 使用预处理器对文本数据进行预处理,方便模型输入。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词