2016-04-11 62 views
0

我試圖創建一個簡單的基於語音的命令接口,使用預定義的命令。我遇到問題的具體部分是程序試圖理解通過命令傳遞的參數。我有一些工作代碼,但它不是我想要的。字符串中的PHP正則表達式自定義變量

例如,我可能有檢查天氣如下命令:

在英國倫敦的天氣怎麼

和模式得到認可將是這樣:

在_什麼是天氣

我已經得到了一些基於相關性的mysql查詢的命令,這不是我的問題,我的問題是從命令中分離出「倫敦英國」的上下文。

我有此刻的一些工作代碼,但它並不理想:

//SPLIT CONTEXT FROM COMMAND 
$query = "in london what is the weather"; 
$trigger = "in _ what is the weather"; 
$triggers = explode("_", $trigger); 
foreach($triggers as $word){ 
    $query = str_replace($word, "'", $query); 
} 
$query = explode("'", $query); 
array_shift($query); 

這將意味着$查詢[0] =「倫敦」。但它一次只能支持一個單詞,是否有支持多個單詞的方式,通過某種方式將它作爲一個變量或某些事物來處理?

TL;博士

  • 代碼分離參數
  • 多個單詞
  • 分離出來作爲一個字符串

乾杯

+0

你想自然語言識別和解析與意義的識別?這是...有點廣泛的回答。這個星球上最大的科技公司正在投入大量資源來解決這個問題。不要期望得到堆棧溢出的簡單解決方案。 – deceze

+0

沒有預定義觸發器的自然預定義命令。我只是想知道是否有一種方式來識別......諸如此類的東西:提醒我以後再______並且讓它知道我指的是哪個命令@deceze – P110

+2

這取決於你想走多遠。你可以有一個固定的命令列表,然後計算相似性(例如使用[similar-text](http://php.net/manual/en/function.similar-text.php))。或者你可以創建一個詞法分類,試圖找出答案。儘管如此,後者尚未由語音識別市場上的大公司完全實現。要實現第一種方法,你可以使用正則表達式。你的命令總是靜態的,所以它是(僞代碼)「(*。)中的天氣如何」 – Eihwaz

回答

1

您可以替換您的_「模式「與(.+?)

要捕獲字符串的末尾,可以使用(.+)。你的方式也行得通,但效率不高。 +(和*)默認爲貪婪(添加?以使其不貪婪),所以它們將直接結束(如果需要進行匹配,則回溯到匹配,這將永遠不會發生,因爲它是結束正則表達式)。

你的PHP代碼可能是這個樣子:

$re = "~in (.+?) what is the (.+)~i"; 
$str = "in london united kingdom what is the weather"; 

preg_match($re, $str, $matches); 

i修改確保它不區分大小寫(這是不必要的,如果你的字符串已經全部小寫,就像你說的)。它將匹配:

IN RUSSIA WHAT IS THE WEATHER

當然,匹配的將是拼寫錯誤敏感。它不會匹配:

In london united kingdom what is the whether

雖然這將是很難識別短語的所有拼寫錯誤的排列,可以考慮像一些常見縮寫:

in (.+?) what.*?s the (.+)

,將匹配:

in paris, france whats the weatherin poland what's the weather以及一些其他變化。這不是非常複雜,也將匹配in my backyard what changes the weather

+0

非常感謝你@Laurel我會給它一個去,至於大寫的命令轉換爲小寫,然後解析它,我明白拼寫錯誤會導致問題:)謝謝 – P110

+0

這完美的作品除了當參數是在結束的字符串。我會嘗試看看我是否可以重新加入字符串的末尾。 – P110

+0

'$ re =「〜In(。+?)什麼是(。+?\ z)〜i」; '爲結束參數工作..有點髒,但工程如果你添加到你的答案我會將它標記爲答案 – P110

相關問題