使用Keras进行文本分类:Tokenizer与模型构建实践
概述
本文将通过一个实际案例,介绍如何使用Keras构建文本分类模型。我们将从Hacker News标题数据集中提取文本特征,并使用不同的神经网络架构进行分类任务。这个项目展示了从数据准备到模型构建的完整流程,特别适合想要学习文本分类实践的开发者。
数据准备
从BigQuery获取数据
我们首先从BigQuery公共数据集中获取Hacker News的标题数据。通过SQL查询,我们可以筛选出符合条件的数据:
SELECT
LOWER(REGEXP_REPLACE(title, '[^a-zA-Z0-9 $.-]', ' ')) AS title,
ARRAY_REVERSE(SPLIT(REGEXP_EXTRACT(url, '.*://(.[^/]+)/'), '.'))[SAFE_OFFSET(1)] AS source
FROM
`bigquery-public-data.hacker_news.full`
WHERE
REGEXP_CONTAINS(REGEXP_EXTRACT(url, '.*://(.[^/]+)/'), '.com$')
AND LENGTH(title) > 10
AND (source = 'github' OR source = 'nytimes' OR source = 'techcrunch')
这个查询做了以下几件事:
- 从URL中提取源网站信息(github、nytimes或techcrunch)
- 清理标题文本,移除特殊字符
- 筛选长度大于10个字符的标题
- 只保留来自三个目标网站的标题
数据预处理
获取数据后,我们需要进行以下预处理步骤:
- 数据均衡:确保每个类别(github、nytimes、techcrunch)的样本数量大致相同
- 数据分割:将数据分为训练集和测试集
- 数据保存:将处理后的数据保存为CSV文件
# 保存完整数据集
title_dataset.to_csv(FULL_DATASET_PATH, header=False, index=False, encoding="utf-8")
# 创建并保存样本数据集
sample_title_dataset = title_dataset.sample(n=1000)
sample_title_dataset.to_csv(SAMPLE_DATASET_PATH, header=False, index=False, encoding="utf-8")
文本序列化与编码
使用Tokenizer处理文本
Keras的Tokenizer类可以将文本转换为数值序列,这是神经网络处理文本数据的关键步骤:
tokenizer = Tokenizer()
tokenizer.fit_on_texts(titles_df.title)
# 将文本转换为整数序列
integerized_titles = tokenizer.texts_to_sequences(titles_df.title)
关键指标计算:
VOCAB_SIZE:词汇表大小(唯一单词数量)DATASET_SIZE:数据集大小(标题数量)MAX_LEN:最长标题的长度(单词数量)
序列填充
由于神经网络需要固定长度的输入,我们需要将所有序列填充到相同长度:
def create_sequences(texts, max_len=MAX_LEN):
sequences = tokenizer.texts_to_sequences(texts)
padded_sequences = pad_sequences(sequences, maxlen=max_len, padding='post')
return padded_sequences
标签编码
文本分类标签需要转换为数值形式。我们使用one-hot编码将类别标签转换为向量:
CLASSES = {"github": 0, "nytimes": 1, "techcrunch": 2}
def encode_labels(sources):
classes = [CLASSES[source] for source in sources]
one_hots = to_categorical(classes, num_classes=len(CLASSES))
return one_hots
模型构建
嵌入层(Embedding Layer)
文本分类模型通常以嵌入层开始,它将整数标记转换为密集向量:
model = Sequential()
model.add(Embedding(input_dim=VOCAB_SIZE+1, output_dim=EMBEDDING_DIM))
三种模型架构
我们将探索三种不同的模型架构:
-
DNN模型(词袋模型):
- 平均词向量,忽略词序
- 适合作为基线模型
-
RNN模型:
- 使用GRU层捕捉序列信息
- 适合处理顺序重要的文本
-
CNN模型:
- 使用1D卷积层捕捉局部特征
- 能识别有意义的n-gram模式
模型训练
训练过程中,我们可以使用以下回调函数:
EarlyStopping:在验证损失不再改善时停止训练TensorBoard:可视化训练过程
callbacks = [
EarlyStopping(monitor='val_loss', patience=2),
TensorBoard(LOGDIR)
]
model.fit(
X_train, y_train,
epochs=EPOCHS,
batch_size=BATCH_SIZE,
validation_split=0.1,
callbacks=callbacks
)
关键学习点
- 文本预处理:理解如何从原始文本数据创建适合神经网络处理的数值表示
- 序列处理:掌握文本序列的填充和截断技术
- 嵌入层:学习如何使用嵌入层将离散标记映射到连续向量空间
- 模型架构比较:体验不同神经网络架构在文本分类任务上的表现差异
- 实践技巧:掌握使用回调函数优化训练过程的方法
总结
本文详细介绍了使用Keras进行文本分类的完整流程,从数据获取、预处理到模型构建。通过这个项目,开发者可以掌握处理文本数据的关键技术,并了解不同神经网络架构在文本分类任务中的应用。这些技能可以扩展到更复杂的自然语言处理任务中。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



