前言
科大讯飞,汽车领域多语种迁移学习挑战赛,入门NLP。
一、比赛报名
- 步骤1:报名比赛http://challenge.xfyun.cn/topic/info?type=car-multilingual&ch=ds22-dw-zmt05
- 步骤2:下载比赛数据(点击比赛页面的赛题数据)
- 步骤3:解压比赛数据,并使用pandas进行读取;
pandas读取代码如下:
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')
train_cn.shape,train_ja.shape,train_en.shape
- 步骤4:查看训练集和测试集字段类型,并将数据读取代码写到博客;
字段类型查看,衔接上一段代码。
df = pd.concat([pd.DataFrame(train_cn.dtypes),pd.DataFrame(train_ja.dtypes),pd.DataFrame(train_en.dtypes)],axis=1)
df.columns = ['train_cn_dtypes','train_ja_dtypes','train_en_dtypes']
二、文本分析与文本分词
- 步骤1:使用jieba对中文进行分词;
import jieba
import jieba.posseg as pseg
words = jieba.lcut("今天北京天气不错。")
print(words)
words = pseg.lcut("今天北京天气不错。")
运行结果
['今天', '北京', '天气', '不错', '。']
- 步骤2:使用negisa对日语进行分词
# https://github.com/taishi-i/nagisa
import nagisa
text = 'Pythonで簡単に使えるツールです'
words = nagisa.tagging(text)
print(words)
#=> Python/名詞 で/助詞 簡単/形状詞 に/助動詞 使える/動詞 ツール/名詞 です/助動詞
# Get a list of words
print(words.words)
#=> ['Python', 'で', '簡単', 'に', '使える', 'ツール', 'です']
# Get a list of POS-tags
print(words.postags)
#=> ['名詞', '助詞', '形状詞', '助動詞', '動詞', '名詞', '助動詞']
运行结果
Python/名詞 で/助詞 簡単/形状詞 に/助動詞 使える/動詞 ツール/名詞 です/助動詞
['Python', 'で', '簡単', 'に', '使える', 'ツール', 'です']
['名詞', '助詞', '形状詞', '助動詞', '動詞', '名詞', '助動詞']
三、 TFIDF与文本分类
步骤1:学习TFIDF的使用,提取语料的TFIDF特征;
from sklearn.feature_extraction.text import TfidfVectorizer
corpus = [
'今天天气不错.',
'I am happy everyday.',
'How are you.',
'Are you happy and smile everydat',
]
vectorizer = TfidfVectorizer()
tdm = vectorizer.fit_transform(corpus)
space = vectorizer.vocabulary_
print(space)
运行结果
{'今天天气不错': 9, 'am': 0, 'happy': 5, 'everyday': 4, 'how': 6, 'are': 2, 'you': 8, 'and': 1, 'smile': 7, 'everydat': 3}
步骤2:使用逻辑回归结合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())
# 训练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
# 写入提交文件
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()
步骤3:将步骤2预测的结果文件提交到比赛,截图分数;
四、正则表达式
- 步骤1:学习使用正则表达式,并提取文本中的连续数值;
常见用法见这个博主的博客,添加链接描述 - 步骤2:使用正则表达式进行槽值匹配(基于历史的槽值字符串)