入门NLP-4-基于深度学习的文本分类1-fastText

入门NLP-4-基于深度学习的文本分类1-fastText

  • 综述
  • 数据
  • fastText简介及使用
    • fastText 架构原理
    • fastText的安装
    • fastText的使用
  • 总结

综述

在这里不太不关注fastText的原理,重点放在怎么使用,欢迎一起讨论。

数据

数据集来自天池比赛,可自行下载或者联系我: 链接

fastText简介及使用

fastText 架构原理

fastText 模型输入一个词的序列(一段文本或者一句话),输出这个词序列属于不同类别的概率。
序列中的词和词组组成特征向量,特征向量通过线性变换映射到中间层,中间层再映射到标签。
fastText 在预测标签时使用了非线性激活函数,但在中间层不使用非线性激活函数。
fastText 模型架构和 Word2Vec 中的 CBOW 模型很类似。不同之处在于,fastText 预测标签,而 CBOW 模型预测中间词。
入门NLP-4-基于深度学习的文本分类1-fastText_第1张图片

fastText的安装

FastText可以快速的在CPU上进行训练,最好的实践方法就是官方开源的版本: https://github.com/facebookresearch/fastText/tree/master/python

  • pip安装
pip install fasttext

或者

git clone https://github.com/facebookresearch/fastText.git
cd fastText
sudo pip install .
  • 也可以使用 setuptools 安装
git clone https://github.com/facebookresearch/fastText.git
cd fastText
python setup.py install

当时我在服务器上安装时,使用的是pip安装,安装失败,原因是使用原服务器的pip,不是root账号不能安装成果,所以我使用自己虚拟环境的pip,成功了。

fastText的使用

在使用fastText的时候,要把数据设置成API规定的格式。

import pandas as pd
from sklearn.metrics import f1_score

# 转换为FastText需要的格式
train_df = pd.read_csv('../data/train_set.csv', sep='\t', 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='\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.82

在上述代码中,首先pd.read_csv()读取文本data和label,然后重新设置格式:一行有两列分别是’text’和’label_ft’,其中text是文本或者序列词的index,label的格式是’label’ + train_df[‘label’].astype(str)。
然后用fasttext.train_supervised()构建模型并训练,使用model.predict(x)预测并保存在val_pred中。

当然,fasttext也有很多其他的接口
如可以使用 fasttext.skipgram 和 fasttext.cbow 功能:

import fasttext
# skipgram model
model = fasttext.skipgram('data.txt','model')
print model.words # 字典中的词汇列表
 
# CBOW model
model = fasttext.cbow('data.txt','model')
print model.words

获取词汇表外单词的向量,已经训练过的模型可以用来计算词汇表外的词汇向量。

# 单词 'king' 的词向量
print model['king']

总结

FastText在文本分类任务上,是优于TF-IDF的:

  • FastText用单词的Embedding叠加获得的文档向量,将相似的句子分为一类;
  • FastText学习到的Embedding空间维度比较低,可以快速进行训练;

要知道fasttext,不过是 word2vec中 cbow + h-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个);

你可能感兴趣的:(nlp,自然语言处理,深度学习,机器学习,神经网络,nlp)