【练一下2】汽车领域多语种迁移学习挑战赛[2022.7.8]

本文详细记录了一位参赛者在NLP比赛中经历的全过程,包括报名、数据读取、文本分词(jieba和negisa)、TFIDF与逻辑回归文本分类、正则表达式应用、BERT模型的学习与应用。参赛者通过处理中文、日文和英文数据,完成了意图识别和实体抽取任务,并提交了预测结果。过程中遇到了环境配置问题,如transformers和torch的安装,最终克服困难,完成了比赛任务。
摘要由CSDN通过智能技术生成

任务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日
想要复盘呢,结果没进复赛,没机会了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值