近年来,人工智能在自然语言处理领域取得了巨大的进展,其中一项引人注目的技术是生成模型,如OpenAI的GPT-3.5。这类模型通过学习大量的文本数据,具备了生成高质量文本的能力,引发了一系列关于文本生成真实性的讨论。
本月学习内容包括:
为了激励各位同学完成的学习任务,将学习任务根据难度进行划分,并根据是否完成进行评分难度高中低的任务分别分数为3、2和1。在完成学习后(本次活动,截止8月8),将按照积分顺序进行评选 Top3 的学习者。
打卡地址:https://shimo.im/forms/BGH249688Ac8EdIf/fill
昵称 | T1 | T2 | T3 | T4 | T5 | T6 | T7 | T8 | T9 | T10 | T11 |
---|---|---|---|---|---|---|---|---|---|---|---|
徐乜乜 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
mryxj | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
皮卡丘pikachu | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | |
liuqingmin | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ||||
芒果留了果 | ✅ | ✅ | ✅ | ✅ | ✅ | ||||||
苏照 | ✅ | ✅ | |||||||||
真真夜夜 | ✅ | ✅ | |||||||||
灵泽 | ✅ | ||||||||||
awyys9528 | ✅ | ||||||||||
hygge | ✅ | ||||||||||
Payen | ✅ |
前十名将获得由 “讯飞 x Datawhale” 联合颁发的优秀选手证书。
赛题在讯飞比赛平台上举办,可以在平台上提交结果并获取奖励。赛题设立一、二、三等奖及优秀奖共十名,具体详情如下:
此外在讯飞比赛的基础上,参赛选手可以参与打卡并获取如下奖励:
Top1的学习者将获得以下奖励:
Top2-3的学习者将获得以下奖励:
历史活动打卡链接,可以参考如下格式:
近年来人工智能在自然语言处理领域取得了巨大的进展。其中一项引人注目的技术是生成模型,如OpenAI的GPT-3.5。这类模型通过学习大量的文本数据,具备了生成高质量文本的能力,从而引发了一系列关于文本生成真实性的讨论。
正因为生成模型的迅猛发展,也引发了一个新的挑战,即如何区分人类编写的文本与机器生成的文本。传统上,我们借助语法错误、逻辑不连贯等特征来辨别机器生成的文本,但随着生成模型的不断改进,这些特征变得越来越难以区分。因此,为了解决这一问题,研究人员开始探索使用NLP文本分类技术来区分人类编写的文本和机器生成的文本。
任务名称 | 所需技能 |
---|---|
报名比赛,下载比赛数据集并完成读取 | Pandas |
对数据集字符进行可视化,统计标签和字符分布 | Pandas |
使用 TFIDF 提取文本特征 | Sklearn |
使用 TFIDF 特征 和 线性模型完成训练和预测 | Sklearn |
使用 TFIDF 特征 和 XGBoost 完成训练和预测 | Sklearn、XGBoost |
学会训练 FastText、Word2Vec 词向量 | FastText、gensim |
使用 Word2Vec 词向量,搭建 TextCNN 模型训练预测 | Pytorch、Keras |
使用 Word2Vec 词向量,搭建 BILSTM 模型训练预测 | Pytorch、Keras |
学会 Bert 基础,transformer 库基础使用 | Pytorch、transformer |
使用 Bert 在比赛数据集中完成预训练 | Pytorch、transformer |
使用 Bert 在比赛数据集上完成微调 | Pytorch、transformer |
import pandas as pd
train_data = pd.read_csv('./ChatGPT生成文本检测器公开数据-更新/train.csv')
test_data = pd.read_csv('./ChatGPT生成文本检测器公开数据-更新/test.csv')
数据集可能以压缩文件的形式提供,因此你可能需要解压缩文件。上述代码假设数据集文件夹的路径为'./ChatGPT生成文本检测器公开数据-更新/',并且数据集文件名分别为'train.csv'和'test.csv'。根据实际情况,你可能需要调整文件路径和文件名。通过完成以上步骤,你将能够获取比赛数据集并加载到Pandas数据结构中,从而为后续的文本分类任务做好准备。
根据提供的数据集示例,数据集包含三列:name、label和content。下面是对每一列的解释:
name | label | content |
---|---|---|
1 | 0 | [4509 3181 1253 2278 290 3562 2051 599 3125 4790 1504 5219 4390 4544 ... |
2 | 1 | [ 263 1325 2563 4160 2196 169 3125 2563 2619 2091 4799 3609 3230 5212 ... |
# 对输入的内容进行处理
train_data['content'] = train_data['content'].apply(lambda x: x[1:-1].strip().replace('\n', ' \n '))
test_data['content'] = test_data['content'].apply(lambda x: x[1:-1].strip().replace('\n', ' \n '))
train_data['content'] = train_data['content'].apply(lambda x: x.split(' '))
test_data['content'] = test_data['content'].apply(lambda x: x.split(' '))
# 统计字符出现的频次并输出前10个最常见的字符
from collections import Counter
c = Counter()
for content in train_data['content']:
c.update(content)
c.most_common(10)
TfidfVectorizer
类,设置相应的参数(如ngram_range
、max_features
等)来构建TFIDF特征提取器。TfidfVectorizer
的fit_transform()
方法,对文本数据集进行特征提取,得到TFIDF特征矩阵。TfidfVectorizer
是scikit-learn库中的一个文本特征提取工具,用于将文本数据转换为TF-IDF特征表示。下面是对TfidfVectorizer
函数的功能和常用超参数的介绍:
ngram_range
:特征中要包含的n元语法范围,默认为(1, 1),表示只提取单个词。max_df
:单词的最大文档频率,超过该频率的单词将被忽略,默认为1.0,表示不忽略任何单词。min_df
:单词的最小文档频率,低于该频率的单词将被忽略,默认为1,表示不忽略任何单词。from sklearn.feature_extraction.text import TfidfVectorizer
tfidf = TfidfVectorizer()
tfidf.fit(train_data['content'].apply(lambda x: ' '.join(x)))
train_tfidf_feat = tfidf.transform(train_data['content'].apply(lambda x: ' '.join(x)))
test_tfidf_feat = tfidf.transform(train_data['content'].apply(lambda x: ' '.join(x)))
tfidf = TfidfVectorizer(ngram_range=(1,2), max_features=5000)
tfidf.fit(train_data['content'].apply(lambda x: ' '.join(x)))
train_tfidf_feat = tfidf.transform(train_data['content'].apply(lambda x: ' '.join(x)))
test_tfidf_feat = tfidf.transform(test_data['content'].apply(lambda x: ' '.join(x)))
from sklearn.model_selection import cross_val_predict
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report
tfidf = TfidfVectorizer()
tfidf.fit(train_data['content'].apply(lambda x: ' '.join(x)))
train_tfidf_feat = tfidf.transform(train_data['content'].apply(lambda x: ' '.join(x)))
test_tfidf_feat = tfidf.transform(test_data['content'].apply(lambda x: ' '.join(x)))
# 使用cross_val_predict()函数进行交叉验证
val_pred = cross_val_predict(
LogisticRegression(),
train_tfidf_feat,
train_data['label']
)
# 计算并输出分类报告
print(classification_report(train_data['label'], val_pred, digits=3))
precision recall f1-score support
0 0.981 0.999 0.990 11836
1 0.992 0.892 0.940 2164
accuracy 0.982 14000
macro avg 0.986 0.946 0.965 14000
weighted avg 0.982 0.982 0.982 14000
在这个场景中使用交叉验证的目的是为了更准确地评估模型的性能和泛化能力。交叉验证是一种评估机器学习模型的统计方法,通过将数据集划分为多个子集,在不同的训练和验证集上多次训练和评估模型,以得到更可靠的性能指标。
如果你想要提高模型的精度,可以尝试调整TfidfVectorizer
的一些超参数。以下是一些常用的超参数,你可以根据实际情况进行调整:
ngram_range
:n元语法范围。通过将ngram_range
设置为大于1的值,可以考虑多个连续的词作为特征,从而捕捉更多的语义信息。例如,将ngram_range
设置为(1, 2)可以同时考虑单个词和相邻的词作为特征。max_df
和min_df
:单词的最大和最小文档频率。通过调整max_df
和min_df
的值,可以过滤掉在太多或太少文档中出现的单词,从而减少噪声和特异性单词的影响。max_features
:最大特征数。通过限制特征的数量,可以减少特征空间的维度,从而减少模型的复杂性和计算量。stop_words
:停用词列表。通过设置适当的停用词列表,可以去除常见的、对分类任务没有帮助的词语,从而减少噪声。sublinear_tf
:子线性TF缩放。通过将sublinear_tf
设置为True,可以使用子线性缩放来平衡长文本和短文本的特征权重,从而提高模型对不同长度文本的适应性。norm
:特征向量的归一化方式。通过调整norm
参数,可以选择不同的归一化方式,如'l2'、'l1'或'none',以适应不同的数据分布。# 生成测试集结果
m = LogisticRegression()
m.fit(train_tfidf_feat, train_data['label'])
test_pred = m.predict(test_tfidf_feat)
test_data['label'] = test_pred
test_data[['name', 'label']].to_csv('lr.csv', index=None)
from sklearn.model_selection import cross_val_predict
from xgboost import XGBClassifier
from sklearn.metrics import classification_report
tfidf = TfidfVectorizer(ngram_range=(1,3), max_features=10000)
tfidf.fit(train_data['content'].apply(lambda x: ' '.join(x)))
train_tfidf_feat = tfidf.transform(train_data['content'].apply(lambda x: ' '.join(x)))
test_tfidf_feat = tfidf.transform(test_data['content'].apply(lambda x: ' '.join(x)))
val_pred = cross_val_predict(
XGBClassifier(n_estimators=50),
train_tfidf_feat,
train_data['label']
)
print(classification_report(train_data['label'], val_pred, digits=3))
m = XGBClassifier(n_estimators=50)
m.fit(train_tfidf_feat, train_data['label'])
test_pred = m.predict(test_tfidf_feat)
test_data['label'] = test_pred
test_data[['name', 'label']].to_csv('xgb.csv', index=None)
from gensim.models import Word2Vec
model = Word2Vec(sentences=[['1', '2', '3'], ['2', '3', '4']], vector_size=100, window=5, min_count=1, workers=4)
model.wv.most_similar('1', topn=10)
model = Word2Vec(sentences=list(train_data['content']), vector_size=100, window=5, min_count=1, workers=4)
通过完成这些任务,你将学习到丰富的文本分类技术和模型训练方法,掌握了使用Pandas、Sklearn、FastText、Word2Vec、Pytorch等工具和库进行文本处理和训练的技能。祝你在学习和实践中取得好成绩!
import glob
import numpy as np
import pandas as pd
from sklearn.linear_model import LogisticRegression
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.model_selection import cross_val_predict
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])
tfidf = TfidfVectorizer(token_pattern=r'\w{1}', max_features=2000)
train_tfidf = tfidf.fit_transform(train_data['content'])
test_tfidf = tfidf.fit_transform(test_data['content'])
m = LogisticRegression()
m.fit(
train_tfidf,
train_data['label']
)
submit = pd.read_csv('sample_submit.csv')
submit = submit.sort_values(by='name')
submit['label'] = m.predict(test_tfidf).astype(int)
submit.to_csv('lr.csv', index=None)
© 2019-2023 coggle.club 版权所有 京ICP备20022947 京公网安备 11030102010643号