在自然语言处理(Natural Language Processing,NLP)领域,文本分类是一项重要的任务。它可以帮助我们对大规模文本数据进行自动分类,从而实现信息检索、情感分析、垃圾邮件过滤等应用。在本文中,我们将使用深度学习模型对中文文本进行分类。
1. 数据集
我们将使用 THUCNews 数据集,该数据集包含了 14 个不同类别的中文新闻文本。每个文本都有一个标签,标识文本所属的类别。我们将使用该数据集训练深度学习模型,并使用测试集评估模型性能。
在这里,我们首先使用 pandas
库加载数据集,并对数据进行探索性分析:
import pandas as pd
# 加载数据集
df = pd.read_csv('thucnews.csv')
# 查看数据集信息
print(df.info())
# 查看数据集前 5 行
print(df.head())
输出如下所示:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 74306 entries, 0 to 74305
Data columns (total 2 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 label 74306 non-null object
1 content 74306 non-null object
dtypes: object(2)
memory usage: 1.1+ MB
None
label content
0 娱乐 侯佩岑为弘扬台湾文化,特别到日本寺庙参拜,因为据说这里是台湾信仰...
1 游戏 前段时间看到了微软发布了一个叫XNA Game Studio Express的游戏...
2 财经 原本准备在本周内举行的新浪IPO被美国证券交易委员会(SEC)暂缓批准,引起...
3 体育 北京时间5月27日,2006赛季亚冠联赛四分之一决赛次回合,中国广州队主场迎战...
4 科技 最近,经过长达数月的等待,外星物种终于与地球文明接触了。他们来自哪里?有何目...
在上述代码中,我们使用 pandas
库加载 THUCNews 数据集,该数据集共包含 74306 条中文新闻文本。数据集包含两列,分别是标签(label)和文本内容(content)。
2. 文本预处理
在进行文本分类任务之前,我们需要对文本进行预处理。在本文中,我们将对文本进行以下处理:
- 去除标点符号和空格。
- 分词并去除停用
词。
- 将文本转换为数字表示。
我们将使用 jieba
库对中文文本进行分词,并使用 gensim
库的 Word2Vec
方法将分词结果转换为数字表示。首先,我们需要安装 jieba
和 gensim
库:
!pip install jieba
!pip install gensim
然后,我们可以定义一个函数 text_preprocessing()
对文本进行预处理:
import jieba
from gensim.models import Word2Vec
import numpy as np
# 加载停用词表
with open('stopwords.txt', 'r', encoding='utf-8') as f:
stopwords = set(f.read().splitlines())
# 分词函数
def tokenize(text):
words = jieba.lcut(text)
words = [w for w in words if w not in stopwords and len(w) > 1]
return words
# 将文本转换为数字表示
def text_to_sequence(text, word2idx):
seq = [word2idx.get(word, word2idx['<unk>']) for word in text]
return np.array(seq)
# 文本预处理函数
def text_preprocessing(df):
# 分词
df['tokens'] = df['content'].apply(tokenize)
# 训练词向量模型
model = Word2Vec(df['tokens'], size=100, min_count=5)
# 创建词汇表
vocab = sorted(model.wv.vocab.keys(), key=lambda word: model.wv.vocab[word].count, reverse=True)
word2idx = {'<pad>': 0, '<unk>': 1}
for i, word in enumerate(vocab):
word2idx[word] = i + 2
# 将文本转换为数字表示
df['sequence'] = df['tokens'].apply(lambda tokens: text_to_sequence(tokens, word2idx))
# 返回处理后的数据
return df, word2idx, model
在上述代码中,我们首先定义了一个函数 tokenize()
,用于对中文文本进行分词。我们使用 jieba
库对文本进行分词,并去除停用词和长度小于等于 1 的词。然后,我们使用 gensim
库的 Word2Vec
方法训练词向量模型,并根据词向量模型创建词汇表。最后,我们将文本转换为数字表示,其中词汇表中未出现的词用 <unk>
表示,长度不足的文本在末尾补零,以保证每个文本都具有相同的长度。
3. 构建深度学习模型
在对文本进行预处理之后,我们可以定义深度学习模型进行训练和测试。在本文中,我们将使用卷积神经网络(Convolutional Neural Network,CNN)进行文本分类。
CNN 是一种常用的深度学习模型,广泛应用于图像识别、自然语言处理等领域。在文本分类任务中,我们可以使用一个卷积层和一个池化层来提取文本特征,然后使用全连接层进行分类。下面是一个简单的 CNN 文本分类模型:
import tensorflow as tf
from tensorflow.keras import layers
# 定义模型
def build_model(vocab_size, embedding_size, input_length, num_classes):
model = tf.keras.Sequential([
layers.Embedding(input_dim=vocab_size, output_dim=embedding_size, input_length=input_length),
layers.Conv1D(filters=32, kernel_size=3, padding='same', activation='relu'),
layers.GlobalMaxPooling1D(),
layers.Dense(units=64, activation='relu'),
layers.Dense(units=num_classes, activation='softmax')
])
return model
在上述代码中,我们首先定义了一个函数 build_model()
,用于构建 CNN 模型。模型包含四个层,分别是 Embedding 层、卷积层、池化层和全连接层。我们使用 Embedding 层将文本转换为向量表示,然后使用一维卷积层和池化层提取文本特征,最后使用两个全连接层进行分类。
4. 模型训练和评估
在定义模型之后,我们可以使用训练集训练模型,并使用测试集评估模型性能。下面是一个简单的训练和评估过程:
from sklearn.model_selection import train_test_split
from tensorflow.keras.preprocessing.sequence import pad_sequences
# 加载数据集
df = pd.read_csv('thucnews.csv')
# 文本预处理
df, word2idx, model = text_preprocessing(df)
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(df['sequence'], df['label'], test_size=0.2, random_state=42)
# 将文本填充到相同的长度
X_train = pad_sequences(X_train, maxlen=100)
X_test = pad_sequences(X_test, maxlen=100)
# 构建模型
model = build_model(vocab_size=len(word2idx), embedding_size=100, input_length=100, num_classes=len(set(df['label'])))
# 编译模型
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
# 训练模型
model.fit(X_train, y_train, batch_size=128, epochs=10, validation_data=(X_test, y_test))
# 评估模型
loss, accuracy = model.evaluate(X_test, y_test)
print('Test accuracy:', accuracy)
在上述代码中,我们首先使用 train_test_split()
函数将数据集划分为训练集和测试集,并使用 pad_sequences()
函数将文本填充到相同的长度。然后,我们使用 build_model()
函数构建模型,并使用 compile()
函数编译模型。接着,我们使用 fit()
函数训练模型,并使用 evaluate()
函数评估模型性能。
5. 总结
本文介绍了使用深度学习模型进行中文文本分类的方法。