将文档表示成图的方法
针对句子级别的任务构建图很容易,一般都是根据句子的依存句法树来构建,但是像文档级别的任务,比如文档分类任务,想要使用很火的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
one−hot向量。所以输入图网络的特征是
N
∗
N
N*N
N∗N的矩阵。
这篇论文使用的图网络是比较经典的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 V∗V的矩阵, V V V是corpus的词表。如果文档 d d d的两个单词之间有边,就从这个全局的 V ∗ V V*V V∗V的矩阵中读出对于的权值。最后特定于文档 d d d的图就构建好了。
图中每个节点的特征是对应的embedding,比如glove或者word2vec等。是可以被训练的。
githhub地址
这种构建图的方法也有缺点:
- 边的参数是全局的共享的,也就是不同的文档中,两个单词的边的权值是一样的,这种假设明显太强了,在一定程度上忽略了文档中单词的上下文语义。
- 由于边的参数是全局共享的,对于测试集也不友好。
Every Document Owns Its Structure: Inductive Text Classification via
Graph Neural Networks, ACL, 2020
这篇论文也是针对文档分类任务,构建的图也是text level的,与上面的不同的是,针对每篇文档都构建一个词表,图的节点就是词表,两个单词之间是否有边是通过上面的滑动窗口的方法判断的。每个节点的特征也是用embedding初始化。
github地址
最后发现3篇论文使用的数据集都不大,并没有使用经典的大一点的数据集比如yelp_review,yahoo_answers等,说明将文档转换为图结构还是存在一定的效率问题,后期如何将文档高效的表示成图,从而应用在大数据集上是一个思考的问题。