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]中。