word2vec作为深度学习模型的输入,怎么用来表示一个文档?
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就可以得到文章的表示了,最后再通过全连接层进行分类
- doc2vec。
- 提取每篇文本的关键词,然后用这些词的embedding之和(或者平均值)作为这个文本的embedding向量。
提几个方法供参考
- 直接在每个词的embedding后接DNN搞成fast text那种的,或者对这些词的embedding进行各种pooling,attention操作
- 像bert那样搞一个CLS代表句子向量
- 用sentence embedding方法(或者叫Doc2Vec方法),常见的有PV-DM,PV-CBOW,Skip Thought,Quick Thought等等
这个问题可以抽象为长文本的分类问题。
至于word2vec的词向量,可以作为以下介绍的深度模型的Embedding初始化向量(如果训练数据足够大,与随机初始化的效果是一致的),我们也不用纠结于这些预训练的词向量有没有用的上,直接使用CBOW的方式加起来然后接MLP等,是上几代的应用方式了,词的表示要结合上下文,否则存在歧义的问题一直无法解决,比如「苹果怎么那么好吃」「苹果怎么那么好用」
我们再来看下长文本与短文本分类的不同。最大的不同在于「长」,长了就表示信息量大,比短句子更难捕捉语义。思路无外乎使用大参数模型(BERT一般处理不超过512)、把长文本变短再使用短文本分类方式
1)大参数的模型,比如BIGBIRD、LongFormer等,缺点是训练速度实在实在是太慢了,优点是表示更精确