2016-04-11 6 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」] =「ロンドン」という$クエリを意味します。しかし、一度に1つの単語しかサポートできません。複数の単語をサポートする方法はありますか?

TL; DR

  • コードの別々のパラメータへ
  • 複数の単語
  • はあなた」で_を置き換えることができ、文字列として

乾杯

+0

自然言語の認識と構文解析を行い、意味を識別しますか?それは...少し答えが広いです。地球上の最大のテクノロジー企業は、これをクラックするために重大なリソースを投資しています。スタックオーバーフローの簡単な解決策を期待していない。 – deceze

+0

あらかじめ定義されたトリガーを持つ自然で事前定義されたコマンドはありません。私はちょうど何かを認識する方法があるのか​​どうか疑問に思った:後で______に私に思い出させて、どのコマンドを私が@decezeに言及しているかを認識させるようにする。 – P110

+2

あなたが行きたい距離に依存する。あなたはコマンドの固定リストを持っていて、類似性を計算することができます(例えば[類似テキスト](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 weatherおよびin poland what's the weatherなど、いくつかの変形があります。ひどく洗練されたものではなく、in my backyard what changes the weatherと一致します。

+0

大変ありがとう@Laurel私は大文字小文字に変換される前に小文字に変換され、スペルミスが問題を引き起こすことを理解しています:)ありがとう – P110

+0

パラメータが最後にある場合を除いてこれは完全に動作します文字列の私はストリングの終わりに再び参加できるかどうかを試してみる。 – P110

+0

'$ re ="〜In(。+?)(。+?\ z)〜i "は何ですか? 'は最後のパラメータのために働きます。ビット汚れていますが動作します。答えに追加すると答えとしてマークします – P110

関連する問題