專利名稱:使用輸入-輸出示例生成文本操縱程序的制作方法
使用輸入-輸出示例生成文本操縱程序
背景技術:
電子表格系統的用戶可能遇到其中期望將大量的數據從一種形式變換到另一種形式的情況。例如,考慮接收客戶地址的列表的用戶。用戶可能希望將地址變換成統一的格式。對于小的數據集,用戶可以選擇以手動方式執行這種變換。然而,對于較大的數據集,這種手動方法是不可行的。電子表格系統提供各種工具來輔助用戶執行以上所描述的類型的變換。例如,電子表格系統可以提供可以經由菜單、對話框等等訪問的一組特征。這些特征可以用來執行幫助變換數據項的各種功能。然而,典型的用戶可能僅熟悉相對少量的由電子表格系統提供的特征。此外,用戶可能不愿意學習新的特征,在用戶不預期重復使用這樣的特征時尤其如此。
電子表格系統也允許用戶編寫自定義宏程序以執行變換任務。然而,同樣,這種解決方案不完全令人滿意。許多最后用戶很少(或不)具有創建程序的正式經驗。因此,用戶可以被勸阻甚至是嘗試創建宏程序。如果用戶確實做出這樣的嘗試,則用戶可能發現該任務是令人困惑的和和麻煩的,這加劇了總體上很差的用戶體驗。此外,用戶的需要可能隨時間改變,這要求手動修改宏程序。最后,一些電子表格系統允許用戶記錄在將輸入項轉換成合乎需要的輸出項期間執行的一系列操作。這產生映射規則。用戶可以將該映射規則應用到新的數據項以便生成新的輸出項。這種技術被稱為宏記錄。然而,這種技術可能很受限制,造成了僅對非常密切地反映記錄模式中遇到的數據項的那些新的輸入項有用的映射規則。上面的特征和伴隨的潛在缺點是作為說明來呈現的。現有的數據操縱功能可能還遭受其他缺點和挑戰。概述描述用于自動地創建執行數據操縱任務的程序的程序創建系統。該程序創建系統通過接收輸入-輸出示例來操作。每一輸入-輸出示例提供輸入項和對應的輸出項。該程序創建系統使用輸入-輸出示例來自動地生成程序。依靠這種操作方式,程序創建系統允許用戶以直觀的和用戶友好的方式創建數據操縱程序。舉例來說,用戶不需要掌握專門的編程技能就能利用由程序創建系統提供的服務。根據一個說明性的方面,所創建的程序可以包括多個子程序以及多個對應的選擇條件。每一選擇條件選擇特定的子程序并排除其他子程序。當接收到新的輸入項時,程序執行模塊可以使用選擇條件來確定什么子程序適用。然后,執行模塊可以應用該子程序以便基于新的輸入項生成輸出項。根據另一說明性的方面,程序創建系統可以與電子表格功能集成或以另外方式與電子表格功能聯合使用。根據另一說明性的方面,程序創建系統使用由三個部分組成的方法來生成程序。在第一部分中,程序創建系統生成多組候選子程序,對每一個具有輸入項和對應的輸出項的輸入-輸出示例生成一組候選子程序。每一組中的每一候選子程被配置為將與對應的輸入-輸出不例相關聯的輸入項變換成與該輸入_輸出不例相關聯的輸出項。在第二部分中,程序創建系統將各組子程序編組為分區并從相應的分區選擇代表性的子程序。在第三部分中,程序創建系統確定控制將子程序應用到新的輸入項的選擇條件。根據另一說明性的方面,程序創建系統可以將每一組子程序生成為有向無環圖。該圖簡潔地表示與該組中的子程序相關聯的操作。例如,該圖的每一邊可以表示由兩個或更多個子程序執行的操作。根據另一說明性的方面,程序創建系統可以使用包括多個構造器的表達式語言來生成每一子程序,這些構造器包括(但不限于)串接構造器、循環構造器、子字符串提取構造器、匹配構造器等等。根據另一方面,表達式語言將輸入項和輸出項解析成不同類型的令牌。根據另一說明性的方面,用戶可以將新的輸入項的集合饋送到程序執行模塊。程序執行模塊可以使用已經創建的程序來生成新的輸出項。用戶交互模塊允許用戶標識出于任何原因(例如,因為它不正確)被認為是不合乎需要的任何輸出項。然后,用戶可以基于不合乎需要的輸出項制定新的輸入-輸出示例,例如,通過提供該不合乎需要的輸出項的經·校正的對應物。程序創建系統可以對新的輸入-輸出示例操作,以改善程序的性能。根據另一說明性的方面,用戶交互模塊也可以標識出于任何原因(例如,因為兩者均與由用戶提供輸入-輸出示例一致的兩個程序對相同的輸入項提供不同的輸出結果)而被認為是模糊的輸出項。用戶可以提供澄清輸出項的正確形式的反饋,這進而可以被用來改善程序的性能。可以在各種類型的系統、組件、方法、計算機可讀介質、數據結構、制品等等中表現上面的功能。提供本概述以便引入以簡化形式的概念的選集;下面在詳細描述中進一步描述這些概念。本概述不旨在標識所要求保護的本主題的關鍵特征或必要特征,也不預期被用來限制所要求保護的本主題的范圍。附圖簡述圖I示出用于創建基于輸入-輸出示例執行數據操縱任務的程序的程序創建系統以及將該程序應用到新的輸入項的程序執行模塊。圖2示出包括圖I的程序創建系統和程序執行模塊的數據操縱系統。圖3是示出圖2的程序創建系統的一種操作方式的概覽的流程圖。圖4是示出(圖2的)程序創建系統如何使用由三個部分組成的操作來生成程序的流程圖。圖5示出補充圖4的解釋的示例。圖6是示出(圖2的)程序執行模塊如何應用程序來將新的輸入項變換成新的輸出項的流程圖。圖7示出其中用戶已經出于任何原因將(由已創建的程序提供的)輸出項標識為不合乎需要的示例;用戶可以另外基于這一輸出項制定新的輸入-輸出示例以供提交給程序創建系統。圖8是補充圖7的示例的流程圖。圖9示出其中程序創建系統已經標識了模糊的輸入項的示例;用戶可以提供澄清對應的輸出項的正確形式的反饋,由此改善所創建的程序的性能。
圖10是補充圖9的示例的流程圖。圖11示出其中程序創建系統提供用來將輸入項變換成輸出項的程序邏輯的自然語言解釋的示例。圖12是補充圖11的示例的流程圖。圖13示出程序創建系統可以用來生成程序的表達式語言的說明性的構造器。圖14示出程序創建系統如何基于對應的輸入項的匹配部分以及常量字符串項來生成輸出項的不例。圖15示出程序創建系統如何使用循環構造器來生成子程序的示例。·圖16是補充圖14和圖15的不例的流程圖,闡述了為輸入-輸出不例生成一組子程序的一種方式。圖17是更具體地補充圖15的與循環相關的示例的流程圖。圖18示出程序創建系統如何以有向無環圖的形式表示兩個分離的子程序(和關聯的操作路徑)的示例。圖19是示出程序創建系統可以將各組輸入-輸出示例編組在一起的一種說明性方式的流程圖。圖20示出程序創建系統如何為分區生成選擇條件的示例。圖21是補充圖20的示例的流程圖。圖22示出可以用來實現前述各圖中所示出的特征的任何方面的說明性處理功倉泛。貫穿本公開內容和附圖使用相同的附圖標記來引用類似的組件和特征。100系列附圖標記是指最早出現在圖I中的特征,200系列附圖標記是指最早出現在圖2中的特征,300系列附圖標記是指最早出現在圖3中的特征,等等。詳細描述本公開內容是如下組織的。A節描述用于生成用來執行數據操縱任務的程序的程序創建系統的概覽。B節描述用戶可以與程序創建系統交互以改善所創建的程序的性能的各種用戶交互模式。C節描述可以用來表達所創建的程序的說明性表達式語言。D節描述用于為各個輸入-輸出示例創建候選程序組的功能。E節描述用于將各組候選程序編組成各分區的功能。F節描述用于生成用來選擇由程序提供的子程序的選擇條件的功能。并且,G節描述可以用來實現前述各節的特征的任何方面的說明性處理功能。作為正文前的內容,附圖中的一些描述在被不同地稱為功能、模塊、特征、元素等等的一個或多個結構組件的上下文中描述各概念。附圖中所示出的各種組件可以以任何方式實現。在一種情況中,所闡釋的將附圖中各種組件分隔成不同單元可以反映在實際實現中使用對應的不同組件。替代地或另外,附圖中所闡釋的任何單個組件由多個實際組件實現。替代地或另外,附圖中對任何兩個或更多個分離的組件的敘述可以反映由單個實際組件執行的不同功能。依次討論的圖22提供關于附圖中所示出的功能的一種說明性實現的附加細節。其他附圖以流程圖形式描述各概念。在這種形式中,某些操作被描述為構成以某種次序執行的不同的框。這樣的實現是說明性的和非限制性的。在此描述的某些框可以被編組在一起并在單個操作中執行,某些框可以分解成多個組成框,且某些框可以以與在此闡釋的次序不同的次序執行(包括執行各框的并行方式)。流程圖中所示出的框可以以任何方式實現。在術語學方面,短語“被配置為”包括可以構建任何種類的功能以執行所標識的操作的任何方式。術語“邏輯”或“邏輯組件”涵蓋用于執行任務的任何功能。舉例來說,流程圖中所闡釋的每一操作對應于用于執行該操作的邏輯組件。當由計算系統實現時(例如,“計算功能”),邏輯組件表示不管用何種方法實現的作為計算系統的物理部分的物理組件。下列的解釋可以將一個或多個特征標識為“可選的”。這種類型的語句不應被解釋為可以被考慮是可選的特征的詳盡指示;即是說,盡管在本文中不明確地標識,但其他特征可以被看作是可選的。類似地,該解釋可以指示一個或多個特征可以以復數實現(即是說,通過提供多于一個的特征)。這一表述不應被解釋為可以復制的特征的詳盡指示。最后,術語“示例性的”或“說明性的”是指在潛在地多種實現當中的一種實現。A.概覽和說明性使用場景 圖I示出用于基于輸入-輸出示例創建程序的說明性程序創建系統102。每一輸入-輸出示例包括輸入項和對應的輸出項。輸入項可以對應于一個或多個字符串項(例如,一個或多個文本字符串)。輸出項也可以對應于字符串項。更具體地,每一輸出項表不對對應的輸入項執行的某種類型的變換。在一種情況中,變換涉及從輸入項中的文本字符串提取字符的子集和/或串接這樣的子集以便產生輸出項等等。替代地或另外,變換可以涉及格式化類型的改變。圖I呈現上面陳述的概念的示例。在這種情況中,用戶提供包括各列的集合的數據集104。前兩列提供輸入項106。即,第一列提供客戶的名字的列表。第二列提供對應的姓氏的列表。因而,每一輸入項對應于兩個字符串項的元組。前兩列中的輸入字符串項可以被認為是變量(V1, v2)的值。第三列呈現輸出項108。即,第三列表示從第一列和第二列采集的姓名信息。支持將輸入項變換到輸出項的邏輯要求打印(在第一列中的)名字中的首字母、打印句點(.)和空格,并打印(在第二列中的,以其整體)姓氏。在圖I的具體場景中,用戶(或某種其他實體)已經準備一組四個輸入-輸出示例110。即,第一輸入-輸出示例將輸入元組“Jim”和“Smith”映射為“J. Smith”。第二輸入-輸出示例將輸入元組“Sally”和“Jones”映射為“S. Jones”等等。數據集104還包括另一組未經轉換的輸入項112,該輸入項112尚未具有對應的輸出項。用戶可以拒絕以手動方式對這些輸入項112執行變換,這是因為該組輸入項112可能很大;即是說,用戶以手動方式對該組進行操作可能耗費太多時間了。程序創建系統102生成輔助用戶將該組輸入項112變換成合乎需要的輸出形式的程序114。從高級視角看,程序創建系統102基于該組輸入-輸出示例110生成程序114。然后,程序執行模塊116將程序114應用到該組輸入項112。這產生一組新的輸出項。例如,程序114自動地將包括元組“Tom”和“Milano”的輸入項變換成“T. Milano”。在這種情況中,看上去程序創建系統102已經正確地總結了支持該組輸入-輸出示例110中的變換的邏輯。即是說,程序114看上去通過提取第一輸入字符串項的首字母(“T”)、在首字母之后添加句點和空格且然后以其整體提供第二輸入字符串項“Milano”來操作。
在上面的場景中,程序114將m個輸入字符串項轉換成單個輸出項。然而,程序創建系統102可以生成第二程序以便將相同的輸入字符串項(對應于客戶的名字和姓氏)或其子集映射成另一輸出項。例如,圖I示出,數據集104包括可選的第四列,該第四列提供輸出項的附加集合。通過選擇第二列中的姓氏、添加逗號(“,”)、后面跟著空格、后面跟著名字(如它出現在第一列中一樣),形成第四列中的輸出項。通過這種規定,程序創建系統102可以用來將任意組的m個字符 串項映射成任意組的P個輸出字符串項。圖2示出可以利用圖I的程序創建系統102和程序執行模塊116的一個說明性數據操縱系統200。一般地,圖2區分不同的模塊以便清晰地標識由這些相應模塊執行的功能。在一種情況中,這些模塊可以表示不同的物理組件。在其他情況中,這些模塊中的一個或多個可以表示在一個或多個其他模塊內的組件。從高級視角來看,程序創建系統102結合任何類型的數據操縱功能202來操作。在一種情況中,舉例來說,數據操縱功能202表示允許用戶操縱表格形式的數據項的電子表格系統。可以使用的一種電子表格系統是由華盛頓州雷蒙德市的微軟⑧公司提供的微軟Office Excel C1在另一情況中,數據操縱功能202可以表示在文檔編輯應用內的表操縱功倉泛。此外,數據操縱功能202可以與其他功能204交互。例如,數據操縱功能202可以表示與文檔編輯應用交互的電子表格系統。在另一示例中,數據操縱功能202可以表示經由網絡(未示出)與任何類型的網絡資源交互的電子表格系統。例如,數據操縱功能202可以從其他功能204接收數據。替代地或另外,數據操縱功能202可以把數據提供給其他功能 204。在操作中,數據操縱功能202提供允許用戶操縱表格形式的數據項的功能。在用戶與數據操縱功能202交互期間,給定一組輸入-輸出示例,數據操縱功能202可以調用程序創建系統102來提供自動地將輸入項映射成輸出項的程序114。然后,給定新的輸入項,程序執行模塊116可以使用程序114來自動地填充輸出項。圖2將數據操縱功能202和程序創建系統102示出為兩個不同的相應模塊。這表示一種實現可能。在另一情況中,數據操縱功能202可以將程序創建系統102合并為其組件中的一個。同樣地,圖2將程序執行模塊116示出為在數據操縱功能202內的組件。這表示一種實現可能。在另一情況中,數據操縱功能202和程序執行模塊116可以表示兩個不同的模塊。數據操縱功能202 (如所述的,其可以包括電子表格系統)可以以不同的模式來調用程序創建系統102。在一個模式中,用戶可以明確地調用程序創建系統102的功能,例如通過激活在由數據操縱功能202提供的用戶界面呈現內的命令按鈕、菜單項等等。然后,用戶可以標識一組輸入-輸出示例以供用于生成程序114。用戶也可以明確地引導程序執行模塊116將程序114應用到一組未經變換的輸入項。在另一模式中,數據操縱功能202可以包括檢測功能,其檢測用戶正在對輸入項的集合重復執行相同類型的變換以提供對應的輸出項。然后,數據操縱功能202可以基于用戶已經供應的輸入-輸出示例自動地調用程序創建系統102。一旦程序執行模塊116接收到程序114,它可以將程序114應用到其余的未經變換的輸入項。因而,如果用戶正在操作一個表,則程序執行模塊116將在某些時候自動地用經變換的輸出項來填充該表。用戶可以在認為適當的時候啟用或禁用這種特征。在另一模式中,用戶可以使用數據操縱功能202來嘗試性地將有限的一組輸入-輸出項提供給程序創建系統102 (這可能不產生費用,或者這產生減少的費用)。程序創建系統102可以向用戶提供具有對應的受限效用的程序。舉例來說,程序可以具有受限的效用,這是因為它是使用少量的輸入-輸出示例來生成的。此外,可以阻止用戶通過提交附加的輸入-輸出示例改善程序的性能。為了獲得更完整的一套服務,可以要求用戶向管理程序創建系統102的實體支付費用。在另一模式中,用戶可以從諸如另一個人等另一實體接收一組輸入-輸出項。然后,用戶可以與程序創建系統102交互以代表該另一實體創建程序。然后,用戶可以將程序114轉發給該另一實體,以供由該另一實體使用。這些使用模式是代表性的而非詳盡的。數據操縱功能202可以以其他操作模式與程序創建系統102交互。 用戶可以直接地或間接地調用程序創建系統102來完成不同的數據操縱目標。在第一場景中,當存在要將以第一格式表示的信息轉換成以第二格式表示的信息的某種環境專用的需求時,用戶可以調用程序創建系統102。例如,在一種情況中,用戶可以從另一個人(或多人)接收第一格式的信息。基于任何環境專用的考慮,用戶可能希望將這種信息變換成對用戶來說更加可以接受的第二格式。在另一情況中,用戶本身可能已經創建了第一格式的信息。用戶現在可能希望將該信息變換成第二格式。在另一情況中,用戶可能從源應用、數據存儲等等接收到以第一格式表示的信息。用戶可能希望將這種信息轉換成更適用于目標應用、數據存儲等等的第二格式。在第二場景中,出于從得自任何源的輸入項提取一個或多個數據項的主要目的,用戶可以直接地或間接地調用程序創建系統102。在這種場景中,第二格式表示以第一格式表不的信息的子集。在第三場景中,基于與第一場景和第二場景相關聯的原因的組合,用戶可以直接地或間接地調用程序創建系統102。例如,除了從輸入項提取信息之外,用戶可能希望對所提取的信息執行任何類型的變換。用戶也可以向輸出項添加在輸入項中沒有對應物的信
肩、O以上所描述的數據操縱場景是代表性的而非詳盡的。用戶可以調用程序創建系統102來完成其他數據操縱目標。用戶交互模塊206提供界面,用戶或其他實體可以通過該界面與數據操縱功能202和程序創建系統102交互。在一種情況中,舉例來說,用戶交互模塊206可以提供允許用戶與數據操縱功能202和程序創建系統102交互的圖形用戶界面(GUI)。更具體地,在一種情況中,用戶可以通過經由數據操縱功能202提供的界面與程序創建系統102交互;在另一情況中,用戶可以直接地與由程序創建系統102提供的服務交互。圖2將用戶交互模塊206描繪為與數據操縱功能202和程序創建系統102不同的模塊以便便于解釋。這表示一種可能的實現。在另一情況中,數據操縱功能202和/或程序創建系統102可以將用戶交互模塊206合并為其組件。在任何情況中,用戶交互模塊206包括適應與程序創建系統102交互的不同模式的功能。在這些模式中,用戶可以將各種形式的反饋提供給程序創建系統102,這允許程序創建系統102改善程序114的性能。此外,用戶交互模塊206可以包括可選的自然語言交互模塊208,該自然語言交互模塊208可以向用戶提供自然語言消息;一種這樣的類型的消息可以解釋程序114正在用來將輸入項轉換成對應的輸出項的邏輯。B節提供關于這些不同特征的進一步細節。在物理實現方面,圖2中所示出的各種模塊和系統可以由一個或多個計算設備實現。這些計算設備可以位于單個位置,或者可以在分布于多個位置。例如,本地的數據操縱功能202 (例如,電子表格系統)可以與本地的程序創建系統102交互以執行上面概括敘述的功能。在另一情況中,本地的數據操縱功能202可以與遠程網絡實現的程序創建系統102交互以實現在此描述的功能。此外,圖2中所示出的各種模塊和系統可以由單個實體或多個實體管理。任何類型的計算設備可以用來實現圖I中所描述的功能,包括個人計算設備、工 作站計算設備、膝上型計算設備、個人數字助理設備、移動電話設備、游戲控制臺設備、機頂盒設備、服務器計算設備等等。程序創建系統102和數據操縱功能202還可以與一個或多個數據存儲210交互。例如,數據存儲210可以存儲輸入-輸出示例等等。借助于以上介紹,本解釋現在進行到程序創建系統102的說明性組成部分。程序創建系統102包括(或可以在概念上包括)一組模塊。這一節提供這些模塊的概覽。后面各節提供關于這些模塊中的每一個的附加細節。作為概覽,程序創建系統102可以按由三個部分組成的過程來將輸入-輸出示例轉換成程序114。無條件的但可能多次循環的字符串變換模塊212 (簡單起見,稱為子程序生成模塊212)執行第一部分;分區模塊214執行第二部分;并且條件生成模塊216執行第三部分。更具體地,對于每一輸入-輸出示例,子程序生成模塊212生成候選子程序的子集。每一候選子程序能夠將與輸入-輸出不例相關聯的輸入項轉換成與輸入-輸出不例相關聯的輸出項。然而,該組候選程序使用不同的策略來執行這種轉換。D節提供關于子程序生成模塊可以生成候選子程序的方式的附加信息。分區模塊214將輸入-輸出示例編組成各分區。每一分區提供一組一個或多個子程序。在將輸入-輸出示例編組在一起時,分區模塊214使用任何類型的兼容性考慮。根據一種閾值測試,僅當兩組子程序的交集產生非空集時,這意味著這兩組子程序需要具有至少一個共同的子程序,分區模塊214將它們組合在一起。分區模塊214將各分區的共同子程序標識為要用來將新的輸入項轉換成適當的對應輸出項的代表性程序。E節提供關于分區模塊214的操作的此外細節。條件生成模塊216檢查與由分區模塊214標識的分區相關聯的輸入項。條件生成模塊216為每一分區生成所謂的選擇條件(條件i)。當被應用于具體的輸入項時,與具體的分區相關聯的選擇條件被評估為真或假。如果它評估為真,那么,程序執行模塊116應用已經為該分區選擇的代表性的子程序。如果它評估為假,那么,不應用代表性的子程序。相反,某一其他分區的選擇條件將評估為真,且將應用該分區的代表性的程序。即是說,根據一種實現,條件生成模塊216生成選擇條件,以使得對給定輸入項至多有一個選擇條件適用。(如果它們中沒有一個適用,則程序執行模塊116可以應用任何子程序)。F節提供關于條件生成模塊216的操作的附加信息。程序創建系統102基于代表性的程序(Prog1, prog2等等)和對應的選擇條件Ccond1, Cond2等等)生成文本操縱程序114。程序114因此采用switch (切換)操作的形式。如果Cond1評估為真,那么,程序執行模塊116應用Prog1,如果Cond2評估為真,那么,程序執行模塊116應用Prog2,等等。在此所使用的術語“程序”或“已創建的程序”是指可以包括多個子程序部分(例如,progl,PiOg2等等)的包含性的程序。下面為簡單起見,子程序也被稱為P1' P2等等。最終,交集模塊218形成兩組子程序的交集,例如,以便確定這兩個組所共享的子程序。在一種實現中,交集模塊218可以通過將各組中的每一候選子程序看作是離散的實體來執行這一任務。在另一情況中,交集模塊218可以通過形成表示兩組子程序的兩個有向無環圖的交集來形成這兩組的交集。D節提供關于將各組子程序表示 成圖的附加信息。圖3示出呈現圖I的數據操縱系統200的操作的高級描述的過程300。在框302,數據操縱系統200接收一組輸入-輸出示例。每一輸入-輸出示例包括數據項(包括一個或多個輸入字符串項)和輸出項。在框304,數據操縱系統200基于輸入-輸出示例創建程序114。在框304,數據操縱系統200使用程序114來將附加的輸入項(這些輸入項還沒有經過變換)變換成輸出項。在框308,數據操縱系統200基于與用戶的交互可選地修改所創建的程序。圖4示出呈現程序創建系統102產生所創建的程序114的方式的更詳細的描述的過程400。在框402,程序創建系統102接收一組輸入-輸出示例。在框404,程序創建系統102為每一輸入-輸出不例生成一組候選程序。每一候選程序能夠將與輸入-輸出不例相關聯的輸入項轉換成與輸入-輸出示例相關聯的輸出項。在框406,程序創建系統102基于任何類型的兼容性考慮將各組子程序編組成各分區。在框408,程序創建系統102確定將有選擇地調用與各個分區相關聯的代表性的子程序的選擇條件。在框410,程序創建系統102輸出所創建的程序114,所創建的程序114包括該組代表性的程序(在框406中標識)和該組選擇條件(在框408標識)。圖5示出圖4的過程400的操作的示例。在框402’,程序創建系統102接收六個輸入-輸出不例。如上面所說明的,每一輸入-輸出不例i包括輸入項(Ii)和對應的輸出項(Oi)。每一輸入項又可以包括一個或多個輸入字符串項的元組。在框404’,程序創建系統102為每一輸入-輸出不例生成一組子程序。例如,對于輸入-輸出示例1,程序創建系統102將子程序和Pltl標識為能夠將輸入項I1轉換成輸出項Op但是這些程序中的每一個使用不同的策略來執行這一變換。類似地,對于輸入-輸出示例2,程序創建系統102將子程序P3、P1(1、Pn和P12標識為能夠將輸入項I2轉換成輸出項O2,等等。在框406’,程序創建系統102將輸入-輸出示例編組為各分區——在這一場景中,兩個分區被標記“分區I”和“分區2”。選擇各分區,以使得它們各自的組的交集非空。例如,輸入_輸出不例1、2和3的交產生共同子程序Pltl,同時輸入-輸出不例4、5和6的交集產生共同子程序P2(l。因此,程序創建系統102可以將子程序Pltl選擇成表示分區I的子程序,并將子程序P 2(|選擇為表示分區2的子程序。這是因為,使用Pltl,第一分區中的任何輸入項都可以被轉換成其對應的輸出項,并且,使用P2tl,第二分區中的任何輸入項都可以被轉換成其對應的輸出項。E節將詳細說明用來創建分區的兼容性準則。在框408’,程序創建系統102選擇用來表不第一分區的選擇條件Cond1,并選擇用來表示第二分區的選擇條件cond2。第一選擇條件(Cond1)被選擇為使得它對于第一分區中的任何輸入項評估為真并且它對于第二分區中的任何輸入項評估為假。第二選擇條件(Cond2)被選擇為使得它對于第二分區中的任何輸入項評估為真并且它對于第一分區中的任何輸入項評估為假。圖6示出程序執行模塊116使用程序114來操作新的輸入項的方式的概覽。新的輸入項對應于還沒有被轉換成輸出項的一個或多個輸入數據項。在框602,程序執行模塊116接收新的輸入項,例如圖I的示例中的姓名“FrankWillard”。在框604,程序執行模塊116相對于選擇條件來分析輸入項,以確定哪一個選擇條件適用。假定與子程序Prog2相關聯的選擇條件Cond2適用。在框606,程序執行模塊116使用prog2來將輸入項(“FrankWillard”)變換成適當的輸出項(例如,“F. Willard”)。·B.用戶交互功能這一節描述(圖2的)用戶交互模塊206的操作。用戶交互模塊206允許用戶以各種模式與數據操縱功能202和程序創建系統102交互,其中這些模式可以分離地或以任何組合來應用。為了便于解釋,假設用戶與程序創建系統102直接交互。然而,該交互可以由數據操縱功能202以任何方式來作為中介。一般地,各種交互模式允許用戶以不同的各種方式向程序創建系統102提供反饋。該反饋允許用戶標識(并且隨后校正)出于任何原因認為是不合乎需要的輸出結果。程序創建系統102可以使用用戶的反饋來修改程序114,以使得它提供更準確的結果。依靠這種功能,程序創建系統102可以通過與用戶的一系列交互來迭代地學習程序114。圖7示出表示第一用戶交互模式的示例。此示例與參考圖I陳述的場景相關。在這里,用戶已經創建四個輸入-輸出不例702。每一輸入-輸出不例包括輸入項,該輸入項包括分別對應于客戶的名字和姓氏的兩個輸入字符串項。每一輸入-輸出不例也包括對應于這兩個輸入字符串項的變換的輸出項。該變換提取客戶的名字的首字母,并將其與客戶的完整姓氏串接起來。假定用戶已經向程序創建系統102提交了這四個輸入-輸出示例702,且作為響應接收到了程序114。然后,用戶使用程序114來操作還沒有經過變換的另一組輸入項704。這用附加的輸出項填充了圖7中所示出的表。假設程序114以合乎需要的方式對除了輸入項中的兩個之外的所有其他輸入項運作。異常的輸入項706對應于姓名“Ms. Sue Phan”。在這一示例中,程序114 “錯誤地”將字符串“Ms.(女士)”解釋為客戶的名字。它因此輸出“M. Phan”的輸出項,而不是適當的輸出項“S. Phan”。通過將輸入項“Mr. Tony Miller”轉換成“Μ· Miller”,程序114提供類似的不合乎需要的結果。用戶可以以任何方式突出顯示各模糊的輸入項中的一個或多個。例如,假定用戶決定突出顯示輸入項706。在一個僅僅是代表性的情況中,用戶交互模塊206提供標記按鈕708(等等),其允許用戶將輸入項706登記為異常。即是說,在一種方法中,用戶可以選擇對應于異常的輸出項的一個或多個單元格并點擊標記按鈕708。用戶交互模塊206也可以給予用戶校正異常的輸入項的機會,例如通過在適當的單元格中用“S. Phan”代替“M. Phan”。替代地,用戶交互模塊206可以提供專用的對話框(等等)(未示出)來向用戶征求正確的輸出項。用戶的動作創建例如對應于輸入項“Ms. SuePhan"和正確的輸出項“S. Phan”的新的輸入-輸出示例。然后,用戶可以向程序創建系統102呈現這新的輸入-輸出項以及其他輸入-輸出項。程序創建系統102可以對這些輸入-輸出示例操作以生成經更新的程序。經更新的程序將包括最佳地以適當準確的和一般化的方式解決與異常的輸入項706相關聯的場景的邏輯。例如,如圖7的右下部所指示的,新生成的程序現在正確地將輸入項“Mr. Tony Miller” 變換成 “T. Miller”。圖8示出補充圖7的示例的過程800,示出以第一用戶交互模式執行的操作。將從圖2的總體數據操縱系統200的“視角”解釋這一過程800。在框802,數據操縱系統200接收例如對應于圖7的一組輸入-輸出示例702的第一組輸入-輸出示例。在框804,數據操縱系統200基于這些輸入-輸出示例提供程序114。在框806,將數據操縱系統200應用到要變換的新的一組輸入項。在一種實現中,用戶可以明確地標識這一組。框806產生對應 的一組新的輸出項。在框808,數據操縱系統200接收用戶對出于任何原因被認為是不合乎需要的任何輸出項的標識(例如,因為它們是不正確的或以另外方式非優選的)。在框810,數據操縱系統200接收一組經更新的輸入-輸出示例,其包括在框810標識的輸出項的經校正的版本。程序創建系統102可以對這一組經更新的輸入-輸出項操作以生成經更新的程序。圖9示出表示與用戶交互的第二模式的示例。在這種情況中,用戶已經同樣向程序創建系統102提交了一組輸入-輸出示例902,這引起了程序114的生成。同樣,程序創建系統102使用程序114來分析其他輸入項。程序創建系統102可以自動地檢查這樣的輸入項集合。替代地,用戶可以明確地指示程序創建系統102檢查輸入項。圖9將輸入項示出為在一個或多個數據存儲904中提供。在這種場景中,程序創建系統102自動地標識出于任何原因被認為是異常或模糊的輸出項。例如,假定程序114遇到其中其選擇條件匹配新的輸入的分區中的兩個子程序可將該新的輸入項轉換成兩個不同的輸出項的情況。這是不合乎需要的輸出,因為程序執行模塊116將不能夠確定哪一輸出項是正確的。在正常的狀態中,即使兩個子程序使用不同的策略來提供它們各自的輸出結果,這兩個子程序都產生相同的輸出結果。在一種方法中,程序創建系統102可以通過呈現用戶界面對話框906來解決這種情況。該對話框906可以標識產生模糊的輸出結果的輸入項(或多個這樣的輸入項)。例如,假設輸入項對應于姓名“Thomas Miller III”。程序114可能“不確定”如何變換這一輸入項。第一子程序指示該輸入項適當地被轉換成“T. Miller”。第二子程序指示該輸入項適當地被轉換成“T. Miller III”。并且,第三子程序指示該輸入項適當地被轉換成“T. III”。對話框906在部分908向用戶呈現這三個選項并要求用戶挑選優選的輸出結果(如果有的話)。用戶做出選擇并激活提交按鈕910等等。這一動作可以創建新的輸入-輸出示例。程序創建系統102可以使用該新的輸入-輸出示例來自改善其對于這種類型的輸入場景的變換準確度。盡管未示出,但在對話框906未能將正確的或以另外方式優選的輸出項列出為可選擇的選項的情況下,對話框906可以包括允許用戶指定正確的或以另外方式優選的輸出項的功能。
圖10示出補充圖9的示例的過程1000,示出以第二用戶交互模式執行的操作。在框1002,數據操縱系統200接收第一組輸入-輸出示例,例如,對應于圖9的一組輸入-輸出示例902。在框1004,數據操縱系統200基于這些輸入-輸出示例提供程序114。在框1006,數據操縱系統200被應用到還沒有經過變換的一組新的輸入項,以產生對應的一組輸出項。在框1008,數據操縱系統200標識框1006中所提供的輸出結果中的模糊的輸出項(如果有的話)。在框1010,數據操縱系統200從用戶接收澄清該模糊的輸出項的本質的輸入。在框1012,數據操縱系統200使用在框1010提供的輸入來改善程序114的性能。圖11示出表示與用戶交互的第三模式的示例。在這種情況中,用戶已經同樣向程序創建系統102提交了一組輸入-輸出示例1102,這引起程序114的生成。同樣,程序創建系統102可以使用程序114來分析其他輸入項以提供對應的輸出項(未示出)。在這種場景中,輸入交互模塊206應用自然語言交互模塊208。自然語言交互模塊208提供當前正由程序114用來將輸入項轉換成輸出項的邏輯的自然語言解釋。自然語言交互模塊208可以使用在一個或多個數據存儲1104中提供的映射規則來執行這種操作。·映射規則標識與程序114相關聯的程序性特征如何被轉換成解釋性自然語言消息。圖11示出數據操縱系統200的操作中的不同時刻處可以調用的說明性對話框1106。例如,用戶可以利用這種功能來獲得關于正用來轉換數據項的邏輯的了解。這將允許用戶更有效地選擇新的輸入-輸出示例以便克服任何所標識的問題。在一種情況中,用戶交互模塊206可以提供允許用戶明確地調用解釋功能的解釋按鈕1108等等。替代地或另外,用戶交互模塊206可以在某些情形中自動地調用解釋功能,或者響應于鼠標懸停事件(例如,當用戶鼠標光標移動到包含輸出項的單元格上時)調用解釋功能等等。對話框1106本身可以以任何方式解釋程序114的邏輯,例如,通過解釋由程序114執行的操作的序列。另外,對話框1106可以包括任何類型的按鈕1110等等,用戶可以激活它以便接收關于正由程序114使用的邏輯的更詳盡的信息。盡管未示出,但對話框1106也可以提供允許用戶基于從對話框1106搜集的了解來校正一個或多個輸出項的選項。圖12不出補充圖12的不例的過程1200,不出與用戶交互的第三模式。在框1202,數據操縱系統200接收第一組輸入-輸出示例,例如,對應于圖11中的一組輸入-輸出示例1102。在框1204,數據操縱系統200基于這些輸入-輸出示例提供程序114。在框1206,數據操縱系統200被應用到還沒有經過變換的一組新的輸入項,以便產生對應的一組輸出項。在框1208,在任何時刻,數據操縱系統200向用戶提供標識正用來生成輸出項的邏輯的自然語言解釋。在框1210,數據操縱系統200可以接收用戶基于從自然語言解釋搜集的了解而準備的一組新的輸入-輸出示例。C.用于表達程序的說明性語言在一種實現中,子程序生成模塊212使用自定義表達式語言來創建子程序。圖13示出用于該表達式語言的說明性構造器。然而,其他實現可以使用具有不同的構造器和結構范例的其他表達式語言。圖13中所示出的表達式語言的主要或“頂層”特征是Switch (切換)構造器1302。Switch構造器1302使用或結構來表達程序114。即是說,如已經解釋的,Switch構造器包括多個選擇條件(Cond1, cond2,...)和多個子程序(P1, P2, · · ·)。在執行期間,如果Cond1評估為真,則程序執行模塊116應用程序P1,如果Cond2評估為真則應用程序P2,等等。
表達式語言可以通過利用一組構造器1304來表達任何個體子程序(Pp P2等等)。串接構造器以指定的次序將兩個或更多個字符串項組合在一起。循環構造器將字符串項重復所標識的次數(約束變量w從被初始化為O開始并且遞增w直到字符串項評估為空),每次都將該字符串項與先前已經由循環構造器形成的基字符串項串接在一起。常量字符串構造器打印常量字符串。子字符 串構造器選擇字符串項str內的在子字符串項,在位置Pos1開始并在Pos2-I結束,同時在位置I開始從左邊計數。如果Pos1或Pos2是指在輸入字符串項的范圍外的位置,那么,子字符串構造器返回空值。如果任何pos是負的,則這一構造器是被解釋為意指Length(str)+pos+Ι,其中Length(str)是指輸入字符串項(str)的長度。表達式語言又可以使用Position (位置)構造器來定義每一 pos值。Position構造器由Position (str, regex1; regex2, count)定義。Position構造器是指位置c,使得存在位置ti<c ( t2,以使得StHt1Zt2)是輸入字符串項(str)中與regex2串接的Tegex1的第count (計數)個匹配,且其中,StHt1 = C-I)匹配regeXi并且str (c:t2)匹配regex2。記號str(t1:t2)指示在位置h開始并在位置t2結束的子字符串,同時在位置I開始從左邊計數。項Tegex1和regex2對應于要匹配的字符串項中的表達式,如下面更詳細地討論的。如果str不包含regeXi和regex2的至少| count |個匹配,那么,Position返回空值。如果count〈0,則 Position (str, Tegex1, regex2, count)的含義與 Position (str, Tegex1, regex2,t+count)相同,其中t是字符串str中與regex2串接的Tegex1的匹配總數。現在參見圖13的上半部分,表達式語言還可以提供用于表達諸如COnd1等每一選擇條件的句法。選擇條件Cond1代表程序執行系統116將選擇子程序條件。一般地,選擇條件可以被表示為一個或多個α-型公式元素的或。每一 α-型公式元素又可以被表示為一個或多個b-型公式元素的與。每一 b-型公式元素又可以對應于匹配表達式,Match (regex, C,Vi)(或其否定)。換句話說,每一 b_型公式元素表示在輸入項Vi上評估的原子謂詞。如果輸入項Vi包含表達式regex的至少c個匹配,則這一謂詞評估為真。F節將陳述α-型和b-型公式元素的總體意義。一般而言,條件生成模塊216檢查一組輸入-輸出示例中所有輸入項的屬性。條件生成模塊216形成用于覆蓋特定分區的輸入項同時排除所有其他分區的輸入項的公式元素的邏輯組合。通過使用Match (匹配)構造器,這些公式元素最終映射到輸入項中的屬性。表達式語言可以采用速記符號來考慮常見表達式。例如,速記記號Substring (Vi, regex, count)表不更詳盡的表達式 Substring (Vi, Position ( e,regex, count), Position (regex, e,count)),其中 e 表示空字符串。速記記號 Match (regex, Vi)指示Match (regex, I, Vi)。Position構造器和Match構造器兩者都對由regex表示的正則表達式進行引用。regex表達式被定義為在字符串項內的令牌的組合。表達式語言定義各種類型的令牌。令牌的第一集合對應于特殊字符,例如StartTok令牌(其匹配字符串項的開始)、EndTok令牌(其匹配字符串項的結束)以及MonthNameToken令牌(其匹配月份姓名)等等。令牌的另一集合對應于單個字符,每一個都來自各自的字符類(C)。令牌的另一集合對應于字符的序列,每一序列同樣來自各自的字符類(且由C+表示),或者每一序列被指定為不屬于特定字符類(由C )卜表示)。
例如,令牌可以對應于選自以下各類的一個或多個字符數字數位;字母字符;小寫字母字符;大寫字母字符;空白字符;等等。也可為特定字符定義令牌,例如連字號、點、分號、冒號、逗號、反斜杠、正斜杠、@符號等等。一般地,表達式語言可以采用傳達令牌的本質的術語。例如,NonDigitTok是指不是數字數位的字符的序列,且HyphenToken描述連字號字符等等。記號e指示空的令牌序列。為了闡明表達式語言的含義和使用,考慮下列三個示例。示例I。假設子程序的目標是提取在輸入字符串內的前兩個點之間的非點字符。例如,具體化這一變換的輸入-輸出示例是“alpha, brave, charlie” 一 “bravo”。另一示例是“123. 45. 6789” 一 “45”。可以用來表達這種變換的子程序是Substring(ν1; NonDotsToken, 2)。這制定了提取 非點令牌(“NonDotsToken”)在輸入字符串項、內的第二次發生的指令。示例2。假設程序的目標是從以兩種不同格式寫成的日期中提取月份。例如,具體化這種變換的輸入-輸出示例是“18. 04. 1980,,一“04”。另一示例是“04/18/1980”一“04”。可以用來表達這種變換的程序Switch ({(Match (DotToken, V1), Substring (V1, Numtok, 2))
,(Match (BackSlashToken, V1), Substring (V1, Numtok, I)))}。這一程序包括基于兩個相應選擇條件來觸發的兩個子程序。第一選擇條件確定輸入項V1中是否存在點令牌。如果是,則Substring (子字符串)構造器提供提取輸入項V1內的第二數字令牌的指令。第二選擇條件確定輸入項V1中是否存在反斜杠令牌。如果是,則Substring構造器提供提取輸入項V1內的第一數字令牌的指令。示例3。假設子程序的目標是將單詞或句子中的每一字母(包括空格)拆分成不同的列。例如,具體化這種變換的輸入-輸出示例是“THIS IS”一“T|H|I|S| |I|S|”。可以用來表達這種變換的子程序是 Loop (w, Concatenate (Substring (V1, CharTok, w), ConstantString(“ I ”)))。內部Substring構造器提供提取輸入項V1內字符令牌的第w次發生的指令。Concatenate (串接)構造器提供將所提取的字符令牌與常量字符串“ I ”組合起來的指令。最后,外部的Loop (循環)構造器提供用于多次重復這些操作的指令,從w=l開始并且遞增w直到循環體返回空,這在子字符串(substring)構造器返回空時發生,在這一具體的情況中,是在w超過輸入字符串中的字符數量時發生。重申一下,在此描述的表達式語言是表達程序和子程序的一種可能方式。可以使用具有其他構造器和結構原理的其他表達式語言來代替圖13中所示出的表達式語言。D.生成程序集這一節描述圖I的子程序生成模塊212的操作方式。重申一下,子程序生成模塊212為每一輸入-輸出示例生成一組子程序。有效的子程序是將把輸入-示例的輸入項變換成輸入_輸出不例的輸出項的一個或多個操作的任何序列。子程序生成模塊212可以使用C節中陳述的表達式語言來表達每一子程序(根據一種具體的但非限制性的實現)。圖14示出解釋子程序生成模塊212的操作方式的示例1400。在這一示例中,輸入項提供電話號碼“555-706-7709”。對應的輸出項列出相同的電話號碼,但在區號“555”周圍添加了圓括號。子程序生成模塊212通過比較輸出項和輸入項開始其分析。即,子程序生成模塊212確定輸出項內的子字符串項如何與輸入項中的子字符串項相匹配。例如,子程序生成模塊212確定輸出項中的數字令牌“555”匹配輸入項中的令牌“555” ;輸出項中的破折號令牌匹配輸入項中的兩次出現;輸出字符串中的令牌“706”匹配輸入項中的令牌“706” ;輸出項中的令牌序列“-706”匹配輸入項中的序列“-706” ;輸出項中的令牌序列“-706-”匹配輸入項中的序列“-706-”等等。正如所明白的,存在大量這樣的匹配,圖14中僅闡釋其中的少量匹配。此外,子程序生成模塊212可以列舉引用相匹配的令牌的位置的所有方式。例如,子程序生成模塊可以確定,參考輸入項中最左邊的字符、輸入項中最右邊的字符和/或輸入項中的某種其他所標識的特征來引用輸入項中的令牌“706”是可能的。注意,子程序生成模塊212排除一些類型的匹配。例如,子程序生成模塊212被配置為尋找在字符串項內的令牌邊界處而不是在多字符令牌內的任意位置處發生的匹配。舉例來說,子字符串生成模塊212將不嘗試把輸出項中的字符“55”與輸入項中的對應字符匹配起來。此外,子程序生成模塊212將不嘗試匹配非連續字符串。然而,其他實現可以放松或去除這些約束。子程序生成模塊212還可以從常量字符串項生成輸出項的各部分。子程序生成模塊212也可以列舉這些可能性。舉例來說,子程序生成模塊212可以從常量字符串項“(”創建“”令牌。類似地,子程序生成模塊212可以創建“ 555 ”令牌、“(555 ) ”令牌、“)”令牌、
令牌等等,所有這些都來自相應的常量字符串項。在執行了這種匹配后,子程序生成模塊212現在可以列舉可以生成輸出字符串中的令牌的不同方式,例如通過從輸入項和常量項中的匹配令牌不同地抽取。大量可能的子程序中的僅一個涉及不參考語言專用的句法來表達的以下的操作序列(1)打印常量項“(” ;(2)打印輸入字符串中的第一數字令牌;(3)打印常量項“;(4)打印輸入字符串中的第二數字令牌;(5)打印常量項“;以及(6)打印輸入字符串中的第三數字令牌。進行到圖15,該圖示出如何把輸入項映射成對應的輸出項的另一示例。在這種情況中,輸入項和輸出項兩者表現出大量的重復。即,舉例來說,輸出項提供夾雜有分號的一系列數字令牌。因此,這一輸出項是使用以上所描述的Loop構造器來表示的良好候選。一般地,子程序生成模塊212確定特定變換的特性是否有助于循環型表示。子程序生成模塊212通過確定已經以以上(相對于圖14)所描述的方式列舉的子程序中是否 存在共性來執行這一任務。例如,子程序生成模塊212可以確定,子程序通過提供打印從輸入項取出的數字令牌的指令然后提供打印常量字符串“;”的指令來生成輸出項中的令牌“458;”。子程序生成模塊還可以確定,子程序以相同的基本方式生成輸出項中的令牌“870; ”,例如通過提供打印從輸入項取出的數字令牌的指令然后提供打印常量字符串“;”的指令。基于這種了解,子程序生成模塊212可以確定是否可能通過重復兩個指令的這種共同組合來構建輸出項中的至少一些部分。在這種情況中,子程序生成模塊212確定,確實可能使用循環(Loop)構造來表示輸出項。更正式地說,子程序生成模塊212嘗試查找是否存在三個索引(i,j,k),使得可以將從i到j的字符串內容以與從j到k的字符串內容相同的程序性方式來表示。如果是這樣,則子程序生成模塊212可以調查是否可能進一步將這種重復模式擴展到該字符串項,例如直到位置I。圖16示出以流程圖形式傳達以上(相對于圖14和15)所描述的原理的過程1600。在這一過程1600中,子程序生成模塊212為包括輸入項和對應的輸出項的特定輸入-輸出示例生成一組程序。在框1602,子程序生成模塊212在輸入項內標識輸出項中的子字符串項的出現,以提供匹配的結果。在框1604,子程序生成模塊212列舉可以基于匹配結果(在框1602標識)并從常量字符串項構建的一組子程序。在框1606,子程序生成模塊212確定是否還可能使用Loop構造器來表示該輸入-輸出示例。如果是這樣,則子程序生成模塊212生成一個或多個循環型子程序并將這些子程序添加到該組候選子程序。在框1608,子程序生成模塊212輸出用于該輸入-輸出示例的最終的一組子程序。圖17示出提供關于子程序生成模塊212可以構建循環型子程序的方式的進一步細節的過程1700。在框1702,子程序生成模塊212 (以圖16中陳述的方式)為輸入-輸出示例生成一組子程序。在框1704,子程 序生成模塊212確定該組子程序中是否存在重復的程序性內容。為了進行這樣的確定,子程序生成模塊212可以調用交集模塊218來形成用于生成輸出項的鄰近子串的子程序的交集。交集操作的結果將標識各子程序內的共同操作組件。在框1706,如果找到共性,則子程序生成模塊212制定包括Loop構造器的至少一個附加子程序。圖18示出闡釋如何以圖的形式而不是作為各單獨的離散記錄來生成各組子程序的示例1800。例如,子程序生成模塊212可以使用有向無環圖來表示每一組子程序。子程序生成模塊212可以采用這種策略來簡便地表示一組內的子程序(因為通常存在極大量的這些子程序)。更具體地,圖18的示例1800僅示出用來把圖14的輸入項轉換成該同一附圖中所示出的輸出項的大量的可能的子程序中的兩個。每一子程序包括以特定次序執行的一系列操作。例如,子程序A包括使用不正式的句法來表示以便于解釋的下列操作(1)打印常量字符串項“(” ;(2 )打印從輸入項取出的第一號碼;(3 )打印常量字符串項“”;以及(4)打印常量字符串項“-706-7709”。子程序B包括下列操作(I)打印常量字符串項“(555)” ;以及(2)打印常量字符串項“-706-7709”。這兩個子程序可以被表示為兩個路徑。這些路徑的節點對應于在輸出字符串內的位置,這些位置通常是令牌邊界。即,輸出字符串中存在14個字符;這些字符位置的子集對應于潛在的節點位置。由節點劃分的邊與由子程序執行的相應操作相關聯。注意,子程序A的拖尾的邊對應于與子程序B的拖尾的邊相同的操作。因此,圖可以將這一共同部分表示為公共邊。圖18的底部示出了這一概念,例如通過示出公共邊1802。更一般地,子程序生成模塊212可以通過創建表示子程序可能性的有向無環圖來列舉這些可能性。即是說,在這樣的圖中的每一個可能的節點處,子程序生成模塊1212可以列舉程序可能性,并以圖格式來表示這些可能性。通過追蹤穿過有向圖的多個可能路徑中的一個,在開始節點開始并在目標節點終止,可以“讀出”由這樣的圖表示的任何特定的子程序。如由圖18的簡單示例所指示的,一些路徑包括比其他路徑更多的組成操作(和關聯的邊)。更正式地說明,在一種實現中,子程序生成模塊212可以將一組子程序表示為ORg(ihn\7/,lw)。這一記號表示包括包含開始節點(ns)和目標節點(Ht)的一組節點(”)的有向無環圖(Dag)。該Dag還包括一組邊(f)。W把這些邊映射到相應的程序操作。
此外,程序創建系統102的各種組件可以通過對圖而非離散的記錄進行操作來執行它們的分析。這適用于由分區模塊214、條件生成模塊216和交集模塊218執行的操作。為了適應這一點,對應物表達式語言可以被定義為表達相對于圖13陳述的構造器的與圖相關的對應物。然而,為便于解釋,其余的解釋描述對離散的各組子程序執行的操作。E.生成分區圖19示出解釋圖2的分區模塊214的操作的一種方式的過程1900。重申一下,分區模塊214把各組輸入-輸出示例編組在一起形成分區。在這一階段,子程序生成模塊212已經為每一輸入-輸出示例生成了一組子程序(例如,正如在圖5的框404’中所闡釋的)。在框1902,分區模塊214通過把所有輸入-輸出示例看作是分離的單獨分區來開始其分析。在框1904,分區模塊214確定把各個分區對組合在一起的適當性。分區模塊214 可以基于任何類型的兼容性考慮做出這種確定。在一種實現中,分區模塊214在做出這種確定時檢查兩個兼容性因素。對于每一可能的分區配對,分區模塊214執行這一分析。即是說,第一兼容性因素涉及兩個候選分區的交集是否產生非空集,意味著存在由這兩個候選分區共享的至少一個共同子程序。如果這一因素沒有得到滿足,那么,分區模塊214可以將這兩個候選分區標識為不可組合。第二兼容性因素涉及這兩個候選分區相對于其他分區的行為。例如,假設,分區模塊214當前正在考慮把輸入-輸出示例A與輸入-輸出示例B組合起來的適當性(其中這些兩個示例對應于各自的單獨分區)。如所說明的,第一要求是輸入-輸出示例A和輸入-輸出示例B的交集非空。(在這里,這兩個輸入-輸出示例的交集是與這兩個輸入-輸出示例相關聯的兩組子程序的交集的速記引用)。另外,分區模塊214確定輸入-輸出示例A與輸入-輸出示例C的交集是否具有與輸入-輸出示例B同輸入-輸出示例C的交集相同的“行為”或特性。分區模塊214對所有其他輸入-輸出示例(例如D、E等等)重復這一分析。可以基于所共享的行為的程度來計算兼容性分數。例如,如果輸入-輸出示例A和輸入-輸出示例B兩者均與輸入-輸出示例C形成非空交集,則得到正分。如果輸入-輸出示例A和輸入-輸出示例B兩者均與輸入-輸出示例C形成空交集,則得到另一正分,等等。另一方面,當輸入-輸出示例A具有不由輸入-輸出示例B共享的與交集相關的行為時,得到負分。以此方式,分區模塊214檢查把任何兩個輸入-輸出示例組合在一起的全局暗示。分區模塊214執行以上所描述的類型的分析,以便組合將可能是用于進一步構造分區(在將來的迭代中)的核分區。即是說,如果輸入-輸出示例A和輸入-輸出示例B具有相對于輸入-輸出示例C的相同的行為,那么,在組合A和B之后,接下來把A+B分區與輸入-輸出示例C組合起來是可能的。總體,分區模塊214嘗試產生少量的分區。上面的算法促進了這一目標。一般地,在執行框1904時,分區模塊214可以與交集模塊218交互。通過形成與分區相關聯的兩個有向無環圖的交集,交集模塊218可以確定分區是否非空。在框1906,分區模塊214確定是否可能組合任何兩個分區。如果不是,則過程1900終止并輸出分區的最終集合(在框1908)。替代地,假設對框1906的回答為肯定,指示存在可以被組合在一起的至少兩個分區。如果是這樣,則在框1910,分區模塊214嘗試確定應把哪兩個分區組合在一起。應注意,如果兩個分區的交集產生空集,則它們是不可組合的。除此之外,分區模塊214嘗試組合具有最高的如上所述計算的兼容性分數的分區。當使用這種方法時,可以說,分區模塊214可以采用貪婪方法來把分區組合在一起。一旦把兩個分區組合在一起,經組合的分區被看作是供在由過程1900提供的分析的下一次迭代中分析的單個分區。F.生成選擇條件圖20提供陳述條件生成模塊216的操作·的一種方式的示例2000。回想起條件生成模塊216的目的是為每一分區生成選擇條件。選擇條件將覆蓋與其自己的分區相關聯的輸入項,然而排除與其他分區相關聯的輸入項。在圖20的示例中,第一分區(“分區I”)包括兩個輸入-輸出示例,這兩個示例又與兩個相應的輸入項相關聯。假設條件生成模塊216處于確定第一分區的選擇條件(Cond1)期間。條件生成模塊216首先檢查與所有分區中的所有輸入-輸出示例相關聯的輸入項的特性。這些特性在此被稱為屬性,屬性最終對應于在輸入項內的相應的子字符串項。圖20概括地指示輸入項I具有屬性An、A12、A13、A14、……、Aln,同時輸入項2具有屬性A21、A22、A23> A24> ......、A2p。輸入項I的一些屬性也可以出現在輸入項2中。條件生成模塊216可以通過依次處理分區I內的每一輸入項來構建選擇條件Cond10 一般地,條件生成模塊216嘗試查找輸入示例中的不在其他分區中出現的屬性的組合。舉例來說,從輸入項I開始,條件生成模塊216可以確定屬性A12排除了其他分區中的輸入項的子集,同時屬性A14排除了其他分區中的其余輸入項。因此,條件生成模塊216可以確定,“與” a ^lj^bi2AND b14足以將第一輸入項與其他分區的輸入項區分開來。在這里,記號b12和b14表示分別對應于屬性A12和A14的原子謂詞。即是說,原子謂詞對應于檢查輸入字符串以便分別得到A12和A14的出現的Match構造器。對與輸入項2,假設單個屬性A23(和對應的原子謂詞b23)排除了其他分區的所有輸入項。條件生成模塊216接下來可以形成用于作為整體的分區I的邏輯公式,以便由此產生選擇條件Cond115即,選擇條件可以被表示為(b12AND b14) OR b23。這一公式中的邏輯“或”是適當的,這是因為,如果每一 α-型邏輯元素(與特定輸入項相關聯)排除了所有其他分區,則它們的“或”也排除所有其他分區。條件生成模塊216可以對所有分區重復這一操作以便為作為整體的Switch構造器構建選擇條件。條件生成模塊216可以應用各種其他考慮以便產生更簡潔的邏輯公式,例如,通過減少公式中的“或”的數量。即,在執行以上所描述的分析時,條件生成模塊216可以采用各種試探法來更容易地考慮選擇特定屬性的全局結果。例如,假定條件生成模塊216推斷出通過選擇某些公共屬性能將分區I中的輸入項中的多個與其他分區區分開來。出于減少總體公式中的“或”的數量的目的,條件生成模塊216因此可以選擇這些屬性而不是其他屬性候選。圖21示出總結上面相對于圖20給出的解釋的過程2100。在框2102,條件生成模塊216確定(與各自的輸入-輸出示例相關聯的)輸入項的屬性。這些屬性對應于輸入項中相應文本特征。在框2104,對于特定分區i,條件生成模塊216確定將覆蓋分區i的輸入項然而排除其他分區的輸入項的公式元素的組合。條件生成模塊216對其他分區重復這一操作。在框2106,條件生成模塊216輸出從以上指定的方式確定的選擇條件構建的布爾公式。在該布爾公式將特定輸入項路由到特定分區和關聯的代表性子程序的程度上,它可以被看作是布爾分類器。G.代表性的處理功能圖22陳述可以用來實現以上所描述的功能的任何方面的說明性的電子數據處理功能2200。參見圖I和圖2,舉例來說,圖22中示出的處理功能2200的類型可以用來實現程序創建系統102的任何方面、數據操縱功能202的任何方面、用戶交互模塊206的任何方面等等。在一種情況中,處理功能2200可以對應于任何類型的計算設備(或多個任何類型的這樣的設備),其中的每一個都包括一個或多個處理設備。處理功能2200可以包括諸如RAM 2202和ROM 2204等易失性存儲器和非易失性存儲器以及一個或多個處理設備2206。處理功能2200也可選地包括諸如硬盤模塊、光盤模塊等等各種媒體設備2208。在處理設備2206執行由存儲器(例如,RAM 2202、ROM 2204或其他地方)維持的指令時,處理功能2200可以執行上面標識的各種操作。更一般地,指令和其他信息可以被存儲在任何計算機可讀介質2210上,包括但不限于靜態存儲器存儲設備、 磁存儲設備、光存儲設備等等。術語計算機可讀介質還包括多個存儲設備。處理功能2200還包括用于(經由輸入模塊2214)從用戶接收各種輸入且用于(經由輸出模塊)向用戶提供各種輸出的輸入/輸出模塊2212。一種具體的輸出機制可以包括呈現模塊2216和關聯的圖形用戶界面(⑶1)2218。處理功能2200也可以包括用于經由一個或多個通信管道2222與其他設備交換數據的一個或多個網絡接口 2220。一個或多個通信總線2224把以上所描述的組件通信上耦合在一起。盡管已經用對結構特征和/或方法論動作專用的語言描述了本主題,但應理解,在所附權利要求中界定的本主題并不必定限于以上所描述的具體特征或動作。相反,以上所描述的具體特征和動作是作為實現權利要求的示例形式而公開的。
權利要求
1.一種使用至少一個計算設備執行的用于生成執行數據操縱任務的程序的方法,包括 接收輸入-輸出示例,所述輸入-輸出示例提供輸入項和對應的輸出項; 為相應的輸入-輸出示例生成各組子程序,每一子程序被配置為把與特定輸入-輸出示例相關聯的輸入項變換成與所述特定輸入-輸出示例相關聯的輸出項; 把所述各組子程序編組成各分區,并從相應分區中選擇代表性的子程序; 確定相應分區的選擇條件,每一選擇條件覆蓋與特定分區相關聯的輸入項同時排除與其他分區相關聯的輸入項;以及 基于所述選擇條件以及所述代表性的子程序來提供所創建的程序。
2.如權利要求I所述的方法,其特征在于,所述生成包括通過以下操作為所述特定輸入-輸出示例生成一組子程序 標識所述輸入項中與所述輸出項中的相應字符串項相匹配的字符串項的出現,以便提供匹配的結果;以及 使用所述匹配的結果和常量字符串,提供把所述輸入項映射到所述輸出項的所述一組子程序。
3.如權利要求2所述的方法,其特征在于,所述生成還包括確定是否能使用循環構造器生成至少一個附加的子程序,且如果是這樣,則把所述至少一個附加的子程序添加到所述一組子程序。
4.如權利要求I所述的方法,其特征在于,所述生成包括使用表達式語言來表達每一子程序,所述表達式語言包括以下的一個或多個串接構造器;子字符串提取構造器;循環構造器;以及常量字符串構造器。
5.如權利要求I所述的方法,其特征在于,所述生成包括將每一組子程序表示成有向無環圖,其中,由所述組中的兩個或更多個子程序執行的相同的操作對應于所述有向無環圖中的單條邊。
6.如權利要求I所述的方法,其特征在于,所述編組包括 通過把所述輸入-輸出示例看作是單獨分區來啟動迭代編組過程; 基于兼容性考慮確定把相應的分區候選對組合在一起的適當性; 基于所述適當性確定把分區候選對組合在一起成為單個分區;以及 重復所述適當性確定和組合,直到達到終止條件。
7.如權利要求6所述的方法,其特征在于,所述兼容性考慮指定,如果對應于分區候選對的各組子程序的交集得到空集,則所述分區候選對不是用于組合的可行候選。
8.如權利要求6所述的方法,其特征在于,如果相對于其他分區,分區候選對的第一分區和第二分區具有彼此相似的特性,則所述兼容性考慮支持該分區候選對的組合。
9.如權利要求I所述的方法,其特征在于,所述選擇條件確定包括,對于所述特定分區 確定與所述輸入-輸出示例相關聯的輸入項的屬性;以及 選擇具有覆蓋與所述特定分區相關聯的輸入項同時排除與其他分區相關聯的輸入項的效果的、與所述屬性相關聯的公式元素的組合。
10.如權利要求I所述的方法,其特征在于,還包括接收新的輸入項; 分析所述新的輸入項以確定適用的選擇條件,并選擇對應的子程序;以及 使用所述對應的子程序,把所述新的輸入項變換成新的輸出項。
11.如權利要求I所述的方法,其特征在于,還包括 從用戶接收為新的輸入項生成的輸出項不合乎需要的標識; 提供與所述新的輸入項相關聯的新的輸入-輸出示例以及為所述新的輸入項生成的所述輸出項的經校正的對應物;以及 部分地基于所述新的輸入-輸出示例提供經修改的所創建的程序。
12.如權利要求I所述的方法,其特征在于,還包括 把新的輸入項標識為模糊; 從所述用戶接收澄清所述新的輸入項的輸出項的正確形式的輸入;以及 使用來自所述用戶的所述輸入來改善所創建的程序。
13.如權利要求I所述的方法,其特征在于,還包括提供自然語言解釋,所述自然語言解釋標識由所創建的程序用來把新的輸入項轉換成新的輸出項的邏輯。
14.一種用于存儲計算機可讀指令的計算機可讀介質,當由一個或多個處理設備執行時,所述計算機可讀指令提供程序創建系統,所述計算機可讀指令包括 被配置為接收輸入-輸出示例的邏輯,所述輸入-輸出示例提供輸入項和對應的輸出項;以及 被配置為基于所述輸入-輸出示例提供所創建的程序的邏輯,所創建的程序包括 用于把新的輸入項變換成相應的新的輸出項的多個子程序,每一子程序都是從表達式語言的構造器來構建的;以及 多個選擇條件,每一選擇條件選擇特定子程序并排除其他子程序。
15.一種數據操縱系統,包括 用于執行數據操縱任務的數據操縱功能; 被配置為進行以下操作的程序創建系統 接收由所述數據操縱功能提供的輸入-輸出示例,所述輸入-輸出示例提供輸入項和對應的輸出項;以及 基于所述輸入-輸出示例提供所創建的程序;以及 被配置為從用戶接收輸入的用戶交互模塊,所述輸入提供對由所創建的程序提供的輸出結果的經評估的合乎需要性的反饋。
全文摘要
描述了基于輸入-輸出示例生成數據操縱程序的程序創建系統。所創建的程序可以包括子程序的集合以及相應選擇條件的集合。當接收到新的輸入項時,程序執行模塊使用選擇條件來選擇子程序中的一個。然后,程序執行模塊應用所選擇的子程序以便生成新的輸出項。程序創建系統使用由三個部分組成的方法來生成程序,涉及為相應的輸入-輸出示例生成各組子程序;把各組程序編組成分區并為各分區選擇代表性的子程序;以及確定選擇條件。用戶交互模塊提供允許用戶與程序創建系統交互并由此改善所創建的程序的性能的各種機制。
文檔編號G06F9/44GK102918500SQ201180027421
公開日2013年2月6日 申請日期2011年5月20日 優先權日2010年6月4日
發明者S·古瓦尼 申請人:微軟公司