常见文本分类方法

TF-IDF

fastText

fastText 是一个词向量计算和文本分类工具。一般情况下,使用 fastText 进行文本分类的同时也会产生词的 embedding ,即 embedding 是 fastText 分类的产物。

n-gram字符级别

word2vec 把语料库中的每个单词当成原子的,会为每个单词生成一个向量。这样会忽略单词内部的形态特征。比如:apple 和 apples。为了克服这个问题,fastText 使用了字符级别的 n-grams 来表示一个单词。对于 单词 “apple”, 其 trigram 为:

其中 “<”表示前缀,”>”表示后缀。
好处:

  1. 对于低频词生成的词向量效果会更好。因为它们的 n-gram 可以和其他词共享。
  2. 对于训练词库之外的单词,仍然可以构建它们的词向量。可以叠加它们的字符级 n-gram 向量。

    模型架构

    文本分类 - 图1
    和 CBOW 一样,fastText 模型也只有三层:输入层、隐含层、输出层(Hierarchical Softmax),输入都是多个经向量表示的单词,输出都是一个特定的 target,隐含层都是对多个词向量的叠加平均。
    不同的是,CBOW 的输入是目标单词的上下文,fastText 的输入是多个单词及其 n-gram 特征,这些特征用来表示单个文档;CBOW 的输入单词被 onehot 编码过,fastText 的输入特征是被 embedding 过;CBOW 的输出是目标词汇,fastText 的输出是文档对应的类标。
    fastText在输入时,将单词的字符级别的n-gram向量作为额外的特征;在输出时,fastText采用了分层Softmax,大大降低了模型训练时间。
    fastText的核心思想就是:将整篇文档的词及n-gram向量叠加平均得到文档向量,然后使用文档向量做softmax多分类。
    缺点:fastText 中的网络结果是完全没有考虑词序信息的。

    TextCNN

    文本分类 - 图2
    卷积神经网络的核心思想是捕捉局部特征,对于文本来说,局部特征就是由若干单词组成的滑动窗口,类似于N-gram。卷积神经网络的优势在于能够自动地对N-gram特征进行组合和筛选,获得不同抽象层次的语义信息。

  3. 第一层为输入层。输入层是一个 [公式] 的矩阵,其中 [公式] 为一个句子中的单词数, [公式] 是每个词对应的词向量的维度。

  4. CNN包括卷积和池化。是用来不同大小的卷积核特征(2,3,4)。由于卷积核和word embedding的宽度一致,一个卷积核对于一个sentence,卷积后得到的结果是一个vector,其shape=(sentence_len - filter_window_size + 1, 1),那么,在经过max-pooling操作后得到的就是一个Scalar。
  5. 得到文本句子的向量表示之后接一个全连接层,并使用Softmax激活函数输出每个类别的概率。

缺点:CNN有个最大问题是固定 filter_size 的视野,一方面无法建模更长的序列信息,另一方面 filter_size 的超参调节也很繁琐。
文本分类 - 图3

TextRNN

文本分类 - 图4
Bi-directional RNN(实际使用的是双向LSTM)从某种意义上可以理解为可以捕获变长且双向的的 “n-gram” 信息。

TextRNN + Attention

文本分类 - 图5
CNN和RNN用在文本分类任务中尽管效果显著,但都有一个不足的地方就是不够直观,可解释性不好,特别是在分析badcase时候感受尤其深刻。而注意力(Attention)机制是自然语言处理领域一个常用的建模长时间记忆机制,能够很直观的给出每个词对结果的贡献。
加入Attention之后最大的好处自然是能够直观的解释各个句子和词对分类类别的重要性。

TextRCNN(TextRNN + CNN)

文本分类 - 图6