添加自己的訓練政策模型

pydial的主要目標便是提供一個通用的語言統計對話模型,開發者可以方便的向其中添加集成和測試自己的模型.pydial位主要模塊都設計了明確定義的通用接口,爲了瞭解這個,我們首先來看一下pydial的整體框架.

如上所示,多域功能的對話模型主要使用主題跟蹤器來進行實現,主題跟蹤器來識別用戶輸入的主題,可以保證切換,從上一個對話領域切換到用戶當前想要的對話領域,由上圖可以看出,主題追蹤器在整個對話系統中扮演了一個核心的角色,其觸發了對用戶的語義理解,對話狀態的追蹤,從而影響到了最核心的對話決策部分,繼而轉到語言生成即輸出部分,完成了整個的一個對話流程.

生成新的模塊:

爲了便於集成你自己的模塊,pydial爲模塊都提供了簡單的接口類.如下:

  • Topic Tracking: topictracking.RuleTopicTrackers.TopicTrackerInterface
  • Semantic Belief Tracking (from words to belief state): semanticbelieftracking.SemanticBeliefTrackingManager.SemanticBeliefTracker
  • Semantic Decoding (from words to semantics): semi.SemI.SemI
  • Belief Tracking (from semantics to belief state): belieftracking.BeliefTracker.BeliefTracker
  • Policy: policy.Policy.Policy
  • Language Generation: semo.SemOManager.SemO
  • Evaluation: EvaluationManager.Evaluator

所有這些模塊都被同樣的模塊組織結構定義,pydial的主要目標是提供一個多領域的對話平臺,一個叫做管理器(manager)的概念將被介紹,它使用了類似詞典的結構處理方式來處理每個模塊的域實例.實現一個未在pydial中實現的模型如下所示:

 

爲了實現你自己的模型,查看基類中的一些方法,並繼承基類來重寫你自己需要實現的方法,爲了使用你自己定義的模型,需要在配置文件中定義和加載對應的模型.config/dynamically_load_modules.cfg中便是動態加載模型的例子.

應用舉例:

我們創建了一個新的parrotPolicy決策類,它簡單的接受用戶的操作並作爲用戶的操作返回,就像鸚鵡學舌一般,爲此,第一步創建一個繼承自policy的基類.

from policy import Policy

class Parrot(Policy.Policy):
    def nextAction(self, beliefstate):
        pass

爲了實現用戶的行爲,我們必須從信念狀態中提取最後一個用戶狀態信息,稍微做一下解析,然後返回它。在開始時,我們默認使用hello() system act。
 

from policy import Policy
import re

class Parrot(Policy.Policy):  
    def nextAction(self, beliefstate):
        userActs = beliefstate['userActs']
        if userActs is not None:
            systemAct = userActs[0][0]
        else:
            systemAct = "hello()"
        
        return systemAct    

在配置文件中進行加載和預處理.

用戶意圖:

用戶行爲表示爲意圖的字符串、槽或槽值對的列表。下面是系統當前使用的系統操作列表

  • request(slot)
  • inform(slot=value)
  • confirm(slot=value)
  • confreq(slot=value,slot)
  • affirm()
  • hello()
  • negate()
  • repeat()
  • requalts()
  • bye()         

信念狀態封裝在一個對話的對象當中,在內部,每個域的信念都使用以下的字典結構建模.

{'beliefs': {u'informable_slot1': {'**NONE**': 1.0,
                       u'value1': 0.0,
                       u'value2': 0.0,
                       ...  },
             u'informable_slot2': {'**NONE**': 1.0,
                       u'value1': 0.0,
                       u'value2': 0.0,
                       ...  },
             ...
             'discourseAct': {u'ack': 0.0,
                              'bye': 0.0,
                              u'hello': 0.0,
                              u'none': 1.0,
                              u'repeat': 0.0,
                              u'silence': 0.0,
                              u'thankyou': 0.0},
             'method': {u'byalternatives': 0.0,
                        u'byconstraints': 0.5,
                        u'byname': 0.0,
                        u'finished': 0.0,
                        u'none': 0.5,
                        u'restart': 0.0},
             'requested': {u'infromable_slot1': 0.0,
                           u'informable_slot2': 0.0,
                           ...
                           u'requestable_slot1': 0.0,
                           u'requestable_slot2': 0.0,
                           ...
                           u'name': 0.0}},
 'userActs': [('hypo1', 0.8),('hypo2',0.1),...]}

進行輸出.

信息插槽、話語、方法和請求字段的實際值直接從本體文件中提取。而informable slot、discourse seact和method都代表了一個概率分佈,即每個字段的數值總和爲1,這對於被請求的字段是不同的。在這裏,每個數值都可能在[0,1]中。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章