Task 4主要关注基于深度学习的文本分类。与传统的机器学习不同,深度学习是一般一个end2end的过程,即既包含了特征提取,也包含了分类功能。
文本表示法 - 改进
在上一个task里,我们已经学习了几种表示方法:
- one hot;
- bag of words;
- n-gram;
- TF-IDF;
但是实际上,上述方法或多或少都存在着问题:
- 转换得到的向量维度很高,数量很多,需要较长时间的训练时间;
- 无法表达出单词与单词之间的关系,只能反映出统计上的特征;
利用深度学习,我们可以很好的解决这些问题,典型的例子有Word2vec / bert / FastText,本次task我们来学习FastText。
FastText
FastText是一种典型的深度学习的词向量表示方法,它非常简单地通过Embedding层将单词映射到稠密空间,然后将句子中的所有单词在Embedding空间中做average,生成句子的embedding,进而完成分类。
算法的详细说明待补充。
下面是应用fasttext到我们的任务的代码。
import pandas as pd
from sklearn.metrics import f1_score
train_df = pd.read_csv('train_set.csv', sep='\t', nrows=50000)
train_df['label_ft'] = '__label__' + train_df['label'].astype(str)
train_df[['text','label_ft']].iloc[:-5000].to_csv('train.csv', index=None, header=None, sep='\t')
import fasttext
model = fasttext.train_supervised('train.csv', lr=1.0, wordNgrams=2, \
verbose=2, minCount=1, epoch=25, loss="hs")
val_pred = [model.predict(x)[0][0].split('__')[-1] for x in train_df.iloc[-5000:]['text']]
print(f1_score(train_df['label'].values[-5000:].astype(str), val_pred, average='macro'))
0.8922