FastText的实践小结

本文探讨了FastText和Word2Vec在文本分类任务上的区别。FastText相较于Word2Vec,能更直接地预测问题,引入n-gram特征以增强语义理解,并通过Hierarchicalsoftmax处理大量类别。文章还讨论了embedding长度和n-gram参数的选择,并提供了一个基于TensorFlow的FastText实现案例。

FastText相对于word2vec,对于问题的预测更直接。word2vec主要是通过上下文信息来学习词语的向量(含有语义特征)表示,fasttext则是在此基础上直接输出目标label。对于文本分类任务,fasttext引入了n-gram特征,可以更好获得句子的语义特征。另外fasttext对于类别数较多时,也采用Hierarchical softmax来降低计算复杂度。

对于fasttext而言,需要考虑以下几个问题:

(1)embedding的长度取多少合适?

实践中embedding为300时在遍历完一遍数据时acc就达到0.9433,embedding为200时遍历完一遍数据acc达到0.9400,可见embedding大些可以更好的学习模型,但是整体效果提升较小。

可见embedding大些可以更好的学习模型,但是数据集太小容易过拟合。

 

(2)n-gram中的n取多少合适?

实践中采用A:jieba的分词结果,B:A+unigram, C:jieba全模式的分词结果+unigram结果表明B比A略好,C表现最差。

此外实验还验证了仅用unigram作为文本输入,其效果也还可以(90%+),比基于词的差了几个百分点。

可见引入n-gram特征需要根据具体样本集进行设置。

 

基于tensorflow的实现(由于实践中的类别共61类,类别较少,模型设计就没采用分层的softmax):

# -*- coding:utf-8 -*-
import os
import numpy as np
import tensorflow as tf
from tensorflow.contrib import slim
from nlp_utils import *

class FastText():
    def __init__(self,
                 num_classes,
                 seq_length,
                 vocab_size,
                 embedding_dim,
                 learning_rate,
                 learning_decay_rate,
                 learning_decay_steps,
                 epoch
                 ):
        self.num_classes = num_classes
        self.seq_length = seq_length
        self.vocab_size = vocab_size
        self.embedding_dim = embedding_dim
        self.learning_rate = learning_rate
        self.learning_decay_rate = learning_decay_rate
        self.learning_decay_steps = learning_decay_steps
        self.epoch = epoch
        self.input_x = tf.placeholder(tf.int32, [None, self.seq_length], name='input_x')
        self.input_y = tf.placeholder(tf.float32, [None, self.num_classes], name='input_y')
        self.d
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值