извлечение слов из списка prolog

#list #prolog

#Список #prolog

Вопрос:

Мне была поставлена задача синтаксического анализа естественного языка в Prolog. Пока у меня программа работает до некоторой степени. Он выведет предложение, например, если я введу список [the, cat, sat, on, the, mat] , он правильно выведет:

 (noun_phrase(det(the), np2(noun(cat))), verb_phrase(verb(sat), pp(prep(on), noun_phrase(det(the), np2(noun(mat)))))) 
  

Следующая задача, которую я должен выполнить, это извлечь ключевые слова из предложения, т. Е. извлечь существительное из именной фразы, глагол из глагольной фразы и существительное из глагольной фразы, чтобы я мог вернуть список: [cat, sat, mat] . Не мог бы кто-нибудь помочь мне начать, потому что я очень зациклен на этом. Спасибо!

Мой текущий код:

 sentence(S,sentence((NP), (VP))):-
   nl,
np(S, NP, R),
vp(R, VP, []),
write('sentence('), nl, write('   '), write((NP))
      ,nl,write('    '), write((VP)),nl,write('  ').

np([X | S], noun_phrase(det(X), NP2), R) :- det(X), np2(S, NP2, R). np(S, NP, R) :- np2(S, NP, R). np(S, np(NP, PP), R) :- append(X, Y, S), /* Changed here - otherwise possible endless recursion */ pp(Y, PP, R), np(X, NP, []).

np2([X | R], np2(noun(X)), R) :- noun(X). np2([X | S], np2(adj(X), NP), R) :- adj(X), np2(S, NP, R).

pp([X | S], pp(prep(X), NP), R):- prep(X), np(S, NP, R).

vp([X | R], verb_phrase(verb(X)), R) :- /* Changed here - added the third argument */ verb(X). vp([X | S], verb_phrase(verb(X), PP), R) :- verb(X), pp(S, PP, R). vp([X | S], verb_phrase(verb(X), NP), R) :- verb(X), np(S, NP, R).

det(the). det(with). noun(cat). noun(mat). verb(sat). prep(on). adj(big).
  

Ответ №1:

Во-первых, вы должны отметить, что вы используете два разных термина с одинаковым именем и разной арностью (np / 1 и np / 2). Возможно, это не то, что вам нужно, поскольку это может привести к путанице.

Чтобы получить нужный список, вы можете выполнить синтаксический анализ, но теперь для предварительно обработанного предложения, примерно так:

 extract_keywords(L, [N,V,VN]):-
 sentence(L, sentence(NP, verb_phrase(verb(V), pp(_, VP)))),
 noun(NP, N),
 noun(VP, VN).

noun(noun_phrase(_, NP), N):-
  noun(NP, N).
noun(noun(N), N).
noun(np2(_, NP), N):-
  noun(NP, N).
noun(np2(NP), N):-
  noun(NP, N).
  

Предикат extract_keywords анализирует предложение и разделяет словосочетание с существительным и словосочетание с глаголом, затем анализирует вложенные фразы, чтобы получить существительные.

Пример, который я вам привел, несколько слаб в том смысле, что он будет работать только с предложениями такого рода.

Здесь приведены два примера:

 ?- extract_keywords([the, cat, sat, on, the, mat], X).
X = [cat, sat, mat] 

?- extract_keywords([big, cat, sat, on, the, big, mat], X).
X = [cat, sat, mat] 
  

Комментарии:

1. спасибо за помощь! очень признателен, как бы я мог добавить функциональность для извлечения слов из предложения типа [the,strong,soldier,был, убит]

2. Это будет работать как есть, при условии, что вы определите правильные глаголы / существительные / дополнения и т.д.

3. хорошо, у меня возникли проблемы, потому что, похоже, оно читалось только в том случае, если в нем было слово с предлогом (например, ‘on’), чего не было в «[the,strong,soldier,was,slain]». однако я изменил вторую строку на: предложение(L, предложение(NP, verb_phrase(verb(V), (VP)))), теперь это, похоже, работает для обоих входных данных. большое спасибо за помощь, высоко ценится!!!