前言
依然是coggle的7月竞赛学习活动,本博客围绕着汽车领域多语种迁移学习挑战赛展开。
- 比赛地址:http://challenge.xfyun.cn/topic/info?type=car-multilingual&ch=ds22-dw-zmt05
- 活动地址:https://coggle.club/blog/30days-of-ml-202207
上一个任务是糖尿病遗传风险检测挑战赛,传送门:
糖尿病遗传风险检测挑战赛-Coggle 30 Days of ML
一、赛题理解
本赛题为标准的nlp领域的任务,需要通过给定的语料,完成相应的关键字提取和文本分类任务。关键词提取主要是考察对于文本的结构分析以及一些常见的分词工具如jieba、jiagu等等的使用,文本分类则要用到如今在nlp如日中天的预训练+微调这套东西(当然如果能把语料吃透,用字典或者规则也行),个人感觉这项工作对于不熟悉nlp的同学的要求要高一大截,但是如果能啃下来收获也是非常大的。
1.1 数据读取
照例还是先看看给的数据,训练集包含中文、英文、日语三类语言,其中英语和日语油给出了相应的中文翻译:
中文语料:
英文语料:
日文语料:
再看看给的提交示例(A榜):
基本上就能确定了,这个任务就是要尽可能的填上“意图”列和两个“槽值”列,“意图”对应着文本分类,“槽值”则是关键词提取。
2.2 数据概览
以下两部分代码均来自于一位同样参与打卡活动的大佬@千千惠儿,能够在动手之前先对文本语料有一个大致的把握,首先是文本长度分布 :
import matplotlib.pyplot as plt
import seaborn as sns
fig,axes=plt.subplots(1,3, figsize=(20, 5)) #创建一个1行三列的图片
train_cn['Chinese_text_len'] = [len(i) for i in train_cn["原始文本"]]
train_en['English_text_len'] = [len(i.split(" ")) for i in train_en["原始文本"]]
train_ja['Japan_text_len'] = [len(i) for i in train_ja["原始文本"]]
sns.distplot(train_cn['Chinese_text_len'],bins=10,ax=axes[0])
sns.distplot(train_en['English_text_len'],bins=10,ax=axes[1])
sns.distplot(train_ja['Japan_text_len'],bins=10,ax=axes[2])
然后是意图分布:
df_ana = pd.DataFrame()
for label,df in zip(['中文','英文','日文'],[train_cn,train_en,train_ja]):
temp = pd.DataFrame(df.意图.value_counts()).reset_index()
temp.columns = ['%s意图'%label,'个数']
df_ana = pd.concat([df_ana,temp],axis=1)
df_ana
槽值的槽点有点多,一时间想不到统计它的作用,所以这里就先不管了,不过我上方的传送门里那位大佬也针对这俩字段有所处理,感兴趣的同学可以移步看看。
二、文本分词
这块工作主要是熟悉一些常见的分词工具,中文和日文毕竟不像英文那样有空格隔开,所以想把一句话拆成几个词,还是需要一些成熟的词典工具进行辅助。比如jieba、jiagu还有coggle打卡活动中提示用于日语分词的nagisa,实际上这些工具除了能完成句子的分词任务以外,还能够给出相应词汇的词性(比如名词、动词、形容词等等),如果能用好这一点,至少可以粗略的定义一些规则,同样可以完成一些现实任务。
train_cn['words'] = train_cn['原始文本'].apply(jieba.lcut)
train_en['words'] = train_en['原始文本'].apply(lambda x:x.split(' '))
train_ja['words'] = train_ja['原始文本'].apply(lambda x:nagisa.tagging(x).words)
三、TFIDF与文本分类
3.1 TF-IDF
关于它的原理放个传送门:机器学习:生动理解TF-IDF算法。在做文本分类任务时,一个很重要的任务就是完成文本的向量化表示(这个是nlp的基础),TFIDF所提供的就是一种基于词频次的文本向量化表示方式,为了进一步理解它,我们不妨直接动手试一下:
from sklearn.feature_extraction.text import TfidfVectorizer
tv = TfidfVectorizer(use_idf=True, smooth_idf=True, norm=None)
words_list = [ # 每行表示一个文本
"i am a good boy",
"i am a bad boy",
"she is so pretty",
"she drives me crazy",
"i fell in love with her"
]
tv_fit = tv.fit_transform(words_list)
查看一下构建的词汇表以及表的长度:
再查看一下向量化的结果: