【问题标题】:make multiple assert basing on pattern matching基于模式匹配进行多个断言
【发布时间】:2015-01-19 23:06:44
【问题描述】:

给定一个字符串的解析树,我的目标是更新我的知识库。

来自一个可变长度的句子,如下所示:

"node 1 is near node 2 that is near node 3 that is near node 4 that..."

在我的表示中变成了句子的解析树表示,例如:

 s(desc(np(noun(node),id(1)),vp(verb(is),prep(near),np(noun(node),id(2),rel_clause(rel(that)...

我想从中提取和断言以下信息:

 edge(1,2),edge(2,3),edge(3,4).

我怎样才能实现这个目标?

我试图用类似的方法处理一些案件

 :- dynamic edge/2.

   extract(T):- T= s(desc(np(noun(node),id(A)),vp(verb(is),prep(near),np(noun(node),id(B)))),
   assert(edge(A,B)).

   extract(T):- T= s(desc(np(noun(node),id(A)),vp(verb(is),prep(near),np(noun(node),id(B),rel_clause(rel(that)...

等 但我想管理潜在的无限句子。

我正在使用 SWI-prolog。

编辑: 我输入的解析树的完整示例:

 desc(np(noun(node), id(1)), vp(verb(is), prep(near), np(noun(node), id(2), 
     rel_clause(rel(that), vp(verb(is), prep(near), np(noun(node), id(3),  
     rel_clause(rel(that), vp(verb(is), prep(near), np(noun(node), id(4))))))))) 

【问题讨论】:

  • 能否请您拼出一个完整的示例,其中包含rel_clause,以便清楚您的结构是什么?
  • 添加了一个可能的输入

标签: prolog


【解决方案1】:

首先要做的是对您的数据提出更有用的描述。一种方法是像这样分解它:

description = desc(subject, verb_part)
subject = np(noun(node), id(A))
verb_part = vp(verb(is), prep(near), object_part)
object_part = np(noun(node), id(B))
object_part = np(noun(node), id(B), rel_part)
rel_part = relcl(rel(that), verb_part)

从这里,您可以看到递归发生的位置并编写符合上述定义的谓词:

% description = desc(subject, verb_part)
% subject = np(noun(node), id(A))
%
extract(desc(np(noun(node), id(A)), VerbPart)) :-
    select_edge(A, VerbPart).

% verb_part = vp(verb(is), prep(near), object_part)
%
select_edge(A, vp(verb(is), prep(near), ObjectPart)) :-
    connect_node(A, ObjectPart).

% object_part = np(noun(node), id(B))
%
connect_node(A, np(noun(node), id(B))) :-
    assertz(edge(A, B)).

% object_part = np(noun(node), id(B), rel_part)
% rel_part = relcl(rel(that), verb_part)
%
connect_node(A, np(noun(node), id(B), relcl(rel(that), VerbPart))) :-
    assertz(edge(A, B)),
    select_edge(B, VerbPart).

执行:

| ?- extract(desc(np(noun(node), id(1)), vp(verb(is), prep(near), np(noun(node), id(2),
     relcl(rel(that), vp(verb(is), prep(near), np(noun(node), id(3),
     relcl(rel(that), vp(verb(is), prep(near), np(noun(node), id(4))))))))))).

true ? ;

no

结果被断言,如果我们列出edge/2 事实可以看出:

| ?- listing(edge).

% file: user_input

edge(1, 2).
edge(2, 3).
edge(3, 4).

yes

您还可以在列表中收集边缘而不是断言它们,并且查询结果为[edge(1,2), edge(2,3), edge(3,4)]

extract(desc(np(noun(node), id(A)), VerbPart), Edges) :-
    select_edge(A, VerbPart, Edges).

select_edge(A, vp(verb(is), prep(near), ObjectPart), Edges) :-
    connect_node(A, ObjectPart, Edges).

connect_node(A, np(noun(node), id(B)), [edge(A,B)]).
connect_node(A, np(noun(node), id(B), relcl(rel(that), VerbPart)), [edge(A,B)|Edges]) :-
    select_edge(B, VerbPart, Edges).

然后使用maplist从结果列表中一次性声明它们:

extract(Description, Edges), maplist(assertz, Edges).

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-22
    • 1970-01-01
    • 2018-03-12
    • 2012-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多