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

时间:2015-12-07 17:35:27

标签: prolog tokenize swi-prolog

我要在Prolog中编写一个程序,以便分析文本并识别其中的问题。 给定文本,程序必须识别以疑问标记结尾的所有句子并将它们保存在列表中。然后将对该列表中的每个元素(即每个以&#34结尾的短语;?")进行分析和简化,以确保它们将以" WH-questions"开头。

这是一个例子:

"什么是气候变化? 地球的气候在地质时期不断变化。 [...] 什么是温室效应"? 温室效应是指地球大气层捕获来自太阳的一些能量的方式。 [...]。 问题是:这些如何平衡? "

该清单应包含:["什么是气候变化?","什么是温室效应?","这些如何平衡?"]

使用split_string / 4我获取此列表

L = ["什么是气候变化","地球的......(......)。什么是温室效应" ,"温室(......)。问题是:这些如何平衡?"]

我不知道如何分析并进一步分割列表中的每个元素,以便获得我向您展示的第一个列表。

你能帮助我吗?谢谢:))

2 个答案:

答案 0 :(得分:1)

我建议为DCG提供tokenize_atom的输出:

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

然后,您可以捕获文字'What'?之间的所有内容。

要完成捕获,library(dcg/basics)有一个可以帮助的字符串// 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).

答案 1 :(得分:0)

你的方法对于任何语言都是天真的(这是一个非常深刻的主题),所以不要试图重新发明轮子(至少在你知道重新发明的东西之前)。谷歌a)解析然后b)[Prolog]自然语言处理。

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