当前位置: 首页 > news >正文

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)和多种池化方式。
    • 使用预处理器对文本数据进行预处理,方便模型输入。

相关文章:

  • 【MySQL系列文章】Linux环境下安装部署MySQL
  • 基于 Java + SSM + JSP 的百货中心供应链管理系统设计与实现
  • 用deepseek学大模型04-机器学习建模过程
  • 排序与算法:选择排序
  • MySQL的基本使用
  • 了解SQL Server不同版本(如Express、Standard、Enterprise)的功能差异和适用场景。
  • LLM论文笔记 12: Teaching Arithmetic to Small Transformers
  • Linux-C/C++《C/7、字符串处理》(字符串输入/输出、C 库中提供的字符串处理函数、正则表达式等)
  • WordPress Ai插件:支持提示词生成文章和chat智能对话
  • 深入解析 Flutter Bloc:从原理到实战
  • python1
  • 零基础入门机器学习 -- 第九章机器学习项目实战
  • 数据结构_前言
  • 【基础架构篇二】《DeepSeek容器化部署:Docker+Kubernetes集群实战》
  • 【DL】浅谈深度学习中的知识蒸馏 | 输出层知识蒸馏
  • Spring中Bean的生命周期
  • React中如何处理高阶组件中的错误
  • WebGPU 命令编码机制解析:GPUCommandEncoder 与 GPURenderPassEncoder 的协作
  • 开源模型应用落地-DeepSeek-R1-Distill-Qwen-7B-LoRA微调-LLaMA-Factory-单机单卡-V100(一)
  • 调用deepseek接口
  • 经济日报:人工智能开启太空经济新格局
  • 英国警方再逮捕一名涉嫌参与首相住宅纵火案嫌疑人
  • 刘强东坐镇京东一线:管理层培训1800人次,最注重用户体验
  • 商务部新闻发言人就出口管制管控名单答记者问
  • 沪喀同心|为新疆青少年提供科普大餐,“小小博物家(喀什版)”启动
  • 被前男友泼汽油致残后,一个女孩经历的双重灼烧