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

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

被折叠的 条评论
为什么被折叠?



