目录
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 的优势
- 高效性:TextCNN 的结构相对简单,计算效率高,适合处理大规模文本数据。
- 局部特征提取:通过卷积操作,TextCNN 能够提取文本中的局部特征(类似于 n-gram),从而捕捉到文本中的关键信息。
- 灵活性: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_train 和 y_train:训练数据和标签。
- validation_data:验证数据和标签(如果提供)。
- batch_size 和 epochs:批量大小和训练周期。
- 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)和多种池化方式。
- 使用预处理器对文本数据进行预处理,方便模型输入。