如何在语法中以JSON格式获得依赖树



我试图从syntaxnet中获取以json格式获得依赖项树,但是我从示例中获得的只是一个句子对象,该对象没有提供访问者来访问解析对象甚至通过列出的项目。

当我从tensorflow/syntaxnet提供的docker文件中运行示例时,我得到的如下

text: "Alex saw Bob"
token {
  word: "Alex"
  start: 0
  end: 3
  head: 1
  tag: "attribute { name: "Number" value: "Sing" } attribute { name: "fPOS" value: "PROPN++NNP" } "
  category: ""
  label: "nsubj"
  break_level: NO_BREAK
}
token {
  word: "saw"
  start: 5
  end: 7
  tag: "attribute { name: "Mood" value: "Ind" } attribute { name: "Tense" value: "Past" } attribute { name: "VerbForm" value: "Fin" } attribute { name: "fPOS" value: "VERB++VBD" } "
  category: ""
  label: "root"
  break_level: SPACE_BREAK
}
token {
  word: "Bob"
  start: 9
  end: 11
  head: 1
  tag: "attribute { name: "Number" value: "Sing" } attribute { name: "fPOS" value: "PROPN++NNP" } "
  category: ""
  label: "parataxis"
  break_level: SPACE_BREAK
}

此对象的类类型为 class'stytaxnet.sentence_pb2.sence',其中自我没有任何文档。

我需要能够以编程方式访问上述输出。

在此问题中可以看出,它以字符串格式打印出表,没有给我一个编程响应。

如何获得响应而不是打印输出。还是我应该为此输出编写解析器。?

tl; dr最后的代码...

句子对象是句子_pb2.setnence类的实例,该类别是从Protobuf定义文件(特别是句子)生成的。这意味着,如果您查看句子。因此,您有一个称为"标签"的字段,它是一个字符串,一个称为"标签"的字段,它是一个字符串,一个名为Head的字段,它是整数等。从理论上讲,如果您只使用Python的内置功能转换为JSON,则应该有效,但是由于Protobuf类是生成运行时生成的元类别,它们可能会产生一些不希望的结果。

所以我所做的是首先创建了一个带有我想要的信息的地图对象,然后将其转换为JSON:

def parse_attributes(attributes):
    matches = attribute_expression.findall(attributes)
    return {k: v for k, v in matches}
def token_to_dict(token):
    def extract_pos(fpos):
        i = fpos.find("++")
        if i == -1:
            return fpos, "<error>"
        else:
            return fpos[:i], fpos[i + 2:]
    attributes = parse_attributes(token.tag)
    if "fPOS" not in attributes:
        logging.warn("token {} has no fPos attribute".format(token.word))
        logging.warn("attributes are: {}".format(attributes))
        fpos = ""
    else:
        fpos = attributes["fPOS"]
    upos, xpos = extract_pos(fpos)
    return {
        'word': token.word,
        'start': token.start,
        'end': token.end,
        'head': token.head,
        'features': parse_attributes(token.tag),
        'tag': token.tag,
        'deprel': token.label,
        'upos': upos,
        'xpos': xpos
    }
def sentence_to_dict(anno):
    return {
        'text': anno.text,
        'tokens': [token_to_dict(token) for token in anno.token]
    }

如果您在句子对象上调用stone_to_dict,您将获得一张不错的地图,然后可以将其序列化为JSON。

最新更新