這是一個很難回答的問題。我懷疑它可以毫不含糊地回答。可以有多種方法來解決這個任務。我只能說出其中的一個。最簡單的一個。這是基於規則的。爲了實現這一點,應該做大量的手動映射工作。
POS標記後,應完成語法分析。您不僅應該找到每個單詞的屬性,還應該找到單詞之間的依賴關係:單詞之間鏈接和鏈接類型。例如:"list of employees"
。這裏主要是"list"
,"employees"
是依賴的。鏈接的類型是possession
。
然後應該進行語義分析。你有一個語法樹。它應該轉換爲抽象語法樹(AST)。
- 每個單詞或短語(子樹)應該變成一個語義節點。 NER沒問題。節點
word: "employees"
變成table: EMPLOYEES
。節點word: "list"
和節點word: "of"
成爲種類action: SELECT
。你應該有你的域的本體論。語法樹的節點被映射到本體的節點。映射由規則控制。示例規則:if the word is found in the list of tables then replace the node "word: x" with the node "table: x"
。或者另一個:if the word is "list" and a child word is "of" then replace these nodes with "action: SELECT"
。
- 每條邊(語法鏈接)都應該變成語義鏈接。映射也受規則控制。例如,子樹
table: EMPLOYEES
-link: POSSESSION
-entity: ID = 234 ("Computer department") of table DEPARTMENTS
顯示在這種情況下的語法鏈接POSSESSION
具有含義SOURCE
或FOREIGN KEY
。如果表1中存在對應的外鍵和表2的主鍵,則樣本規則爲table1 - link: POSSESSION - table2
變爲table1 - where FK_FIELD_OF_TABLE1 = PK_FIELD_OF_TABLE2 - table2
。
您的本體應包含您的域的所有條款。一些術語是靜態的(例如,動作)。一些是動態的,應該在解析用戶NL-查詢(例如表名或字典表內容)時在運行時查詢。
然後,您在AST的每個邊緣處構建SQL中的小型查詢,並在達到頂部時彙總結果。樣本AST:
action: SELECT
|
table: EMPLOYEES
/ \
where e.DEP_ID = d.ID where e.SALARY > ?
| |
entity: ID = 234 (DEPARTMENTS) constant: 435
左邊緣應該減少爲一個常量相等節點像右邊一樣。然後處理一個小的查詢select ID from EMPLOYEES where DEP_ID = 234
。結果列表存儲在table: EMPLOYEES
節點中。
action: SELECT
|
table: EMPLOYEES (entities: ID in (5, 23, 345))
|
where e.SALARY > ?
|
constant: 435
然後右邊緣(現在它是唯一一個)是爲每一位員工處理: select ID from EMPLOYEES where SALARY > 435 and ID = 5
,select ID from EMPLOYEES where SALARY > 435 and ID = 23
,select ID from EMPLOYEES where SALARY > 435 and ID = 345
。 ID的結果列表被替換。
當然,這個算法可以更好。例如,您可能希望組合當前節點的所有邊的條件。但是爲整棵樹構造一個查詢將會很困難。所以你最好構建小的(可能有簡單的優化),然後結合結果。
另外,請看看我在最後給出的最後一個鏈接。有定義的語義易處理的問題。限制用戶輸入非常重要。這些條件應該保留:
- 該問題應該包含用於確定問題類型(以及答案類型)的wh-詞之一(who,where,what等)。在您的情況下這不是強制性的,因爲像
list of employees
這樣的查詢是允許的。
- 允許使用一些停用詞(如
the
,a
,an
),並且只是被忽略。
- 所有其他詞都應該在本體節點上映射。
- 句子中單詞之間的任何鏈接都應該由系統解釋。
如果有任何術語沒有映射,那麼應該顯示一個錯誤。
另一種方法用於Wolfram | Alpha。 Their FAQ表示他們的方法「不同於傳統的NLP」。我不知道那些方法是什麼。但是我會通過使用大量簡單的語法模式來實現像Wolfram | Alpha這樣的系統。例如,who is X
→show article X
,list of X
→select * from X
,with salary more than X
→where SALARY > X
。
另外,看看控制語言。 NL查詢的結果可能不明確且不可預測。受控語言查詢的結果是確切的。
更多理論:
Wikipedia article關於自然語言界面(以數據庫也)。
關於NLIDB最綜合的概述作品之一:Androutsopoulos,I.,Ritchie,G。和Thanisch,P.自然語言接口到數據庫 - 介紹。
Microsoft English Query:來自Microsoft的NLIDB實現。
在這項工作中給出了語義易處理問題的定義:Popescu,A-M。,Armanasu,A。,Etzioni,O.,Ko,D.,Yates,A.現代自然語言接口到數據庫:用語義可牽引性編寫統計分析。
你看過域特定語言嗎?這可能是一個很好的信息來源:https://msdn.microsoft.com/en-us/library/ee943825.aspx – 2015-04-05 12:40:46
取決於你想付出多少努力,你可以嘗試訓練一個語義分析器用於該任務(例如,http://www-nlp.stanford.edu/software/sempre/)。您需要查詢及其相關結果的培訓示例,並且您需要一些代碼才能在數據庫上運行邏輯表單,但最終應該能夠正常運行。 – 2015-04-08 09:13:44
嗨GD,我面臨同樣的問題,你能告訴我你是如何解決它的。 – rakesh 2015-10-02 06:13:43