使用 perl 提取特定的输出行

use perl to extract specific output lines

我正在努力创建一个系统来概括输入文本的规则。我正在使用 reVerb 创建我的初始规则集。例如,使用以下命令[*]: $ echo "Bananas are an excellent source of potassium." | ./reverb -q | tr '\t' '\n' | cat -n

要生成以下形式的输出:

    1  stdin
    2  1
    3  Bananas
    4  are an excellent source of
    5  potassium
    6  0
    7  1
    8  1
    9  6
   10  6
   11  7
   12  0.9999999997341693
   13  Bananas are an excellent source of potassium .
   14  NNS VBP DT JJ NN IN NN .
   15  B-NP B-VP B-NP I-NP I-NP I-NP I-NP O
   16  bananas
   17  be source of
   18  potassium

我目前正在将输出传输到一个文件,其中包括前面的白色 space 和上面描述的数字。

我真正想要的只是最后的简单规则,即第 16、17 和 18 行。我一直在尝试创建一个脚本来仅提取该组件并将其放入一个新文件中Prolog 子句的形式,即 be source of(banans, potassium).

这样可行吗? Prolog 规则可以包含这样的白色 space 吗?

我想我无法从混响中获取所有输出,那么提取所需组件的最佳方法是什么?使用 Perl 脚本?或者也许是 sed?

*稍后我计划用更大的输入文件替换它,而不是仅仅用单个句子。

sed -n 'N;N
:cycle
$!{N
   D
   b cycle
   }
s/\(.*\)\n\(.*\)\n\(.*\)/ (,)/p' YourFile

如果数字在输出中而不只是作为参考,将最后一个 sed 操作更改为 s/\^ *[0-9]\{1,\} \{1,\}\(.*\)\n *[0-9]\{1,\} \{1,\}\(.*\)\n *[0-9]\{1,\} \{1,\}\(.*\)/ (,)/p

假设最后 3 行是您 "rules"

关于问题的序言部分:

是的,Prolog facts 可以像这样包含空格,并存在合适的运算符声明。

例如:

:- op(700, fx, be).
:- op(650, fx, source).
:- op(600, fx, of).

示例查询及其结果,让您了解使用此语法创建的术语的形状:

?- write_canonical(be source of(a, b)).
be(source(of(a,b))).

因此,通过这些运算符声明,事实如下:

be source of(a, b).

与声明完全相同:

be(source(of(a,b)).

根据用例和其他定义,创建此类事实(即 be/1 而不是 source_of/2 形式的事实甚至可能是一个优势。如果这是您唯一需要的事实,您可以简单地写:

source_of(a, b).

这不会创建冗余包装器并且更易于使用。

或者,正如 Boris 所建议的,您可以像 'be source of'/2.

那样使用单引号

这看起来很浪费。为什么不让标签保持原样,并使用:

$ echo "Bananas are an excellent source of potassium." \
  | ./reverb -q | cut --fields=16,17,18

是的,您可以在 Prolog 中使用这样的规则。参见。我想在继续之前,您需要了解一些 Prolog。

但是,将字符串设为谓词的有效名称会更容易:

  • be_source_of 用下划线代替空格
  • 'be source of'带空格,并用单引号括起来。

您可能可以使用 awk 对这三个字段执行您想要的操作。例如,参见 awk 中的 printf 命令。或者,您可以直接从 Prolog 再次解析它。我觉得这两个都超出了你当前问题的范围。