2015-04-05 100 views
3

我正在開發一個應用程序,我需要從用戶輸入(自然英文文本)查詢的數據庫中獲取結果。 對於啓動我有標記,解析,NER,POS標記輸入文字(使用斯坦福 NLP庫)。 但接下來要做什麼。我的意思是我應該做更多的事情,以便我可以從輸入文本中創建一個適當的SQL查詢,這些查詢可以在數據庫上觸發。我應該如何處理文本的上下文。數據庫的自然語言接口

比如我有一個公司,在那裏我有這樣的員工,部門不同的表,等
數據庫 - 所以,當他查詢爲「員工的名單」的用戶類型,那麼它應該是能夠顯示員工名單。
- 用戶輸入「」中的「員工」時,應顯示員工與計算機名稱相關的部門。

我正在使用MS-SQL的數據庫(所以查詢需要從自然語言爲SQL創建)。而對於編程,我正在使用C#。

我已經經歷了許多不同的文件,但都是理論上的。但我沒有找到適當的實施方式。因此,任何類型的信息,數據,鏈接,指導,解決方案,其他實施方式等將會有所幫助。

+0

你看過域特定語言嗎?這可能是一個很好的信息來源:https://msdn.microsoft.com/en-us/library/ee943825.aspx – 2015-04-05 12:40:46

+1

取決於你想付出多少努力,你可以嘗試訓練一個語義分析器用於該任務(例如,http://www-nlp.stanford.edu/software/sempre/)。您需要查詢及其相關結果的培訓示例,並且您需要一些代碼才能在數據庫上運行邏輯表單,但最終應該能夠正常運行。 – 2015-04-08 09:13:44

+0

嗨GD,我面臨同樣的問題,你能告訴我你是如何解決它的。 – rakesh 2015-10-02 06:13:43

回答

1

這是一個很難回答的問題。我懷疑它可以毫不含糊地回答。可以有多種方法來解決這個任務。我只能說出其中的一個。最簡單的一個。這是基於規則的。爲了實現這一點,應該做大量的手動映射工作。

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具有含義SOURCEFOREIGN 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 = 5select ID from EMPLOYEES where SALARY > 435 and ID = 23select 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 Xshow article X,list of Xselect * from X,with salary more than Xwhere 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.現代自然語言接口到數據庫:用語義可牽引性編寫統計分析。

+0

關於本體的更多信息:它是DB中語法結構和表之間的附加層。用戶可能不知道表的名稱。語義實體並不總是對應於表。因此,本體中的節點應該將語義實體映射到SQL片段。例如,entity'employees'可能不是一個簡單的表,而是一個類似於'select *'的查詢,來自USERS,其中WORKPLACE ='OUR_COMPANY''。有時候,在你的領域本體論之前,增加了一個附加的詞彙本體(帶有同義詞)(WordNet就是一個例子)。 – Qualtagh 2015-04-07 03:56:48