Task4 基于深度学习的文本分类

fastText模型的输入是一个词的序列(一段文本或者一句话),输出是这个词序列属于不同类别的概率。在序列中的词和词组构成特征向量,特征向量通过线性变换映射到中间层,再由中间层映射到标签。fastText在预测标签时使用了非线性激活函数,但在中间层不使用非线性激活函数。

import pandas as pd
from sklearn.metrics import f1_score

#转换为FastText需要的格式
train_df=pd.read_csv(../input/train_set.csv,sep=	,nrows=15000)
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=	)

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))

fastText和word2vec的区别

相似处:图模型结构很像,都是采用embedding向量的形式,得到word的隐向量表达。都采用很多相似的优化方法,比如使用Hierarchical softmax优化训练和预测中的打分速度。

不同处:模型的输出层:word2vec的输出层,对应的是每一个term,计算某term的概率最大;而fasttext的输出层对应的是 分类的label。不过不管输出层对应的是什么内容,起对应的vector都不会被保留和使用; 模型的输入层:word2vec的输出层,是 context window 内的term;而fasttext 对应的整个sentence的内容,包括term,也包括 n-gram的内容;两者本质的不同,体现在 h-softmax的使用:Wordvec的目的是得到词向量,该词向量 最终是在输入层得到,输出层对应的 h-softmax 也会生成一系列的向量,但最终都被抛弃,不会使用。fasttext则充分利用了h-softmax的分类功能,遍历分类树的所有叶节点,找到概率最大的label(一个或者N个)

经验分享 程序员 微信小程序 职场和发展