word2vec训练成功之后是每一个词对应一个词向量,但是要做文本分类任务,要分类的是一篇一篇的文章,怎么用word2vec表示文章?


深度学习领域常见的做法是直接把一篇文章当成一整个长句子,这个句子经过tokenization之后会变成一串token id组成的序列,然后将这个token输入到词向量构成的Embedding矩阵中,你就得到了一个句子长度X向量维度的矩阵,接下来的事情就简单了——使用RNN,CNN,或者Self-Attention,输入这个矩阵来进行分类任务。

另外还有一种基于表示的方法,就是首先使用mean pooling的方法把句子压成一个向量,或者干脆用doc2vec直接生成文档向量,然后再输入到下游模型中——不过这种方法性能不行,一般用的比较少。

如果不是基于word2vec的话,还有传统BOW文档向量的方法(这个一般搭配传统ML模型使用,跟深度学习关系不大),以及基于BERT进行Fine-tune的方法。如果计算资源够的话一般可以优先考虑用基于BERT或者其他PLM的方法


再经过CNN/RNN+max pooling / mean pooling / attention就可以得到文章的表示了,最后再通过全连接层进行分类


  1. doc2vec。
  2. 提取每篇文本的关键词,然后用这些词的embedding之和(或者平均值)作为这个文本的embedding向量。


提几个方法供参考

  1. 直接在每个词的embedding后接DNN搞成fast text那种的,或者对这些词的embedding进行各种pooling,attention操作
  2. 像bert那样搞一个CLS代表句子向量
  3. 用sentence embedding方法(或者叫Doc2Vec方法),常见的有PV-DM,PV-CBOW,Skip Thought,Quick Thought等等


这个问题可以抽象为长文本的分类问题

至于word2vec的词向量,可以作为以下介绍的深度模型的Embedding初始化向量(如果训练数据足够大,与随机初始化的效果是一致的),我们也不用纠结于这些预训练的词向量有没有用的上,直接使用CBOW的方式加起来然后接MLP等,是上几代的应用方式了,词的表示要结合上下文,否则存在歧义的问题一直无法解决,比如「苹果怎么那么好吃」「苹果怎么那么好用」

我们再来看下长文本与短文本分类的不同。最大的不同在于「长」,长了就表示信息量大,比短句子更难捕捉语义。思路无外乎使用大参数模型(BERT一般处理不超过512)、把长文本变短再使用短文本分类方式

1)大参数的模型,比如BIGBIRD、LongFormer等,缺点是训练速度实在实在是太慢了,优点是表示更精确

2)长文本变短,分两类:一是使用分层模型,第一个模型确定文本中哪些段落重要,第二个模型只用重要段落做短文本分类(BERT的一系列方法都能用上啦);二是两个模型一起训练,比如HAN:Hierarchical Attention Networks for Document Classification

至于哪个效果好?建议先用下2中分层的方法。


这取决于你的分类模型是什么

(假设词向量维度为200,文章词语数量最多100个词)

1、普通全连接神经网路

方案1.1:向量平均(相加)

对文章分词--&>使用word2vec将文章中每个词映射为向量--&>每个词向量的相同维度取平均(相加)--&>整个文章就映射为了一个200维的向量--&>将文章对应的向量送入全连接神经网路

(方案1.1 容易理解、实现简单,但是本质还是词袋模型,忽视了词与词之间的顺序。)

方案1.2:向量拼接

对文章分词--&>使用word2vec将文章中每个词映射为向量--&>从文章首词开始依次将向量拼接起来,若文章长度不足100词(假设只有70个词),则再后面补上30个特殊向量--&>整个文章就映射为了一个20000维的向量--&>将文章对应的向量送入全连接神经网路

2、text-cnn

如图所示,text-cnn的输入就是N*K的矩阵, N对应文章中词语的数量,K就是词的向量维度,word2vec的词向量可以直接作为输入。

3、LSTM

如图所示,每个time step 中的 [公式] 对应文章的每个词,同样可以以200维的向量来表示


推荐阅读:
相关文章