首页 文章

在prolog中开发语音对话系统的任何教程?

提问于
浏览
1

我试着弄清楚如何实现一个 . 我想在bar的上下文中实现一个人机 spoken dialogue system ,它将来自用户的文本短语作为输入(对给定产品的请求:芯片,可乐,水,咖啡等)并作为输出返回相应的反应(超越行动,但这没关系) .

我希望达到的对话示例:

你好,你好吗?

S:嘿那里 . 我很好 . 请问有什么可以帮你?

U:我想要一份咖啡和一个带果酱的羊角面包“

S:好的 . 在这里你的订单!

你好,谢谢!再见 .

S:也谢谢你 . 祝你有美好的一天!

也就是说,现在我只需要在他们之间就酒吧的订单进行简单的对话 .

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

附:我在互联网上搜索过,但是我发现很多材料让我感到困惑,而且没有一个材料是如何实现对话系统的例子 . 最后我只是希望它作为我的PC上的软件(不是Web应用程序或类似软件) .

谢谢!

1 回答

  • 0

    ELIZA这是典型的聊天机器人 .

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

    非常simple example在SWISH . 这是一些代码在我的HD上睡觉(IIRC,它来自Clocksin - Mellish,移植到SWI-Prolog) .

    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大师编写的,而不是我:)所以,我们应该尝试理解它......这两个子句实现了'incremental dictionary',数据结构不完整 . 它们在刺激和响应之间绑定任意短语,并且是ELIZA这种紧凑编码的关键(原始程序并非如此简单,尽管......) . 要遵循用法,Prolog调试是可能的:

    ?- 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 ? 
    ...
    

    您可以看到关联列表的尾部在退出时是空闲的,因此根据需要扩展了Dictionary . 巧妙地使用不完整的数据结构 . 参见“Prolog的艺术”第15章

相关问题