首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有在prolog中开发口语对话系统的教程吗?

有在prolog中开发口语对话系统的教程吗?
EN

Stack Overflow用户
提问于 2016-02-22 14:40:27
回答 1查看 888关注 0票数 1

我是对话管理系统的新手,我试着想办法实现一个系统。我想在bar的上下文中实现一个人机口语对话系统,它以用户的文本短语(对给定产品的请求:薯条、可乐、水、咖啡等)作为输入。并作为输出返回相应的响应(超出操作,但这并不重要)。

我想要谈的一个例子是:

你好,你好吗?

嘿,你好啊。我很好。我能为您做些什么?

我想要一杯咖啡和一杯带果酱的牛角面包。

史:当然可以。这是你的点菜!

U:谢谢!再见。

史:我也谢谢你。祝你今天愉快!

也就是说,现在我只想和他们就酒吧的秩序进行一次简单的对话。

我想知道是否有人知道如何实现对话系统的教程,最好是在Prolog中。无论如何,任何其他语言对我来说都是好的,至少我可以理解这些系统是如何实现的。

附注:我在网上搜索,但是我发现了很多让我困惑的材料,没有一个能成为如何实现对话系统的例子。最后,我只希望它作为一个软件在我的个人电脑(不是一个网络应用程序或类似的)。

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2016-02-22 17:23:03

伊莉莎,这是典型的聊天机器人。

它并不真正“理解”对话的句法结构,但可能是一个好的开始。

一个非常简单例子是在SWISH。这里有一些代码睡在我的HD (IIRC,它来自,移植到SWI)。

代码语言:javascript
复制
eliza :-
    write('? '), read_word_list(Input), eliza(Input), !.

eliza([bye]) :-
    write('Goodbye. I hope I have helped you'), nl.
eliza(Input) :-
    pattern(Stimulus, Response),
    match(Stimulus, Dictionary, Input),
    match(Response, Dictionary, Output),
    reply(Output),
    !, eliza.

match([N|Pattern], Dictionary, Target) :-
    integer(N), lookup(N, Dictionary, LeftTarget),
    append(LeftTarget, RightTarget, Target),
    match(Pattern, Dictionary, RightTarget).
match([Word | Pattern], Dictionary, [Word | Target]) :-
    atom(Word), match(Pattern, Dictionary, Target).
match([], _Dictionary, []).

pattern([i,am,1],[how,long,have,you,been,1,'?']).
pattern([1,you,2,me],[what,makes,you,think,i,2,you,'?']).
pattern([i,like,1],[does,anyone,else,in,your,family,like,1,'?']).
pattern([i,feel,1],[do,you,often,feel,that,way,'?']).
pattern([1,X,2],[can,you,tell,me,more,about,your,X,'?']) :- important(X).
pattern([1],[please,go,on]).

important(father).
important(mother).
important(son).
important(sister).
important(brother).
important(daughter).

reply([Head | Tail]) :-
    write(Head), write(' '), reply(Tail).
reply([]) :- nl.

lookup(Key, [(Key, Value) | _Dict], Value).
lookup(Key, [(Key1, _Val1) | Dictionary], Value) :-
    Key \= Key1, lookup(Key, Dictionary, Value).

read_word_list(Ws) :-
    read_line_to_codes(user_input, Cs),
    atom_codes(A, Cs),
    tokenize_atom(A, Ws).

编辑回复评论..。

好吧,这段代码是由Prolog母版编写的,不是我写的:)所以,我们应该试着理解它.这两个子句实现了具有不完全数据结构的“增量字典”。它们将刺激和响应之间的任意短语绑定在一起,并且是ELIZA这种紧凑编码的关键(虽然最初的程序并不那么简单.)。为了遵循这种用法,Prolog调试是一种可能:

代码语言:javascript
复制
?- leash(-all),spy(lookup).

?- eliza.
? i am happy
 * Call: (12) lookup(1, _G4620, _G4621)
 * Exit: (12) lookup(1, [(1, _G4616)|_G4613], _G4616)
 * Call: (15) lookup(1, [(1, [happy])|_G4613], _G4645)
 * Exit: (15) lookup(1, [(1, [happy])|_G4613], [happy])
how long have you been happy ? 

? i think you hate me
 * Call: (14) lookup(1, _G4821, _G4822)
 * Exit: (14) lookup(1, [(1, _G4817)|_G4814], _G4817)
 * Call: (16) lookup(2, [(1, [i, think])|_G4814], _G4834)
 * Call: (17) lookup(2, _G4814, _G4834)
 * Exit: (17) lookup(2, [(2, _G4829)|_G4826], _G4829)
 * Exit: (16) lookup(2, [(1, [i, think]),  (2, _G4829)|_G4826], _G4829)
 * Call: (19) lookup(2, [(1, [i, think]),  (2, [hate])|_G4826], _G4858)
 * Call: (20) lookup(2, [(2, [hate])|_G4826], _G4858)
 * Exit: (20) lookup(2, [(2, [hate])|_G4826], [hate])
 * Exit: (19) lookup(2, [(1, [i, think]),  (2, [hate])|_G4826], [hate])
what makes you think i hate you ? 
...

您可以看到,关联列表的尾在退出时是免费的,因此字典可以根据需要进行扩展。巧妙地使用不完整的数据结构。见“Prolog的艺术”第15章

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35556433

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档