识别以“?”结尾的短语来自 Prolog 中的给定文本

Recognize phrases ending by "?" from a given text in Prolog

我要用 Prolog 编写一个程序来分析文本并识别其中的问题。 给定一段文本,程序必须识别所有以问号结尾的句子并将它们保存在列表中。然后该列表的每个元素(即以“?”结尾的每个短语)将被分析和简化以确保它们以 "WH-questions" 开头。

举个例子:

“什么是气候变化? 随着地质年代的推移,地球的气候一直在不断变化。 [...] "greenhouse effect" 是什么? 温室效应是指地球大气层吸收部分来自太阳的能量的方式。 [...]。 问题是:这些将如何平衡? “

列表应包含:["What is climate change?"、"What is the greenhouse effect ?"、“这些将如何平衡?”]

使用split_string/4我获得了这个列表

L = ["What is climate change", "The planet's (...). What is the greenhouse effect", "The greenhouse (...). The question is: how will these balance out?"]

我不知道如何分析和进一步拆分列表的每个元素,以便得到我给你看的第一个列表。

你能帮帮我吗?谢谢:)

你的方法对任何语言来说都是幼稚的(这是一个很深的主题),所以不要试图重新发明轮子(至少在你知道什么之前重新发明)。 Google 用于 a) 解析然后 b) [Prolog] 自然语言处理。

基本上,在进一步分析之前,您需要(在以后没有一百万个问题的意义上)先标记化。

我建议用 tokenize_atom 的输出馈送 DCG:

?- tokenize_atom('What is climate change?', L).
L = ['What', is, climate, change, ?].

那么就可以抓取文字'What'?之间的所有内容了。

要完成捕获,library(dcg/basics) 有 string//1 可以提供帮助。

示例:

:- use_module(library(dcg/basics)).

wh_capture(P, Cs) :-
    tokenize_atom(P, Tks),
    phrase(wh_capture(Cs), Tks).

wh_capture([]) --> [].
wh_capture([C|Cs]) -->
    ['What'], string(Content), [?], {C=['What'|Content]},
    wh_capture(Cs).
wh_capture(Cs) --> string(_), [.], wh_capture(Cs).

用法:

?- wh_capture('What about you? Phrase to skip. What now?',L).
L = [['What', about, you], ['What', now]] 

string//1 有一个特殊的行为......我通常会在结束序列定界符之后放置一个剪切......像

wh_capture([C|Cs]) -->
    ['What'], string(Content), [?], {C=['What'|Content]},
    !, wh_capture(Cs).