1

我有这个词组树

(ROOT (S (NP (ADJP (JJ Bahasa)) (NN daerah) (NN merupakan) (NN bahasa) (NN yang) (NN digunakan) (NN dalam) (NN bahasa) (NN pergaulan) (NN sehari-hari) (NN di) (NN suatu) (NN daerah) (NNP tertentu)) (VP (VBZ .))))

我需要转换成数组,像这样

S -> NP VP
NP -> ADJP NN NN NN NN NN NN NN NN NN NN NN NN NN
ADJP -> JJ
VP -> VBZ

等....

有什么算法可以转换它们吗?

4

2 回答 2

2

您实际上可以确切地看到需要做什么。

每个左括号都是一个子元素,每个右括号都是该元素的子元素的结尾。

我不确定您要做什么,但这很简单...

阅读此内容以获取更多信息:http ://en.wikipedia.org/wiki/Parse_tree

于 2012-05-07T08:31:11.617 回答
1

这是一些基于库pymeta2的 Python 代码,用于解析这种类型的树。

import pymeta.grammar

def f(name,E):
    print name+' -> '+' '.join(E)
    return name

G=pymeta.grammar.OMeta.makeGrammar("""
name = spaces ('.'|letterOrDigit|'-')+:n -> ''.join(n)
expr = token("(") name:p expr+:e token(")") -> f(p,e)
     | token("(") name:p name:e token(")") -> p
""",{'f':f})

s="(ROOT (S (NP (ADJP (JJ Bahasa)) (NN daerah) (NN merupakan) (NN bahasa) (NN yang) (NN digunakan) (NN dalam) (NN bahasa) (NN pergaulan) (NN sehari-hari) (NN di) (NN suatu) (NN daerah) (NNP tertentu)) (VP (VBZ .))))"

G(s).apply("expr")

运行此代码的输出是:

ADJP -> JJ
NP -> ADJP NN NN NN NN NN NN NN NN NN NN NN NN NNP
VP -> VBZ
S -> NP VP
ROOT -> S

(我必须在 (JJ Bahasa) 之后添加一个额外的括号才能完成这项工作。我怀疑这是问题中的错字?)

于 2012-05-07T20:44:14.297 回答