python - 如何将依赖树的输出解析为扁平结构

标签 python regex string recursion hierarchical-data

好吧,我完全不知所措。我有一些依赖树解析工具的输出,如下所示:

(S 
    (NP 
        (PRP It)
    )
    (VP
        (VBD said)
        (CLAUSE
            (S
                (NP
                    (DT the)
                    (NN figure)
                )
                (VP 
                    (VBD was)
                    (VBN rounded)
                )
            )
        )
    )
    (PUNC .)
)

这些解析输出被保存为纯文本。据我所知,输出基本上是一棵二叉树。我想要的是有一个输出文件,其中每个单词都在一个新行上,并且每个单词都包含与该单词关联的所有标签。一个例子是:

It  S   NP  PRP
said    S   VP
the S   VP  CLAUSE  S   NP  DT
figure  S   VP  CLAUSE  S   NP  NN
was S   VP  CLAUSE  S   VP  VBD
rounded S   VP  CLAUSE  S   VP  VBN
. PUNC  S

如何将此输出解析为我正在寻找的输出?我已经尝试使用 pyparsing 库,并且已经能够将字符串解析为列表的分层列表,但这并不完全符合我的输出需求。

我认为递归在这里可能是一个很好的候选工具,但我不确定如何将它应用于这个问题。对此的任何帮助将不胜感激 - 甚至是伪代码以获得实现想法。

最佳答案

首先,您的输出转换存在错误。

要找到解决方案,需要递归。但你不必发明轮子。有一个名为 pyparsing 的不错的小模块专门用于此类任务。我们可以使用递归正则表达式将该字符串转换为嵌套的列表列表:

from pyparsing import nestedExpr

astring = '''(S 
    (NP 
        (PRP It)
    )
    (VP
        (VBD said)
        (CLAUSE
            (S
                (NP
                    (DT the)
                    (NN figure)
                )
                (VP 
                    (VBD was)
                    (VBN rounded)
                )
            )
        )
    )
    (PUNC .)
)'''

expr = nestedExpr('(', ')')
result = expr.parseString(astring).asList()[0]

print(result)

打印出来:

['S',
 ['NP', ['PRP', 'It']],
 ['VP',
  ['VBD', 'said'],
  ['CLAUSE',
   ['S',
    ['NP', ['DT', 'the'], ['NN', 'figure']],
    ['VP', ['VBD', 'was'], ['VBN', 'rounded']]]]],
 ['PUNC', '.']]

接下来,我们需要编写一个函数来从给定的解析树构建转换。遗憾的是,没有简单的方法可以做到这一点。我们需要自己编写一个硬核递归子程序。这是一种方法。使用第 n 个符号并检索 n+1 个符号的所有转换,然后通过将第 n 个符号附加到这些转换来构建一个新的转换列表。

听起来有点复杂,但也许代码会帮助您理解:

def get_rules(rule_list):
    transitions = []

    if len(rule_list) == 2 and isinstance(rule_list[1], str):
        return [rule_list]


    for rule in rule_list[1:]:
        for r in get_rules(rule):
            transitions.append([rule_list[0]] + r)

    return transitions

这很简单。有一个基本情况,如果您到达终端,您将返回一个单例转换。否则递归地构建转换。

接下来调用这个函数并打印结果:

for r in get_rules(result):
    print(r[-1] + '\t' + '\t'.join(r[:-1]))

输出:

It  S   NP  PRP
said    S   VP  VBD
the S   VP  CLAUSE  S   NP  DT
figure  S   VP  CLAUSE  S   NP  NN
was S   VP  CLAUSE  S   VP  VBD
rounded S   VP  CLAUSE  S   VP  VBN
.   S   PUNC

我之前提到过您的转换表示不正确。您可以与此交叉核对,这是正确的答案。

关于python - 如何将依赖树的输出解析为扁平结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44938187/

相关文章:

python - 如何在Python中从csv文件创建mdb文件?

带有带括号的 header 的 Python DataFrame 错误

python - Python 中的类型检查

c# - 用 Regex.Replace() 替换字符串

regex - 从 CamelCase 字符串中拆分单词

python - 在 python 中有更好的方法吗?我正在尝试解析 Windows 'systeminfo' 命令

javascript - 如何提取正斜杠之间的字符串

java - 使用正则表达式从 json 路径中提取多个标记

字符指针段错误

java - final String s = "Hello World"是否与 String s = "Hello World"相同?