【问题标题】:Given a parse tree, how can I extract words to create a sentence?给定一个解析树,我如何提取单词来创建一个句子?
【发布时间】:2017-03-19 08:01:12
【问题描述】:

假设我有以下一组输入和输出:

输入:

A full sentence: (S (NP (NNP James)) (VP (VBZ is) (NP (NP (DT a) (NN boy)) (VP (
VBG eating) (NP (NNS sausages)))))) 

输出:

James is a boy eating sausages 

输入:(NNS Sausages)

输出:Sausages

我如何构建一个 Java 程序来从每个单词中提取单词以创建一个句子? (不使用外部库)

【问题讨论】:

    标签: java tree parse-tree


    【解决方案1】:

    您可以使用.*?(\\w+)(?:\\)+)

    (\\w+)(?:\\)+):捕获一个或多个\\w,然后捕获一个或多个)

    其中 \\w 表示 [a-zA-Z0-9_] ,您也可以使用 ([a-zA-Z]+)(?:\\)+) 仅捕获单词

    注意:使用.*?(\\w+)\\)+ 使其更高效,正如shmosel in comments 所指出的那样

    JAVA 演示

        String s="(S (NP (NNP James)) (VP (VBZ is) (NP (NP (DT a) (NN boy)) (VP (VBG eating) (NP (NNS sausages))))))";
        System.out.println(s.replaceAll(".*?(\\w+)(?:\\)+)", "$1 ").trim());
    

    输出:

    James is a boy eating sausages
    

    演示:

    const regex = /.*?(\w+)(?:\)+)/g;
    const str = `(S (NP (NNP James)) (VP (VBZ is) (NP (NP (DT a) (NN boy)) (VP (VBG eating) (NP (NNS sausages))))))
    (NNS Sausages)`;
    const subst = `$1 `;
    
    const result = str.replace(regex, subst);
    
    console.log(result);

    【讨论】:

    • 第二组好像没必要。
    • @shmosel 是的,我同意你的观点,OP 也可以使用.*?(\\w+)\\)+,谢谢 :)
    • 演示在我看来不像 Java (const??)
    • @SharonBenAsher 是的,它不是,但显示的代码在 java 中,replaceAll,不能在这里运行 java 代码:P
    • 太棒了,我正在尝试这样做,但是你做得更快,我想我需要阅读更多关于正则表达式的内容 =) 太棒了
    【解决方案2】:

    鉴于您的问题被标记为解析树,通常的方法是:

    1. 定义语言的语法。构造一个解析器 语法。
    2. 如果您执意不使用第 3 部分库,那么您 将不得不手动编写递归下降解析器。
    3. 将表达式解析为解析树。
    4. 递归遍历树并提取每个单词标记。

    每个步骤本身都相对简单。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多