我要在Prolog中编写一个程序,以便分析文本并识别其中的问题。 给定文本,程序必须识别以疑问标记结尾的所有句子并将它们保存在列表中。然后将对该列表中的每个元素(即每个以&#34结尾的短语;?")进行分析和简化,以确保它们将以" WH-questions"开头。
这是一个例子:
"什么是气候变化? 地球的气候在地质时期不断变化。 [...] 什么是温室效应"? 温室效应是指地球大气层捕获来自太阳的一些能量的方式。 [...]。 问题是:这些如何平衡? "
该清单应包含:["什么是气候变化?","什么是温室效应?","这些如何平衡?"]
使用split_string / 4我获取此列表
L = ["什么是气候变化","地球的......(......)。什么是温室效应" ,"温室(......)。问题是:这些如何平衡?"]
我不知道如何分析并进一步分割列表中的每个元素,以便获得我向您展示的第一个列表。
你能帮助我吗?谢谢:))答案 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]自然语言处理。
基本上,在进一步分析之前,您需要(在某种意义上,以后不会有一百万个问题)首先进行标记化。