26

我有一棵树,特别是一棵解析树,节点上有标签,叶子上有字符串/单词。我想将这棵树作为输入传递给神经网络,同时保留其结构。

当前方法假设我们有一些单词字典 w1,w2.....wn 将出现在解析树中的单词编码为 n 维二进制向量,只要解析树中的单词是 wi,就会在第 i 个位置显示 1

现在树结构怎么样?对于出现在叶子上的 n 个单词,大约有 2^n 个可能的父标签因此我们不能设置输入单词的最大长度,然后只是蛮力枚举所有树。

现在我能想到的就是通过选择叶子的直接父级来近似树。这也可以用一个二进制向量来表示,其维度等于不同类型标签的数量——我想大约是 100 个。我的输入是二维的。第一个只是单词的向量表示,第二个是其父标签的向量表示

除了这会丢失句子中的很多结构。有解决这个问题的标准/更好的方法吗?

4

3 回答 3

5

你需要一个递归神经网络。请参阅此存储库以获取示例实现:https ://github.com/erickrf/treernn

递归(非递归)神经网络的原理如图所示。

它学习每个叶子的表示,然后向上通过父母,最终构建整个结构的表示。 在此处输入图像描述

于 2018-01-15T14:20:34.097 回答
2
  1. 编码树结构:想想循环神经网络,你有一个可以通过 for 循环构造的链。但在这里你有一棵树。所以你需要用分支做一些循环。递归函数调用可能需要一些 Python 开销。我建议您使用“运行定义”框架(如 Chainer 、 PyTorch )构建神经网络减少开销。因为您的树可能必须为每个数据样本重建不同的,这需要重建计算图。阅读来自树结构长短期记忆网络的改进语义表示,这里有原始的 Torch7 实现和PyTorch 实现,你可能有一些理想。

  2. 对于在节点处编码标签,我认为最简单的方法是像使用 word 一样对它们进行编码。例如,一个节点数据是[词向量][标签向量]。如果节点是叶子,你有词,但可能没有标签(你没有说叶子节点有标签),所以叶子数据表示是[词][零向量](或[词向量][标签向量] )。没有word=>[零向量][标签向量]的case内部节点。然后,您有内部节点和叶子具有相同的数据表示向量维度。您可以平等对待他们(或不:3)

于 2017-07-01T15:36:01.480 回答
2

使用 (i) 将其连接到根节点的节点序列和 (ii) 在它之前的叶节点的编码对每个叶节点进行编码。

对于 (i),使用输入为标签的循环网络。为这个 RNN 提供根标签、二级标签……,最后是父标签(或它们的嵌入)。将此与叶子本身(单词或其嵌入)结合起来。现在,您有一个描述叶子及其祖先的特征。

对于 (ii),也使用循环网络!只需从计算最左边叶子的上述特征开始,然后将其提供给第二个 RNN。对从左到右移动的每片叶子继续这样做。在每一步,第二个 RNN 都会为您提供一个向量,该向量表示当前叶子及其祖先、之前的叶子及其祖先。

或者,(ii)双向执行,您将获得包含整棵树的叶子特征!

于 2017-09-26T00:28:25.957 回答