赛题地址: ChatGPT生成文本检测器
数据集结构如下:
1 文本统计特征方法个人解读
1.1 导入模块
导入代码所需的模块
import glob
import numpy as np
import pandas as pd
from sklearn.linear_model import LogisticRegression
- sklearn是机器学习中一个常用的python第三方模块,对常用的机器学习算法进行了封装 其中包括:
1.分类(Classification)
2.回归(Regression)
3.聚类(Clustering)
4.数据降维(Dimensionality reduction)
5.常用模型(Model selection)
6.数据预处理(Preprocessing) - Python中机器学习神器——sklearn模块_Fo*(Bi)的博客-CSDN博客说的很详细。
1.2 数据收集与准备
在赛题主页下载数据,读取数据集。
train_data = pd.read_csv('./ChatGPT生成文本检测器公开数据-更新/train.csv')
test_data = pd.read_csv('./ChatGPT生成文本检测器公开数据-更新/test.csv')
train_data['content'] = train_data['content'].apply(lambda x: x[1:-1])
test_data['content'] = test_data['content'].apply(lambda x: x[1:-1])
apply()
:这是一个pandas DataFrame的方法,用于对DataFrame的每一行或每一列应用一个函数。在这里,它被用来对’content’列的每一个元素应用一个lambda函数。lambda x: x[1:-1]
:这是一个匿名函数,也被称为lambda函数。它接受一个参数x(在这个例子中,x是’content’列的一个元素),并返回一个新的字符串,这个新的字符串是原字符串去掉首尾字符后的结果。
1.3 特征提取
构建如下常见的文本统计特征
def simple_feature(s):
if len(s) == 0:
s = '123 123'
w = s.split()
# 统计字符出现次数
w_count = np.bincount(w)
w_count = w_count[w_count != 0]
return np.array([
len(s), # 原始字符长度
len(w), # 字符个数
len(set(w)), # 不重复字符个数
len(w) - len(set(w)), # 字符个数 - 不重复字符个数
len(set(w)) / (len(w) + 1), # 不重复字符个数占比
np.max(w_count), # 字符的频率的最大值
np.min(w_count), # 字符的频率的最小值
np.mean(w_count), # 字符的频率的平均值
np.std(w_count), # 字符的频率的方差
np.ptp(w_count), # 字符的频率的极差
])
train_feature = train_data['content'].iloc[:].apply(simple_feature)
test_feature = test_data['content'].iloc[:].apply(simple_feature)
train_feature = np.vstack(train_feature.values)
test_feature = np.vstack(test_feature.values)
- 如果输入的字符串
s
长度为0,那么会将变量s
重新赋值为字符串'123 123'
。这是为了避免在后续操作中出现空字符串的情况,因为空字符串进行分割操作时会返回一个只包含一个空字符串的列表,可能会导致后续计算错误或不符合预期的结果。所以,这里的赋值操作并不是为了给字符串s
赋予特定的含义,而是为了确保在后续处理中不会出现空字符串的情况. train_feature = train_data['content'].iloc[:].apply(simple_feature)
对train_data
里的每一行每一列的内容应用simple_feature
函数,即提取特征。np.vstack()
函数用于将多个数组垂直堆叠成一个新的数组。它接受一个或多个数组作为参数,并按照垂直方向依次将它们堆叠在一起。
1.4 模型训练、评估与优化
采取逻辑回归算法,训练模型
#模型训练
m = LogisticRegression()
m.fit(train_feature, train_data['label'])
m = LogisticRegression()
构建逻辑回归模型m.fit(train_feature, train_data['label'])
训练,传入data即特征train_feature
,target即train_data['label']
列。
1.3 结果输出
生成测试集提交结果,输出submit.csv。
# 生成测试集提交结果
test_data['label'] = m.predict(test_feature)
test_data[['name', 'label']].to_csv('simple.csv', index=None)
m.predict(test_feature)
,LogisticRegression()类的predit方法,返回分类结果。
2 个人总结
- 第一次接触这种NLP问题,主要学到了提取的特征的几个类别。
len(s), # 原始字符长度
len(w), # 字符个数
len(set(w)), # 不重复字符个数
len(w) - len(set(w)), # 字符个数 - 不重复字符个数
len(set(w)) / (len(w) + 1), # 不重复字符个数占比
np.max(w_count), # 字符的频率的最大值
np.min(w_count), # 字符的频率的最小值
np.mean(w_count), # 字符的频率的平均值
np.std(w_count), # 字符的频率的方差
np.ptp(w_count), # 字符的频率的极差
- 还有一些数据类型的转换,例如数组的堆叠,让数据适配模型参数的结构。
- 接触了lambda,由于之前没有专门取了解它,接触的也不多,但是确实很方便。细说Python的lambda函数用法,建议收藏 - 知乎 (zhihu.com)