文本分类比赛学习记录
· 阅读需 6 分钟
前言
本文是我对在公司参加的“ChatGPT 生成文本检测器”比赛。数据集为中文作文样本,其中从互联网上采集得到了真实作文,并且 ChatGLM-6B 生成了部分作文。参赛选手的任务是根据文本内容,区分作文的来源。但是,文本不是以内容呈现,而是一堆数字字符串,形如:[0 43 2 66]。可以推测出,每个数字代表一个汉字在语料库中的索引。
文本分类任务的四步:
- 准备数据集:包括加载数据集和执行基本预处理, 然后把数据集分为训练集和验证集。
- 特征工程:将原始数据集被转换为用于训练机器学习模型的平坦特征(flat features)。
- 模型训练
- 进一步提高分类器性能
下面按照前面三步(省略第四步)介绍我的做法。
准备数据集
这一步的主要工作是读取原始文件,并划分训练集和验证集,用到的库 pandas 和 sklearn。
import pandas as pd
from sklearn import model_selection, preprocessing, naive_bayes, metrics, linear_model
from sklearn.feature_extraction.text import TfidfVectorizer, CountVectorizer
df = pd.read_csv('train.csv')
# print(df['content'])
#将数据集分为训练集和验证集
train_x, valid_x, train_y, valid_y = model_selection.train_test_split(df['content'], df['label'])
# label编码为目标变量
encoder = preprocessing.LabelEncoder()
train_y = encoder.fit_transform(train_y)
valid_y = encoder.fit_transform(valid_y)
特征工程
计数向量是数据集的矩阵表示,其中每行代表来自语料库的文档,每列表示来自语料库的术语,并且每个单元格表示特定文档中特定术语的频率计数:
#创建一个向量计数器对象
count_vect = CountVectorizer(analyzer='word', token_pattern=r'\w{1,}')
count_vect.fit(df['content'])
#使用向量计数器对象转换训练集和验证集
xtrain_count = count_vect.transform(train_x)
xvalid_count = count_vect.transform(valid_x)