如何绘制自然语言的具有平行叶子的句法树?

如何绘制自然语言的具有平行叶子的句法树?

我需要为自然语言绘制句法树。问题是我需要所有叶子都是平行的。其他节点如何相对于同一深度的其他节点进行排序并不重要。在实际使用中,你会在纸张底部放一个句子,横向和横向都很好。根节点在另一侧,因此树使用整个页面。有没有可以做到这一点的软件包的建议?

编辑:我认为,只要可以使用整个页面,任何树形包都可以使用。

答案1

这不是语言文献中常见的树的表示方式,因此没有一个常规的树绘制包(qtreetikz-qtree) 默认执行此操作。

具体来说,语言学文献中绘制树的方式是,终端节点是不是画在同一水平线上(即单词沿着基线,树从那里向上生长)。因此,以一棵简单的树为例约翰认为他爱玛丽,我们可以使用来tikz-qtree轻松绘制树:

\documentclass{article}
\usepackage{tikz-qtree,tikz-qtree-compat}
\begin{document}
\Tree [.S [.NP John ] 
          [.VP [.V\0 thinks ] 
               [.S [.NP he ] 
                   [.VP [.V\0 loves ]  [.NP Mary ]]]]]
\end{document}

qtree 版本

请注意,树的终端节点不与基线沿线的其他终端节点对齐。这在语言学文献中很正常,尽管在教学生如何手工绘制树时,我们经常从将所有单词排列在底部开始(即与树中最低的单词处于同一级别)。

2023 年更新

这个答案是在 2011 年写的,当时forest还不存在。对于大多数用途来说,forest这是目前最好的软件包,而且正如另一个答案所示,在基线上对齐节点很容易。我推荐那个答案反而。

一种新的解决方案tikz-qtree

从 1.2 版开始,tikz-qtree现在有一种简单的方法可以让终端节点排列起来,尽管选择值需要一些手动计算。键frontier允许您使用参数指定终端节点的位置distance from root。因此,在上面的例子中,我们可以将其设置distance from root为 5 厘米,终端节点将排列起来。这个值需要为每棵树单独更改。

\documentclass{article}
\usepackage{tikz-qtree,tikz-qtree-compat}
\begin{document}
\begin{tikzpicture}[frontier/.style={distance from root=5cm}]
\Tree [.S [.NP John ] 
          [.VP [.V\0 thinks ] 
               [.S [.NP he ] 
                   [.VP [.V\0 loves ]  [.NP Mary ]]]]]
\end{tikzpicture}
\end{document}

代码输出

另一个简单的解决方案

作为上述关键解决方案的替代方案frontier公斤使用常规 TikZ 方法的非常简单的答案也可以使用来应用tikz-qtree。 所需的只是在树中插入额外的括号以制作虚拟节点。 因此,您只需执行以下操作即可:

\begin{tikzpicture}
 \Tree [.S [.NP [[[ John ]]] ]
          [.VP [.V\0 [[ thinks ]] ] 
               [.S [.NP [ he ] ] 
                   [.VP [.V\0 loves ]  [.NP Mary ]]]]]
\end{tikzpicture}

修订树

上面的树和这棵树之间的唯一区别是,终端被括在了额外的括号中:约翰,两个一个。对于偶尔出现的树,这可能是实现您想要的一种简单方法。

使用一个旧的解决方案xyling

xyling包也有办法做到这一点,尽管它的树绘制输入方法要麻烦得多。以下是使用格式化的同一棵树xyling:(我把这部分答案留给后人;tikz-qtree答案真的要简单得多。)

% compile with latex + dvips 
\documentclass{article}
\usepackage{xyling}
\begin{document}
\Tree{  &       \K{S}\B{dl}\B{dr}\\             
\K{NP}\B{d} &   &   \K{VP}\B{dl}\B{dr}\\            
\B[6]{d}    &   \K{V}\B{d}  &   &   \K{S}\B{dl}\B{dr}\\     
\B[6]{d}    &   \B[6]{d}&   \K{NP}\B{d} &   &   \K{VP}\B{dl}\B{dr}\\    
\B[6]{d}    &   \B[6]{d}&\B[6]{d}   &   \K{V}\B{d}  &   &   \K{NP}\B{d}\\
John        &   thinks  &   he  &       loves   &   &   Mary    }
    

\end{document}

基本上,xyling设置一种表格网格来绘制树。这允许您将所有终端节点放在网格的最下一行,然后在其上方的空单元格中添加显式分支,直至其非终端节点。由于默认分支绘制命令假定节点标签,因此您需要使用该\B命令的可选参数来提高额外分支的起点。值6似乎可以完成足够的工作。

坐标系

xyling使用 Postscript 特殊功能,无法与 一起使用pdflatex,因此您需要使用 编译此文件。latex+dvips+ps2pdf文档解释了如何修改样式文件来更改这一点(我不知道为什么它不是一个包选项。)事实上,鉴于现在大部分包都支持 pdf,因此xy修改样式文件以使用或xy-ling会很简单。pdflatexlatex+dvips

答案2

为了完整性,forest应该包括极其强大的软件包;):

\documentclass[tikz,border=10pt,multi]{standalone}
\usepackage[linguistics]{forest}
\newcommand*\primary{\textsuperscript{0}}
\begin{document}
\begin{forest}
  for tree={
    where n children=0{tier=terminal}{},
  }
  [S
    [NP
      [John
      ]
    ]
    [VP
      [V\primary
        [thinks
        ]
      ]
      [S
        [NP
          [he
          ]
        ]
        [VP
          [V\primary
            [loves
            ]
          ]
          [NP
            [Mary
            ]
          ]
        ]
      ]
    ]
  ]
\end{forest}
\end{document}

tier正在做保持最终节点对齐的工作。where n children=0{}{}正在将其应用于终端节点(没有子节点)。

森林树木

如果您只有早期版本的 Forest(v.2 之前)并且无法更新,则您将需要此代码:

\documentclass[standalone, border=5pt]{standalone}
\usepackage{forest}
\newcommand*\primary{\textsuperscript{0}}
\begin{document}
\begin{forest}
  for tree={
    where n children=0{tier=terminal}{},
    parent anchor=south,
    child anchor=north,
  }
  [S
    [NP
      [John
      ]
    ]
    [VP
      [V\primary
        [thinks
        ]
      ]
      [S
        [NP
          [he
          ]
        ]
        [VP
          [V\primary
            [loves
            ]
          ]
          [NP
            [Mary
            ]
          ]
        ]
      ]
    ]
  ]
\end{forest}
\end{document}

答案3

我建议使用蒂克兹包。请查看文档,第 475 页为“普通树”,第 386 页为“类似思维导图的树”。

答案4

只要您不逐个调整节点高度,这在 tikz 中实际上很容易实现。 (因此,在同一棵树中混合多行和单行节点会破坏这一点)。(参见注释。)只需添加额外的子节点:

\begin{tikzpicture}
[sibling distance=2.5cm,level distance=1.2cm,edge from parent   path={(\tikzparentnode.south) --
(\tikzchildnode.north)}, inner sep=1.5pt]
\node {S}
  child {node {NP}
    child {child {child {child {node {\textit{John}}}}}}}
  child {node {VP}
    child {node {V}
      child {child {child {node {\textit{thinks}}}}}}
    child {node {S}
      child {node {NP}
        child {child {node {\textit{he}}}}}
      child {node {VP}
        child {node {V}
          child {node {\textit{loves}}}}
        child {node {NP}
          child {node {\textit{Mary}}}}}}};
\end{tikzpicture}

相关内容