#nlp #corpus #parser #treebank #ptb

ptb-reader

简单解析合并的宾夕法尼亚树库格式

8 次重大发布

使用旧的 Rust 2015

0.9.1 2017年5月8日
0.8.0 2017年5月5日
0.5.0 2017年3月13日

#11 in #corpus

21 每月下载量

BSD-3-Clause

26KB
451

ptb-reader

自然语言处理中的语法工作始于能够读取标准语料库,如宾夕法尼亚树库。本软件包能够解析免费样本和完整PTB华尔街日报部分的合并(即句法结构和词性标注)文件。

数据类型

解析器的输出是一个 Vec<PTBTree>,其中 PTBTree 由以下定义

pub enum PTBTree {
    InnerNode {
        label: String,
        children: Vec<PTBTree>
    },
    TerminalNode {
        label: String
    }
}

PTBTree 实现了 Display 特性,显示 PTB 标记的表示法。它还支持 From/Into String,生成树的顶层(即所有终端的连接)。

示例用法

解析整个 PTB 样本

let all_trees: Vec<PTBTree> = ptb_reader::parse_ptb_dir("/home/sjm/documents/Uni/penn-treebank-sample/treebank/combined/");

解析并处理单个树

let s: String = "((S (NNP John) (VP (VBD saw) (NNP Mary))))";
let t: PTBTree = 
    PTBTree::InnerNode{ label: "S".to_string(), children: vec![
        PTBTree::InnerNode{ label: "NNP".to_string(), children: vec![
            PTBTree::TerminalNode{ label: "John".to_string() }
        ] },
        PTBTree::InnerNode{ label: "VP".to_string(), children: vec![
            PTBTree::InnerNode{ label: "VBD".to_string(), children: vec![
                PTBTree::TerminalNode{ label: "saw".to_string() }
            ] },
            PTBTree::InnerNode{ label: "NNP".to_string(), children: vec![
                PTBTree::TerminalNode{ label: "Mary".to_string() }
            ] }
        ] }
    ] }
;
assert_eq!(parse_ptbtree(s).unwrap(), t);
assert_eq!(t.render(), s);
assert_eq!(t.front(), "John saw Mary");

移除谓词-论元标注

let s: &str      = "((S (NNP     John) (VP            (VBD saw) (NNP Mary)              )))";
let s_pred: &str = "((S (NNP-SBJ John) (VP (NP *T*-1) (VBD saw) (NNP Mary) (-NONE- nada))))";

let mut t = parse_ptbtree(s_pred).unwrap();
t.strip_all_predicate_annotations();
assert_eq!(t, parse_ptbtree(s).unwrap())

依赖项

~1.5MB
~23K SLoC