2017-08-09 167 views
1

什麼是解析自然語言的最有效方式?解析自然語言

令 「串」 是含map<string, void (*func)(int,char**)>字符串如:

Set the alarm for *. 
Call *. 
Get me an * at * for *. 

和它們相應的功能。現在假設「輸入」是string包含類似的句子:

Call David. 

如何實現的功能,如parse它會使用「輸入」和與之相匹配,以在地圖的一個字符串。然後調用其相應的函數,並將argc和argv傳遞給包含所有通配符的字符串(*中的字符串)。什麼是最有效的方式來實現這樣的功能?

+1

如果你有一個預定義列表帶有固定佔位符的命令不是真實的ly是一種自然語言,但更像域特定語言或至多是一種正式語言(谷歌DSL - 域特定語言)。因此,您可以定義一組正則表達式來匹配命令並提取佔位符。但是你的問題很容易回答。 – xander

+0

風格評論:既然C++ 11,我們會寫'std :: function >)'。 – MSalters

回答

1

不知道爲什麼這個問題得到了downvote。它是一個非平凡的構思。

解析有很多學術方法,主要是退化語法所需的。 「自然語言」可能不是一個明確定義的術語,而自然語言確實有一些不明確的地方,但是這些受限制的子集並沒有問題。

在這個特定的例子中,我們看到不同的生產規則(地圖條目)不是相互不明確的。事實上,第一個標記足以消除歧義。而且由於std::map已排序,我們可以對該標記進行高效的O(logN)搜索。

因此,我們只需要導出替換。再次,我們將忽略退化情況。沒有人會用"Get me an at at at for at打擾。「`,即使它解析明確。

相反,你只需收集令牌,直到你得到預期的下一個標記替代。Get me an * at * for *.意味着第一個*得到所有令牌高達at,第二*收集令牌高達for,並最終*獲取所有剩餘的符號。

你看那個不需要回溯。如果解析失敗,根本不匹配。