任务1:报名比赛
步骤1:报名比赛http://challenge.xfyun.cn/topic/info?type=car-multilingual&ch=ds22-dw-zmt05
步骤2:下载比赛数据(点击比赛页面的赛题数据)
步骤3:解压比赛数据,并使用pandas进行读取;
步骤4:查看训练集和测试集字段类型,并将数据读取代码写到博客;
1.数据说明(来自官方赛事说明)
本次比赛为参赛选手提供三类车内交互功能语料,其中包括命令控制类、导航类、音乐类。较多的中文语料和较少的多语种平行语料均带有意图分类和关键信息,选手需充分利用所提供数据,在英、日、阿拉伯语料的意图分类和关键信息抽取任务上取得较好效果。数据所含标签种类及取值类型如下表所示。
变量 数值格式 解释
intent string 整句意图标签
device string 操作设备名称标签
mode string 操作设备模式标签
offset string 操作设备调节量标签
endloc string 目的地标签
landmark string 周边搜索参照标签
singer string 歌手
song string 歌曲
import pandas as pd
train_cn = pd.read_excel('汽车领域多语种迁移学习挑战赛初赛训练集/中文_trian.xlsx')
train_ja = pd.read_excel('汽车领域多语种迁移学习挑战赛初赛训练集/日语_train.xlsx')
train_en = pd.read_excel('汽车领域多语种迁移学习挑战赛初赛训练集/英文_train.xlsx')
test_ja = pd.read_excel('testA.xlsx', sheet_name='日语_testA')
test_en = pd.read_excel('testA.xlsx', sheet_name='英文_testA')
日语和英语的训练集相较中文会多一个中文翻译
(看不懂,NLP的比赛有点绕
瞥一眼提交案例
相当于把“意图”这一列插上去。
任务2:文本分析与文本分词
步骤1:使用jieba对中文进行分词;
import jieba
import jieba.posseg as pseg
words = jieba.lcut("阿水是一个好同志。")
print(words)
words = pseg.lcut("阿水是一个好同志。")
步骤2:使用negisa对日语进行分词;
安装这个negisa日语分词库,可整死了,python版本3.8的搞不成,试了一圈,最后选择anaconda另一个虚拟环境(python3.6的),就安装成功了
# https://github.com/taishi-i/nagisa
import nagisa
text = 'Pythonで簡単に使えるツールです'
jpwords = nagisa.tagging(text)
print(jpwords)
jpwords.words
任务3:TFIDF与文本分类
前面的代码
import pandas as pd # 读取文件
import numpy as np # 数值计算
import nagisa # 日文分词
from sklearn.feature_extraction.text import TfidfVectorizer # 文本特征提取
from sklearn.linear_model import LogisticRegression # 逻辑回归
from sklearn.pipeline import make_pipeline # 组合流水线
# 读取数据
train_cn = pd.read_excel('汽车领域多语种迁移学习挑战赛初赛训练集/中文_trian.xlsx')
train_ja = pd.read_excel('汽车领域多语种迁移学习挑战赛初赛训练集/日语_train.xlsx')
train_en = pd.read_excel('汽车领域多语种迁移学习挑战赛初赛训练集/英文_train.xlsx')
test_ja = pd.read_excel('testA.xlsx', sheet_name='日语_testA')
test_en = pd.read_excel('testA.xlsx', sheet_name='英文_testA')
# 文本分词
train_ja['words'] = train_ja['原始文本'].apply(lambda x: ' '.join(nagisa.tagging(x).words))
train_en['words'] = train_en['原始文本'].apply(lambda x: x.lower())
test_ja['words'] = test_ja['原始文本'].apply(lambda x: ' '.join(nagisa.tagging(x).words))
test_en['words'] = test_en['原始文本'].apply(lambda x: x.lower())
步骤1:学习TFIDF的使用,提取语料的TFIDF特征;
步骤2:使用逻辑回归结合TFIDF进行训练(所有的语言语料),并对测试集的意图进行分类;
# 训练TFIDF和逻辑回归
pipline = make_pipeline(
TfidfVectorizer(),
LogisticRegression()
)
pipline.fit(
train_ja['words'].tolist() + train_en['words'].tolist(),
train_ja['意图'].tolist() + train_en['意图'].tolist()
)
# 模型预测
test_ja['意图'] = pipline.predict(test_ja['words'])
test_en['意图'] = pipline.predict(test_en['words'])
test_en['槽值1'] = np.nan
test_en['槽值2'] = np.nan
test_ja['槽值1'] = np.nan
test_ja['槽值2'] = np.nan
步骤3:将步骤2预测的结果文件提交到比赛,截图分数;
# 写入提交文件
writer = pd.ExcelWriter('submit.xlsx')
test_en.drop(['words'], axis=1).to_excel(writer, sheet_name='英文_testA', index=None)
test_ja.drop(['words'], axis=1).to_excel(writer, sheet_name='日语_testA', index=None)
writer.save()
writer.close()
任务4:正则表达式
正则就是各种规则啦
步骤1:学习使用正则表达式,并提取文本中的连续数值;
正则写成函数,然后用agg,生成新的一列
写成函数,偷偷2011年的博客
import re
def fuc(s):
# pattern = re.compile('(\d+(\.\d)?)') 会生成多余的数组
pattern = re.compile('[0-9]*\.?[0-9]+')
m = pattern.findall(s)
return (m)
步骤2:使用正则表达式进行槽值匹配(基于历史的槽值字符串)
?这一步是为了什么呀
新的一列和槽值offset之后的数字进行匹配
因为有的是状态转化,会有两列,但是给的数据只有一列,所以需要填充另外一列(给的槽值2)(猜的)
data=train_cn['原始文本'].apply(lambda x:fuc(x))
data[:4765].loc[data[:4765].apply(lambda x:len(x)>1)]
(这个4765也不知道对不对,烦死了,这个索引,因为xlsx数据是从第二行开始的,然后读取的时候,是变成第一行,所以我只看到前4765行,可能有两个数字的,后面的两个数字都没什么关系了,都是地理位置,只有这个温度调整意图的数字才有所谓)
太丑陋了
#用来提取槽值1后面的值
def fuc2(s):
pattern = re.compile('offset:+([0-9]*\.?[0-9]+)')
m = pattern.findall(s)
return (m)
#排除空值
offset=train_cn[pd.isnull(train_cn['槽值1'])!=True]['槽值1']
#调用函数
offsett=offset[:4765].apply(lambda x:fuc2(x))
#注意数组对齐
data[:4765].loc[data[:4765]!=offsett[:]]
还是找到了几个漏网之鱼,数量太少,直接手动填入了
ps 这里面还有可能出错的地方有 16度5,原始数据可能是16 或者 16,5 其实是16.5
(2022年7月13日18:28:01 吐了 一个多小时就搞了个这)
任务5:BERT模型入门
安装transformers库,直接从黄字那里开始
学习资料:
官方简介 https://huggingface.co/docs/transformers/main_classes/pipelines
原来transformers是一个自然语言处理的库,简介
安装这个库,安装失败“pip安装Transformers时遇到的问题Failed to build tokenizers”,可以参考,提前安装一下
conda install -c huggingface transformers
Original error was: DLL load failed: 找不到指定的模块。
conda install -c anaconda numpy-base
还是报错,然后按着上面引用numpy的报错信息,检索到了说要重新安装numpy的博客
pip uninstall -y numpy
pip uninstall -y setuptools
pip install setuptools
pip install numpy
还是报错
卸载重安HfApi,还是报错,卸载重安transformers,中途报错,返回上面那一步,结果失效了,然后按照特定版本的安装,成功了
直接从这里走
pip install transformers==2.4.1
jupyterlab报错了,安装另外一个库,重启
pip install ipywidgets
学习transformers库中pipeline和加载模型的过程
快速浏览里面就写了pipeline的使用
上图这是,pipeline下载并缓存默认的预训练模型和分词器,以进行情绪分析。
学习transformers库的使用:包括定义数据集,定义模型和训练模型
再见了您内
NLP 到此结束
任务6:BERT文本分类
(开始时间 2022年7月15日11:12:47 结束时间 )
步骤0:先把案例学习资料从gitee上面下载下来,然后用notebook打开
(到这里,已经完成学习的99.999%了)然后小过一下,仿着改一下。
(第0.5步跑通这个notebook,然后 第一行注释地方的下载,失败了,于是从gitee上找到zip数据包并下载了)
太难了太难了
又是报错,说我transformer版本低?我按着博客,去pypi的官方下载whl的包,一个一个安装
最新的不行,要求版本3.7,然后我就试到了4.16,OK了
然后安好了之后,回去运行,兄弟,这次是torch的包搞不出来了
然后我 强制安装了
pip install torch==1.6.0 -f https://download.pytorch.org/whl/torch_stable.html
我都能找到的,你为什么找不到????????????
然后把jupyterlab关掉,重开,就可以了
。人麻了
可怕
不玩了不玩了
BERT就到这里吧,不能再爱了
(主要是为了证明一下,自己不是那种连环境都配不好的人。所以配好了环境,就ok了。对NLP不感兴趣,没有什么继续的想法)
补充两篇 一个是pip报错的删除anaconda虚拟环境文件的
一个是从pypi直接下载的方法(安装的话就是pip install +…/…/xxx.whl)
步骤1:使用BERT完成意图识别(文本分类)
步骤2:将步骤1预测的结果文件提交到比赛,截图分数;
学习资料:
https://gitee.com/coggle/competition-baseline/blob/master/tutorial/bert/bert-cls-example.ipynb
[CLS]就是classification的意思,可以理解为用于下游的分类任务。
BERT里面的CLS有啥用
任务7:BERT实体抽取
步骤1:使用BERT完成实体抽取(槽位识别)
步骤2:将步骤1预测的结果文件提交到比赛,截图分数;
学习资料:
https://gitee.com/coggle/competition-baseline/blob/master/tutorial/bert/bert-ner-example.ipynb
NER又称作专名识别,是自然语言处理中的一项基础任务,~~
2022年8月9日
想要复盘呢,结果没进复赛,没机会了。