使用深度学习进行中文文本分类

在自然语言处理(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 方法将分词结果转换为数字表示。首先,我们需要安装 jiebagensim 库:

!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> 表示,长度不足的文本在末尾补零,以保证每个文本都具有相同的长度。

扫描二维码关注公众号,回复: 14868354 查看本文章

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. 总结

本文介绍了使用深度学习模型进行中文文本分类的方法。

猜你喜欢

转载自blog.csdn.net/m0_68036862/article/details/130164623