将文档表示成图的方法

针对句子级别的任务构建图很容易,一般都是根据句子的依存句法树来构建,但是像文档级别的任务,比如文档分类任务,想要使用很火的GNN网络,应该怎么构建图呢?

今天看了4篇论文,都是针对文档级别任务构建图的方法。

corpus级别构建图

Graph Convolutional Networks for Text Classification, AAAI,2019

这篇论文针对文档分类任务,构建了一个corpus level的图,图中的节点总数 N = N d o c + N w o r d N = N_{doc}+N_{word} N=Ndoc+Nword

节点之间是否有边分4中情况:
将文档表示成图的方法

将文档表示成图的方法
O O O开头的节点是文档节点,其他节点是单词节点,黑色边是文档-单词边,灰色边是单词-单词边。

每个节点的特征是对应的 o n e − h o t one-hot onehot向量。所以输入图网络的特征是 N ∗ N N*N NN的矩阵。
这篇论文使用的图网络是比较经典的17年发布的那篇论文的图卷积网络(GCN)。
github上有用pytorch复现的代码。地址

上面方法构建图的缺点很明显:
1.因为存储的是整个corpus的图, 消耗内存大
2. 图是特定于corpus的,所以对新来的文档不友好

text级别构建图

Text Level Graph Neural Network for Text Classification, EMNLP,2019

这篇论文也是针对文档分类任务,不过构建的是text level的图,就是针对每一篇文档都构建一个图。

对于文档 d d d来说,其图 G d G_d Gd的节点数是文档 d d d中去重之后单词的数目,两个单词之间是否有边是通过一个滑动窗口来判断的,比如slide window=3,那么在窗口范围内的单词两两之间就有边。边上的权重是多少呢?这个是一个全局的参数,模型维护一个 V ∗ V V*V VV的矩阵, V V V是corpus的词表。如果文档 d d d的两个单词之间有边,就从这个全局的 V ∗ V V*V VV的矩阵中读出对于的权值。最后特定于文档 d d d的图就构建好了。

图中每个节点的特征是对应的embedding,比如glove或者word2vec等。是可以被训练的。
将文档表示成图的方法
githhub地址

这种构建图的方法也有缺点:

  1. 边的参数是全局的共享的,也就是不同的文档中,两个单词的边的权值是一样的,这种假设明显太强了,在一定程度上忽略了文档中单词的上下文语义。
  2. 由于边的参数是全局共享的,对于测试集也不友好。

Every Document Owns Its Structure: Inductive Text Classification via
Graph Neural Networks, ACL, 2020

这篇论文也是针对文档分类任务,构建的图也是text level的,与上面的不同的是,针对每篇文档都构建一个词表,图的节点就是词表,两个单词之间是否有边是通过上面的滑动窗口的方法判断的。每个节点的特征也是用embedding初始化。
github地址
将文档表示成图的方法
最后发现3篇论文使用的数据集都不大,并没有使用经典的大一点的数据集比如yelp_review,yahoo_answers等,说明将文档转换为图结构还是存在一定的效率问题,后期如何将文档高效的表示成图,从而应用在大数据集上是一个思考的问题。