天池NLP学习赛(4)基于深度学习的文本分类(fastText)

fastText

文本表示方法 Part2

学习地址
在上一章节,我们介绍几种文本表示方法:

One-hot、Bag of Words、N-gram、TF-IDF

缺陷是:转换得到的向量维度很高,需要较长的训练实践;没有考虑单词与单词之间的关系,只是进行了统计。

确切地说:只是将文本中的各个词汇的某个统计量作为特征,没有利用单词所在位置的信息

与这些表示方法不同,深度学习也可以用于文本表示,还可以将其映射到一个低纬空间。其中比较典型的例子有:FastText、Word2Vec和Bert。在本章我们将介绍FastText,将在后面的内容介绍Word2Vec和Bert。

part 1:FastText介绍

FastText是一种典型的深度学习词向量的表示方法,它非常简单通过Embedding层将单词映射到稠密空间,然后将句子中所有的单词在Embedding空间中进行平均,进而完成分类操作。论文原文

原文中介绍了FastText的结构、hierarchy softmax利用huffman tree结构优化softmax的计算具体可参考、n-gram在其中的运用

所以FastText是一个三层的神经网络,输入层、隐含层和输出层。

下面是用keras实现FastText的例子

from __future__ import unicode_literals

from keras.models import Sequential
from keras.layers import Embedding
from keras.layers import GlobalAveragePooling1D
from keras.layers import Dense
VOCAB_SIZE=2000
EMBEDDING_DIM=100
MAX_WORDS=500
CLASS_NUM=5

def build_fastText():
    model=Sequential()
    model.add(Embedding(VOCAB_SIZE,EMBEDDING_DIM,input_length=MAX_WORDS))
    #第一层嵌入层 前两个参数:input_dim,output_dim:词汇表长度(样本大小),词向量(特征)维度
    #input_length:输入序列长度(一个样本的长度)
    #输入为:(batch_size, sequence_length)  样本大小,样本长度        
    #输出为:(batch_size, sequence_length,output_dim) 样本大小,样本长度,嵌入后转化为的词向量维度
    #在这一步中把2000个包含500个词的文本输入,得到2000个样本中500个词对应的100维向量
    model.add(GlobalAveragePooling1D())
    #第二层池化层 算2000个样本的500个词对应100维词向量的平均值,用来代表这个样本的词向量,结果:2000*100
    model.add(Dense(CLASS_NUM,activation='softmax'))
    #第三层全连接层 进一步降低词向量(特征)维数
    #CLASS_NUM:特征数
    #activation 全连接之后再复合激活函数,默认:activation=id(x)
    model.compile(loss='categorical_crossentropy',optimizer='SGD',metrics=['accuracy'])
    #配置训练模型:误差计算,优化算法SGD随机梯度下降,指标
    return model

if __name__=='__main__':
    model=build_fastText()
    print(model.summary())
Model: "sequential_5"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
embedding_5 (Embedding)      (None, 500, 100)          200000    
_________________________________________________________________
global_average_pooling1d_5 ( (None, 100)               0         
_________________________________________________________________
dense_4 (Dense)              (None, 5)                 505       
=================================================================
Total params: 200,505
Trainable params: 200,505
Non-trainable params: 0
_________________________________________________________________
None
各层说明:

(1)嵌入层:

目的是减小矩阵大小,把onehot编码得到的长度过大的矩阵进行缩小,把编码后的稀疏矩阵变稠密具体说明可以理解为选择output_dim个基矢分别表示这些词参数详解


(2)池化层(上例直接平均降维的池化层也可以看作全连接层的一部分叭?):

目的是消除样本中的词间差异,让词向量直接代表样本参数详解

(3)全连接层:

将结果直接变为(样本数,特征数)的形式&附带一个激活函数参数详解

对于分类函数来说全连接要得到分类结果对于概率,从而激活函数一般用softmax来实现到[0,1]区间的映射

(4)compile:配置训练

关于metrics使用的指标

part 2:具体操作

下载:pip install fasttext

就很坑…自己电脑上安装的时候要vc c++(然后我咕掉了hhhhh)

import pandas as pd
from sklearn.metrics import f1_score

# 转换为FastText需要的格式
train_df = pd.read_csv('../input/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

part2*: 调参

k-fold基于验证集结果调参
主要还是lr:学习率,wordNgram:N-gram的值,epoch等参数的调试

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值