《NLP直播课打卡》第二天:千言文本相似度比赛全流程
《NLP直播课打卡》第二天:文本相似度计算比赛简易实践baseline方案 —— 基于实践项目简易改建和增加部分数据分布分析
·
打卡内容说明
基于NLP直播课实践内容略改训练过程,简化训练的使用
-
使用paddlenlp进行预训练模型网络开发
-
内含数据读取与处理方法(未清洗样本数据)
-
内含数据分布的简要展示
-
网络搭建与训练
-
预测与提交结果生成
相关方法都放在了以下文件中
-
dataset.py
-
utils.py
# 下载paddlenlp
!pip install --upgrade paddlenlp==2.0.2 -i https://pypi.org/simple
# 更新可视化支持
!pip install --upgrade visualdl
# 解压数据集
!unzip -o data/data52714/lcqmc.zip -d work/lcqmc
!unzip -o data/data52714/paws-x-zh.zip -d work/paws
!unzip -o data/data52714/bq_corpus.zip -d work/corpus
一、数据分析
import pandas as pd
import numpy as np
import os
import time
from tqdm import tqdm
# 数据集路径
DataSet_Path = {
'lcqmc':
{'train':'work/lcqmc/lcqmc/train.tsv',
'dev':'work/lcqmc/lcqmc/dev.tsv',
'test':'work/lcqmc/lcqmc/test.tsv'},
'paws':
{'train':'work/paws/paws-x-zh/train.tsv',
'dev':'work/paws/paws-x-zh/dev.tsv',
'test':'work/paws/paws-x-zh/test.tsv'},
'corpus':
{'train':'work/corpus/bq_corpus/train.tsv',
'dev':'work/corpus/bq_corpus/dev.tsv',
'test':'work/corpus/bq_corpus/test.tsv'}
}
# 数据格式
Train_Data_Style = ['query', 'title', 'label']
Dev_Data_Style = ['query', 'title', 'label']
Test_Data_Style = ['query', 'title']
查看lcqmc的数据
lcqmc_train_df = pd.read_csv(DataSet_Path['lcqmc']['train'], header=None, sep='\t')
lcqmc_train_df.columns = Train_Data_Style # 将header设置为数据格式,方便阅读
print('Train_Data: ', len(lcqmc_train_df))
lcqmc_train_df.head() # max:131 mean: 11
# 测最长字段 以及 平均长度
max_len = 0
LENS = {}
for j in range(2):
index = 0
for i in lcqmc_train_df.iloc[:, j]:
if len(i) in list(LENS.keys()):
LENS[len(i)] += 1
else:
LENS[len(i)] = 1
if max_len < len(i):
max_len = len(i)
print(index)
print(i, ' - ', max_len)
index += 1
# print(np.mean(LENS))
import seaborn
from matplotlib import pyplot as plt
plt.figure(figsize=(12, 8))
seaborn.barplot(list(LENS.keys()), list(LENS.values()))
plt.show()
Train_Data: 238766
0
喜欢打篮球的男生喜欢什么样的女生 - 16
4
晚上睡觉带着耳机听音乐有什么害处吗? - 18
30
月初和月末是会出现这个延迟的情况的,小二建议您耐心等待一下 - 29
267
您好,目前支付宝只是您的这个第三方的付款的平台是不销售任何的产品的 - 33
644
您的那个账户是否还有其他的信息,比如绑定的手机号码,淘宝账户,银行卡等? - 36
4016
您客气了(*^__^*),您对我服务的满意就是我最大的动力(*^▽^*)。 - 37
27607
(*^__^*),您对我服务的满意就是我最大的动力(*^▽^*)。请问还有其他我可以为您服务的吗? - 49
89596
---------------------------便笺---------------------------创建了太多便笺。请删除部分便签后继续。---------------------------确定--------------------------- - 131
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/matplotlib/__init__.py:107: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated, and in 3.8 it will stop working
from collections import MutableMapping
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/matplotlib/rcsetup.py:20: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated, and in 3.8 it will stop working
from collections import Iterable, Mapping
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/matplotlib/colors.py:53: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated, and in 3.8 it will stop working
from collections import Sized
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/matplotlib/cbook/__init__.py:2349: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated, and in 3.8 it will stop working
if isinstance(obj, collections.Iterator):
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/matplotlib/cbook/__init__.py:2366: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated, and in 3.8 it will stop working
return list(data) if isinstance(data, collections.MappingView) else data
<Figure size 1200x800 with 1 Axes>
lcqmc_dev_df = pd.read_table(DataSet_Path['lcqmc']['dev'], header=None)
lcqmc_dev_df.columns = Dev_Data_Style # 将header设置为数据格式,方便阅读
print('Dev_Data: ', len(lcqmc_dev_df))
lcqmc_dev_df.head() # max:36 mean: 13
# 测最长字段 以及 平均长度
max_len = 0
LENS = {}
for j in range(2):
index = 0
for i in lcqmc_dev_df.iloc[:, j]:
if len(i) in list(LENS.keys()):
LENS[len(i)] += 1
else:
LENS[len(i)] = 1
if max_len < len(i):
max_len = len(i)
print(index)
print(i, ' - ', max_len)
index += 1
# print(np.mean(LENS))
import seaborn
from matplotlib import pyplot as plt
plt.figure(figsize=(12, 8))
seaborn.barplot(list(LENS.keys()), list(LENS.values()))
plt.show()
Dev_Data: 8802
0
开初婚未育证明怎么弄? - 11
4
这种图片是用什么软件制作的? - 14
7
校花的贴身高手打给什么时候完结 - 15
10
哭求《魔术脑》中文版电子书谢谢你们了 - 18
11
马上情人节了,大家都怎么安排情人节的行程啊 - 21
90
哲学的物质范畴和自然科学的物质范畴是什么关系 - 22
152
这个手机号的是一个支付宝账户,这个邮箱的是一个支付宝账户的。 - 30
417
您联系对方进行查询邮箱支付宝账户的收支明细核实资金的到账情况,辛苦您了。 - 36
lcqmc_test_df = pd.read_table(DataSet_Path['lcqmc']['test'], header=None)
lcqmc_test_df.columns = Test_Data_Style
print('Test_Data: ', len(lcqmc_test_df))
lcqmc_test_df.head() # max: 27 mean: 10
# 测最长字段 以及 平均长度
max_len = 0
LENS = {}
for j in range(2):
index = 0
for i in lcqmc_test_df.iloc[:, j]:
if len(i) in list(LENS.keys()):
LENS[len(i)] += 1
else:
LENS[len(i)] = 1
if max_len < len(i):
max_len = len(i)
print(index)
print(i, ' - ', max_len)
index += 1
# print(np.mean(LENS))
import seaborn
from matplotlib import pyplot as plt
plt.figure(figsize=(12, 8))
seaborn.barplot(list(LENS.keys()), list(LENS.values()))
plt.show()
Test_Data: 12500
0
谁有狂三这张高清的 - 9
1
英雄联盟什么英雄最好 - 10
2
这是什么意思,被蹭网吗 - 11
3
现在有什么动画片好看呢? - 12
4
请问晶达电子厂现在的工资待遇怎么样要求有哪些 - 22
323
手机游戏天龙八部3d好玩吗,和电脑上的有什么不同 - 24
8592
有没有可以监控微信聊天记录的软件,如何>窃听别人微信 - 26
11018
老公你是我最深爱的人,却觉得相见恨晚这句话用英文怎么说 - 27
查看paws的数据
paws_train_df = pd.read_table(DataSet_Path['paws']['train'], header=None)
paws_train_df.columns = Train_Data_Style # 将header设置为数据格式,方便阅读
paws_train_df['query'] = paws_train_df['query'].astype('str')
paws_train_df['title'] = paws_train_df['title'].astype('str')
print('Train_Data: ', len(paws_train_df))
paws_train_df.head() # max: 149, mean = 45
# 测最长字段 以及 平均长度
max_len = 0
LENS = {}
for j in range(2):
index = 0
for i in paws_train_df.iloc[:, j]:
if len(i) in list(LENS.keys()):
LENS[len(i)] += 1
else:
LENS[len(i)] = 1
if max_len < len(i):
max_len = len(i)
print(index)
print(i, ' - ', max_len)
index += 1
# print(np.mean(LENS))
import seaborn
from matplotlib import pyplot as plt
plt.figure(figsize=(26, 24))
seaborn.barplot(list(LENS.keys()), list(LENS.values()))
plt.show()
Train_Data: 49401
0
1560年10月,他在巴黎秘密会见了英国大使Nicolas Throckmorton,要求他通过苏格兰返回英国。 - 56
10
Kabir Suman在1992年至1999年期间以Suman Chattopaddhyay或Suman Chatterjee的名义录制了几张专辑。 - 74
23
Kevin Spacey(Henry Drummond)和David Troughton(Matthew Harrison Brady)出演了2009年伦敦老维克的复兴。 - 85
35
除了Michael Boddicker和Patrick Moraz之外,这张专辑还包括Diana Hubbard,John Goodsall,Chick Corea和Stanley Clarke的音乐贡献。 - 103
118
他此前曾效力过Wolverhampton Wanderers,Kidderminster Harriers,Mansfield Town,Lincoln City,Northampton Town,Chesterfield和Gateshead。 - 122
1954
Samuel J. Tilden House酒店位于格拉梅西公园(Gramercy Park)的南侧,面向公园,横跨欧文广场(Gravingcy Park South)和格拉梅西公园西(Gramercy Park West)之间的格拉梅西公园南部。 - 124
9589
1871年,布斯与历史学家托马斯·巴宾顿·麦考利(Thomas Babington Macaulay)的侄女比阿特丽斯·韦伯(Beatrice Webb)结婚,并成为法比安(Fabian)的堂兄 - 社会主义者和作家玛丽·麦考利(Mary Macaulay)。 - 130
10490
金斯维尔(Kingsville)毗邻经过翻新的杰里科农场博物馆(Jericho Farm),耶路撒冷米尔村(Jerusalem Mill Village)以及小火药瀑布(Little Gunpowder Falls)岸边修复的杰里科廊桥(Jericho Covered Bridge)。 - 143
14539
金斯维尔(Kingsville)毗邻经过翻新的杰里科农场博物馆(Jericho Farm Museum),耶路撒冷磨坊村(Jerusalem Mill Village)和小火药瀑布(Little Gunpowder Falls)岸边修复的杰里科廊桥(Jericho Covered Bridge)。 - 149
paws_dev_df = pd.read_table(DataSet_Path['paws']['dev'], header=None)
paws_dev_df.columns = Dev_Data_Style # 将header设置为数据格式,方便阅读
print('Dev_Data: ', len(paws_dev_df))
paws_dev_df.head() # max: 120, mean:43
# 测最长字段 以及 平均长度
max_len = 0
LENS = {}
for j in range(2):
index = 0
for i in paws_dev_df.iloc[:, j]:
if len(i) in list(LENS.keys()):
LENS[len(i)] += 1
else:
LENS[len(i)] = 1
if max_len < len(i):
max_len = len(i)
print(index)
print(i, ' - ', max_len)
index += 1
# print(np.mean(LENS))
import seaborn
from matplotlib import pyplot as plt
plt.figure(figsize=(26, 24))
seaborn.barplot(list(LENS.keys()), list(LENS.values()))
plt.show()
Dev_Data: 2000
0
Four Rivers 委员会与 Audubon 委员会合并后,Shawnee Trails 委员会得以问世。 - 55
8
新泽西州哈德逊县也被拼作“Macpelah 墓地”或“Macphelah 墓地”,是位于 Machpelah 墓地的一块墓地。 - 63
28
Flavia Gleske,以 Flavia Alejandra Gleske Fajin(1978 年 5 月 15 日出生)更为人熟知,是一名委内瑞拉女演员。 - 81
38
Mohammad Shafiq(变体:Mohammed、Muhammad、Shafik、Shafeek、Shafeeq、Shafique、Shafic、Chafic)可能指 - 86
110
威廉·卢埃林·威廉姆斯,更为人熟知的名字是卢埃林·威廉姆斯(1867 年 3 月 10 日 - 1922 年 4 月 22 日),是一位激进的记者、律师和威尔士自由派政治家。 - 87
671
它于 2008 年 1 月 28 日在美国由 Angular Recording Corporation 发布,于 2008 年 3 月 18 日在英国由 Domino Records 发布。 - 96
1527
它由 Angular Recording Corporation 于 2008 年 1 月 28 日在英国发行,并由 Domino Records 于 2008 年 3 月 18 日在美国发行。 - 97
1914
例外期间是 2005 年年底至 2009 年,在此期间他在瑞典为 Carlstad United BK 效力,在塞尔维亚为 FC Terek Grozny 和俄罗斯 FK Borac Čačak 效力。 - 101
113
例外情况出现在 2005 年年底至 2009 年期间,在此期间,他为 Carlstad United BK 俱乐部在瑞典踢球 , 为 FC Terek Grozny 俱乐部和俄罗斯 FK Borac Čačak 俱乐部在塞尔维亚踢球。 - 117
484
较受欢迎的列车包括:开往达卡的 Simanta Express 和 Rupsha Express、开往达卡的 Titumir Express、开往拉杰沙希的 Nilsagar Express 和开往库尔纳的 Lalmoni Express。 - 120
paws_test_df = pd.read_table(DataSet_Path['paws']['test'], header=None)
paws_test_df.columns = Test_Data_Style # 将header设置为数据格式,方便阅读
print('Test_Data: ', len(paws_test_df))
paws_test_df.head() # max: 120, mean: 44
# 测最长字段 以及 平均长度
max_len = 0
LENS = {}
for j in range(2):
index = 0
for i in paws_test_df.iloc[:, j]:
if len(i) in list(LENS.keys()):
LENS[len(i)] += 1
else:
LENS[len(i)] = 1
if max_len < len(i):
max_len = len(i)
print(index)
print(i, ' - ', max_len)
index += 1
# print(np.mean(LENS))
import seaborn
from matplotlib import pyplot as plt
plt.figure(figsize=(26, 24))
seaborn.barplot(list(LENS.keys()), list(LENS.values()))
plt.show()
Test_Data: 2000
0
2005 年末至 2009 年期间是例外,当时他效力于瑞典的卡斯塔德联队、塞尔维亚的查查克足球俱乐部和俄罗斯的格罗兹尼特里克足球俱乐部。 - 68
52
Aerosucre 4544 航班飞机坠毁是第一次涉及 Aerosucre 的航空事故,第二次则是 2006 年 11 月 18 日波音 727 飞机坠毁。 - 78
56
Manu Chao、组合 “Air”、Cassius、Mars IV、Les Négresses Vertes 和 FFF 以及 Howie B 也参与了这张专辑。 - 82
69
植物学家斯特凡·恩德利歇于 1846 年首次对该物种进行正式描述,作为约翰·格奥尔格·克里斯汀·莱曼创作的作品《Irideae . Plantae Preissianae》的一部分。 - 91
70
1912 年,在来自阿姆劳蒂、中央省和贝拉尔的 Rao Bahadur Raghunath Narasinha Mudholkar 主席的领导下,印度国民大会党在班基波举行了第 27 届会议。 - 96
585
它于 2008 年 1 月 28 日由 Angular Recording Corporation 在英国发行,并于 2008 年 3 月 18 日通过 Domino Records 在美国发行。 - 98
1050
较受欢迎的列车包括:开往达卡的 Simanta Express 和 Rupsha Express、开往达卡的 Titumir Express、开往拉杰沙希的 Nilsagar Express 和开往库尔纳的 Lalmoni Express。 - 120
查看corpus的数据
corpus_train_df = pd.read_csv(DataSet_Path['corpus']['train'], sep='\t\n', header=None)
query = np.asarray([i.split('\t')[0] for i in corpus_train_df[0]])
title = np.asarray([i.split('\t')[1] for i in corpus_train_df[0]])
label = np.asarray([i.split('\t')[2] for i in corpus_train_df[0]])
corpus_train_df['title'] = title
corpus_train_df['label'] = label
corpus_train_df.columns = Train_Data_Style
corpus_train_df['query'] = query
corpus_train_df.head() # max: 153, mean: 12 / 建议50
# 测最长字段 以及 平均长度
max_len = 0
LENS = {}
for j in range(2):
index = 0
for i in corpus_train_df.iloc[:, j]:
if len(i) in list(LENS.keys()):
LENS[len(i)] += 1
else:
LENS[len(i)] = 1
if max_len < len(i):
max_len = len(i)
print(index)
print(i, ' - ', max_len)
index += 1
# print(np.mean(LENS))
import seaborn
from matplotlib import pyplot as plt
plt.figure(figsize=(26, 24))
seaborn.barplot(list(LENS.keys()), list(LENS.values()))
plt.show()
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/ipykernel_launcher.py:1: ParserWarning: Falling back to the 'python' engine because the 'c' engine does not support regex separators (separators > 1 char and different from '\s+' are interpreted as regex); you can avoid this warning by specifying engine='python'.
"""Entry point for launching an IPython kernel.
0
用微信都6年,微信没有微粒贷功能 - 16
2
交易密码忘记了找回密码绑定的手机卡也掉了 - 20
3
你好我昨天晚上申请的没有打电话给我今天之内一定会打吗? - 27
40
我一点钟转钱进还款卡里了,现在过5点了,怎么还没自动扣款呢? - 30
89
你好,我银行卡的预留电话已经变更,但为什么发验证码的时候还发到原来的号码哪里? - 39
407
假如我贷款五个月,我使用了一个月提前还款了,利息需要付款的多久,有违约金之类的罚款吗 - 42
424
你好!我想问一下这个借款是按每天支付利息吗?什么时候换完了就不需要支付利息了,是这样吗 - 43
452
为什么我在申请的过程中,微服务发了两次验证码过来,开始不知道输错了,后来再申请为什么没有再发送验证码过来呢 - 53
1300
你好,原来的银行卡换了,我记得前几天提前还了当期的贷款,今天又提醒我还款失败,帮我确认一下!以及如何变更银行卡? - 56
2436
你好,请问我借5000元钱,选择5月返还。我可以30天的时候全部还了吗?提前还款的话,会收额外费用吗?还是只收取5000,加上借款30天内,每天0.05%的利息? - 81
3931
昨天自动还款失败然后昨晚显示逾期到了今天才自动还款成功那我不是有逾期记录了请求支援是啥回事有自己主动还款方式吗还有如何清除逾期不良记录你们自动扣款失败产生了逾期这样感觉好无用 - 87
6221
刚刚接的短信,还款失败通知:您好,由于您工商银行(9823)余额不足,您在手机微信申请的微粒贷还款失败。请确保今日(10月26日)17:00之前还款卡内余额充足,我们将于今日再次扣款。【微众银行】 - 98
12739
今天我账户两笔资金:国金基金众赢货币(001234),近七日年化收益率显示2.730%,万份收益展示0.6812元;众安天天利,近七日年化收益率显示为3.4872%,而万份收益率才显示为0.619元 - 99
36654
你好我在贵公司使用微粒贷贷款后现在我需要购房用住房公积金贷款但是银行需要我出示我和贵公司的还款详情并加盖贵公司公章我很着急打客服电话就一直让我等银行这边就等着这个了我很着急,已经的等两天了,希望快帮我解决给我发电子文件就行谢谢 - 113
463
你好,是这样,我最近身份证变更姓名了!银行卡也都变了。我打电话问了微粒贷客服,说我提供证件给你们,也可以把名字改过来,但是财付通的名字更换不了。我想问一下,我要是还清借款,还能再借么?我可以提供新名字的银行卡,但是绑定不了财付通 - 114
1621
微粒贷均采用日固定利率,按借款的实际天数计息。已发放贷款的执行利率固定不变,每日利息=剩余未还本金(借款金额-已还金额)x日利率(当前日利率为0.05%),您也可以在微粒贷页面点击借款,输入具体借款金额查看对应利息。回复以下序号获取答案:1:了解微粒贷计息详情2:多笔借款的利息计算3:我需要人工帮助 - 150
48052
你好,我想请问一下,据我所知,微米粒是属于腾讯旗下的,别名“腾讯信用”,那么对于腾讯的产品,我的消费及信用度是很高了,甚至帮腾讯处理了很多外部网友的问题,反馈了很多BUG,对于腾讯而言,我也算是骨灰级玩家了。为什么我没有通过内测呢?支付宝的花呗我都是最高的,难道腾讯信用的门槛比支付宝还高?还望解答,谢谢。 - 153
corpus_dev_df = pd.read_table(DataSet_Path['corpus']['dev'], header=None)
corpus_dev_df.columns = Dev_Data_Style # 将header设置为数据格式,方便阅读
print('Dev_Data: ', len(corpus_dev_df))
corpus_dev_df.head() # max_len = 130 ,mean: 12 / 建议50
# 测最长字段 以及 平均长度
max_len = 0
LENS = {}
for j in range(2):
index = 0
for i in corpus_dev_df.iloc[:, j]:
if len(i) in list(LENS.keys()):
LENS[len(i)] += 1
else:
LENS[len(i)] = 1
if max_len < len(i):
max_len = len(i)
print(index)
print(i, ' - ', max_len)
index += 1
# print(np.mean(LENS))
import seaborn
from matplotlib import pyplot as plt
plt.figure(figsize=(26, 24))
seaborn.barplot(list(LENS.keys()), list(LENS.values()))
plt.show()
Dev_Data: 10000
0
不要借了我是试试看能否操作的 - 14
1
亲怎样才能在钱包里有微粒货的图标呢 - 17
6
我想问下如果我开始设定的借款是20个月,但是到10个月的时候提前还清,利息是算到什么时候的呢? - 47
123
你好,出门忘带钱了,申请贷款1200。提示我身份证信息填写错误次数太多,失败。可是我只输入过一次身份证后4位一次呀 - 57
236
你好。我的微信钱包里面的借款,我按照流程进去后在最后界面。那个手机的验证码是银行的手机验证码么?那个手机停用了怎么办? - 59
1225
“您未满足微众银行审批要求”,说明您的内外部综合评分不足,暂时没有达到我们微众银行的审核标准,暂时无法使用微粒贷,很抱歉,给您带来麻烦和不便。 - 71
5078
你好,我刚刚准备还款40400元,但是提供扣款工商银行卡余额只有40371.48元,我就用微众银行,从其他卡上转入200元,补足金额,可提供扣款,然后在微信的微粒贷里直接点击还款,收到工商银行有被扣除一部份款,但没有扣足40400,微众银行又显示没有扣款成功。 - 130
corpus_test_df = pd.read_table(DataSet_Path['corpus']['test'], header=None)
corpus_test_df.columns = Test_Data_Style # 将header设置为数据格式,方便阅读
print('Test_Data: ', len(corpus_test_df))
corpus_test_df.head() # max_len = 100, mean: 12
# 测最长字段 以及 平均长度
max_len = 0
LENS = {}
for j in range(2):
index = 0
for i in corpus_test_df.iloc[:, j]:
if len(i) in list(LENS.keys()):
LENS[len(i)] += 1
else:
LENS[len(i)] = 1
if max_len < len(i):
max_len = len(i)
print(index)
print(i, ' - ', max_len)
index += 1
# print(np.mean(LENS))
import seaborn
from matplotlib import pyplot as plt
plt.figure(figsize=(26, 24))
seaborn.barplot(list(LENS.keys()), list(LENS.values()))
plt.show()
Test_Data: 10000
0
为什么我无法看到额度 - 10
2
借了钱,但还没有通过,可以取消吗? - 17
3
为什么我申请额度输入密码就一直是那个页面 - 20
19
你好,我银行卡被法院封了,能否换我儿子的卡还款 - 23
29
为什么刚刚借钱要输入很多次验证码和支付密码是不是我手机问题还款就可以 - 34
225
齐鲁稳固有个21天的理财,最少五万起,21天后收益应该是多少,?4.00%的效益 - 40
340
我想问下,我之前是贷了8000分五个月还款,已经还款3个月了!我想在这个月的21号提前还清剩下的,还完后可以重新贷吗? - 59
998
请问为什么账单是1500,提前还款还清一笔600元后,本月账单还是1400,换了600,只恢复在额度上,却不恢复在账单上 - 60
5158
如果借了500,最短分期是5个月是吗?如果分期选择了5个月,那么我第二天还款了,是不是只收一天的利息,剩下的5个月利息就不收了 - 63
6845
国华天天赢近七日年化收益率为4.05,万份收益为1.089,众安天天利近七日年化收益率为3.4113,万份收益率为1.3165,这是为什么? - 70
304
1.我的微粒贷自动还款又失败了,建设银行,银行卡资金充足。2.自动扣款失败的情况上个月也出现过后来通过中信银行换卡成功的。3.我能不能申请更换银行卡还款。4.扣款失败会不会影响信用。 - 91
6621
如果借款10个月,我每个月第一天还款,是不是那个月只收取一天的利息?就比如我25号借款(分10个月)我26还款,然后6月26还款!一个月的利息只收一天的?还是只要在还款期内的随便哪天还,利息都按一个月 - 100
各数据集数据数量的统计
Data_Length = {
'lcqmc':[len(lcqmc_train_df), len(lcqmc_dev_df), len(lcqmc_test_df)],
'paws':[len(paws_train_df), len(paws_dev_df), len(paws_test_df)],
'corpus':[len(corpus_train_df), len(corpus_dev_df), len(corpus_test_df)]
}
from matplotlib import pyplot as plt
plt.figure(figsize=(10, 8))
# 可视化数据分布
outer_index = 0
for i in range(len(Data_Length)):
inner_index = 0
for k in Data_Length:
plt.bar(inner_index + outer_index * 3, Data_Length[k][outer_index]) # 绘制条形图
plt.text(inner_index + outer_index * 3 - 0.3, Data_Length[k][outer_index] + int(0.01*Data_Length[k][outer_index]), str(Data_Length[k][outer_index])) # 标注文字
inner_index += 1
outer_index += 1
plt.xticks([i for i in range(len(Data_Length)*3)], [k+'\ntrain_len' for k in Data_Length] + [k+'\ndev_len' for k in Data_Length] + [k+'\ntest_len' for k in Data_Length])
plt.show()
二、数据集 + 模型搭建
数据集加载注意点:
- max_len:长度可以修改,建议90-256
- batch_size: 不宜太小,不易拟合
导入包
import paddle
from paddle import nn
from paddle import metric
from paddle import optimizer
from paddle.nn import loss
from paddle.nn import functional as F
from paddle.io import Dataset, DataLoader, BatchSampler
# create_dataloader 可以获取相应数据的dataloader
# 支持dataset: lcqmc, paws, corpus
from dataset import create_dataloader
# 训练train
# 验证evaluate
# 预测predict
from utils import evaluate, train, predict
# 导入paddlenlp以及预训练/预置的模型tokenizer -- 用于将token进行切分和id转换
import paddlenlp
from paddlenlp.data import Tuple, Stack, Pad
from functools import partial # partial偏函数
tokenizer = paddlenlp.transformers.ErnieGramTokenizer.from_pretrained('ernie-gram-zh')
# 加载 lcqmc 数据
lcqmc_train_dataloader = create_dataloader(dataset='lcqmc', tokenizer=tokenizer, max_seq_length=156, batchsize=128, mode='train')
lcqmc_dev_dataloader = create_dataloader(dataset='lcqmc', tokenizer=tokenizer, max_seq_length=156, batchsize=128, mode='dev')
lcqmc_test_dataloader = create_dataloader(dataset='lcqmc', tokenizer=tokenizer, max_seq_length=156, batchsize=128, mode='test')
# 加载 paws 数据
paws_train_dataloader = create_dataloader(dataset='paws', tokenizer=tokenizer, max_seq_length=156, batchsize=128, mode='train')
paws_dev_dataloader = create_dataloader(dataset='paws', tokenizer=tokenizer, max_seq_length=156, batchsize=128, mode='dev')
paws_test_dataloader = create_dataloader(dataset='paws', tokenizer=tokenizer, max_seq_length=156, batchsize=128, mode='test')
# 加载 corpus 数据
corpus_train_dataloader = create_dataloader(dataset='corpus', tokenizer=tokenizer, max_seq_length=156, batchsize=128, mode='train')
corpus_dev_dataloader = create_dataloader(dataset='corpus', tokenizer=tokenizer, max_seq_length=156, batchsize=128, mode='dev')
corpus_test_dataloader = create_dataloader(dataset='corpus', tokenizer=tokenizer, max_seq_length=156, batchsize=128, mode='test')
print("\n--The lcqmc dataloader: \ntrain_batch_iter:\t{0} \ndev_batch_iter: \t{1} \ntest_batch_iter: \t{2}".format(len(lcqmc_train_dataloader), len(lcqmc_dev_dataloader), len(lcqmc_test_dataloader)))
print("\n--The paws dataloader: \ntrain_batch_iter: \t{0} \ndev_batch_iter: \t{1} \ntest_batch_iter: \t{2}".format(len(paws_train_dataloader), len(paws_dev_dataloader), len(paws_test_dataloader)))
print("\n--The corpus dataloader: \ntrain_batch_iter: \t{0} \ndev_batch_iter: \t{1} \ntest_batch_iter: \t{2}".format(len(corpus_train_dataloader), len(corpus_dev_dataloader), len(corpus_test_dataloader)))
构建网络
-
建议尝试修改下游任务,即减少对预训练模型(主要网络)的修改,因为这会导致样本转换方法需要修改一下
-
下游可能的策略:
-
再Attention
-
感知机
-
CNN + pooling / linear
-
RNN + CNN 或者其它
-
# 基于 ERNIE-Gram 模型结构搭建 Point-wise 语义匹配网络
class PointwiseMatching(nn.Layer):
# 此处的 pretained_model 在本例中会被 ERNIE-Gram 预训练模型初始化
def __init__(self, dropout=None):
super().__init__()
self.ptm = paddlenlp.transformers.ErnieGramModel.from_pretrained('ernie-gram-zh')
self.dropout = nn.Dropout(dropout if dropout is not None else 0.15)
# 语义匹配任务: 相似、不相似 2 分类任务
self.classifier = nn.Linear(self.ptm.config["hidden_size"], 2)
def forward(self,
input_ids,
token_type_ids=None,
position_ids=None,
attention_mask=None):
# 此处的 Input_ids 由两条文本的 token ids 拼接而成
# token_type_ids 表示两段文本的类型编码
# 返回的 cls_embedding 就表示这两段文本经过模型的计算之后而得到的语义表示向量
_, cls_embedding = self.ptm(input_ids, token_type_ids, position_ids,
attention_mask)
cls_embedding = self.dropout(cls_embedding)
# 基于文本对的语义表示向量进行 2 分类任务
logits = self.classifier(cls_embedding)
probs = F.softmax(logits)
return probs
三、模型训练参数配置
-
这里先配置损失函数与评估指标, 后边再构建优化器——因为每一次更新参数不完全一样
-
batch_size大了,可能需要适当方法训练轮次epoches,因为总训练次数会随batch_size增大而减少
-
weight_decay可以做修改,具体作用可参考API文档
# 采用交叉熵 损失函数
criterion = paddle.nn.loss.CrossEntropyLoss()
# 评估的时候采用准确率指标
metric = paddle.metric.Accuracy()
四、开始训练
-
准备有简易的全量训练
- 即,基本训练结束,传入dev数据进行训练(此时的轮次数量自行尝试,一般为1-2),最后再用于预测
根据需要解除注释
4.1 训练 lcqmc 数据
模型实例化与优化器配置
from paddlenlp.transformers import LinearDecayWithWarmup
# 定义 Point-wise 语义匹配网络
model = PointwiseMatching()
epochs = 3
num_training_steps = len(lcqmc_train_dataloader) * epochs
# 定义 learning_rate_scheduler,负责在训练过程中对 lr 进行调度
lr_scheduler = LinearDecayWithWarmup(5E-5, num_training_steps, 0.0)
# Generate parameter names needed to perform weight decay.
# All bias and LayerNorm parameters are excluded.
decay_params = [
p.name for n, p in model.named_parameters()
if not any(nd in n for nd in ["bias", "norm"])
]
# 定义 Optimizer
optimizer = paddle.optimizer.AdamW(
learning_rate=lr_scheduler,
parameters=model.parameters(),
weight_decay=0.0,
apply_decay_param_fun=lambda x: x in decay_params)
开始训练
- 模型文件保存在 checkpoint 下的 model_name_model_step 文件夹下
model = train(lcqmc_train_dataloader, # 训练数据
lcqmc_dev_dataloader, # 验证数据
tokenizer, # 标记器
model, # 模型/网络
1, # 训练轮次
criterion, # 损失函数/目标函数
metric, # 评价指标
optimizer, # 优化器
lr_scheduler, # 学习率策略
model_name='lcqmc')
# # 全量训练
# add_epoch = 1
# model = train(lcqmc_dev_dataloader,
# lcqmc_dev_dataloader,
# tokenizer,
# model,
# add_epoch,
# criterion,
# metric,
# optimizer,
# lr_scheduler,
# model_name='lcqmc')
# model = train(lcqmc_train_dataloader,
# lcqmc_dev_dataloader,
# tokenizer,
# model,
# add_epoch,
# criterion,
# metric,
# optimizer,
# lr_scheduler,
# model_name='lcqmc')
4.2 预测 lcqmc 数据
- 注意修改路径为上边模型训练结束后保存的路径
import numpy as np
model = PointwiseMatching()
# 需要更换为 上面训练好的模型保存的路径下的模型参数
model.set_dict(paddle.load("checkpoint/model_16/model_state.pdparams")) # 预测需要的模型参数路径自己要注意下哦,不要加载错了
# 预测
probs = predict(model, lcqmc_test_dataloader)
preds = np.argmax(probs, axis=1)
生成tsv提交文件
with open("lcqmc.tsv", 'w', encoding="utf-8") as f:
f.write("index\tprediction\n")
text_pair = {}
for idx, y_pred in enumerate(preds):
f.write("{}\t{}\n".format(idx, y_pred))
text_pair['id'] = idx
text_pair["label"] = y_pred
print(text_pair)
4.3 训练 paws 数据
模型实例化与优化器配置
from paddlenlp.transformers import LinearDecayWithWarmup
# 定义 Point-wise 语义匹配网络
model = PointwiseMatching()
epochs = 3
num_training_steps = len(paws_train_dataloader) * epochs
# 定义 learning_rate_scheduler,负责在训练过程中对 lr 进行调度
lr_scheduler = LinearDecayWithWarmup(5E-5, num_training_steps, 0.0)
# Generate parameter names needed to perform weight decay.
# All bias and LayerNorm parameters are excluded.
decay_params = [
p.name for n, p in model.named_parameters()
if not any(nd in n for nd in ["bias", "norm"])
]
# 定义 Optimizer
optimizer = paddle.optimizer.AdamW(
learning_rate=lr_scheduler,
parameters=model.parameters(),
weight_decay=0.0,
apply_decay_param_fun=lambda x: x in decay_params)
开始训练
- 模型文件保存在 checkpoint 下的 model_name_model_step 文件夹下
# 训练用
model = train(paws_train_dataloader,
paws_dev_dataloader,
tokenizer,
model,
epochs,
criterion,
metric,
optimizer,
lr_scheduler,
model_name='lcqmc')
# # 全量训练
# add_epoch = 1
# model = train(paws_train_dataloader,
# paws_dev_dataloader,
# tokenizer,
# model,
# add_epoch,
# criterion,
# metric,
# optimizer,
# lr_scheduler,
# model_name='lcqmc')
# model = train(paws_train_dataloader,
# paws_dev_dataloader,
# tokenizer,
# model,
# add_epoch,
# criterion,
# metric,
# optimizer,
# lr_scheduler,
# model_name='lcqmc')
4.4 预测 paws 数据
- 注意修改路径为上边模型训练结束后保存的路径
import numpy as np
model = PointwiseMatching()
# 需要更换为 paws对应模型 上面训练好的模型保存的路径下的模型参数
model.set_dict(paddle.load("checkpoint/model_16/model_state.pdparams")) # 预测需要的模型参数路径自己要注意下哦,不要加载错了
# 预测
probs = predict(model, paws_test_dataloader)
preds = np.argmax(probs, axis=1)
生成tsv提交文件
with open("paws-x.tsv", 'w', encoding="utf-8") as f:
f.write("index\tprediction\n")
text_pair = {}
for idx, y_pred in enumerate(preds):
f.write("{}\t{}\n".format(idx, y_pred))
text_pair['id'] = idx
text_pair["label"] = y_pred
print(text_pair)
4.5 训练 corpus 数据
模型实例化与优化器配置
from paddlenlp.transformers import LinearDecayWithWarmup
# 定义 Point-wise 语义匹配网络
model = PointwiseMatching()
epochs = 3
num_training_steps = len(corpus_train_dataloader) * epochs
# 定义 learning_rate_scheduler,负责在训练过程中对 lr 进行调度
lr_scheduler = LinearDecayWithWarmup(5E-5, num_training_steps, 0.0)
# Generate parameter names needed to perform weight decay.
# All bias and LayerNorm parameters are excluded.
decay_params = [
p.name for n, p in model.named_parameters()
if not any(nd in n for nd in ["bias", "norm"])
]
# 定义 Optimizer
optimizer = paddle.optimizer.AdamW(
learning_rate=lr_scheduler,
parameters=model.parameters(),
weight_decay=0.0,
apply_decay_param_fun=lambda x: x in decay_params)
开始训练
- 模型文件保存在 checkpoint 下的 model_name_model_step 文件夹下
# 训练用
model = train(corpus_train_dataloader,
corpus_dev_dataloader,
tokenizer,
model,
epochs,
criterion,
metric,
optimizer,
lr_scheduler,
model_name='lcqmc')
# # 全量训练
# add_epoch = 1
# model = train(corpus_train_dataloader,
# corpus_dev_dataloader,
# tokenizer,
# model,
# add_epoch,
# criterion,
# metric,
# optimizer,
# lr_scheduler,
# model_name='lcqmc')
# model = train(corpus_train_dataloader,
# corpus_dev_dataloader,
# tokenizer,
# model,
# add_epoch,
# criterion,
# metric,
# optimizer,
# lr_scheduler,
# model_name='lcqmc')
4.6 预测 corpus 数据
- 注意修改路径为上边模型训练结束后保存的路径
import numpy as np
model = PointwiseMatching()
# 需要更换为 paws对应模型 上面训练好的模型保存的路径下的模型参数
model.set_dict(paddle.load("checkpoint/model_16/model_state.pdparams")) # 预测需要的模型参数路径自己要注意下哦,不要加载错了
# 预测
probs = predict(model, corpus_test_dataloader)
preds = np.argmax(probs, axis=1)
生成tsv提交文件
with open("bq_corpus.tsv", 'w', encoding="utf-8") as f:
f.write("index\tprediction\n")
text_pair = {}
for idx, y_pred in enumerate(preds):
f.write("{}\t{}\n".format(idx, y_pred))
text_pair['id'] = idx
text_pair["label"] = y_pred
ort numpy as np
model = PointwiseMatching()
# 需要更换为 paws对应模型 上面训练好的模型保存的路径下的模型参数
model.set_dict(paddle.load("checkpoint/model_16/model_state.pdparams")) # 预测需要的模型参数路径自己要注意下哦,不要加载错了
# 预测
probs = predict(model, corpus_test_dataloader)
preds = np.argmax(probs, axis=1)
生成tsv提交文件
with open("bq_corpus.tsv", 'w', encoding="utf-8") as f:
f.write("index\tprediction\n")
text_pair = {}
for idx, y_pred in enumerate(preds):
f.write("{}\t{}\n".format(idx, y_pred))
text_pair['id'] = idx
text_pair["label"] = y_pred
print(text_pair)
五、打包比赛结果文件
!zip result.zip lcqmc.tsv paws-x.tsv bq_corpus.tsv
更多推荐
所有评论(0)