2

ユーザーが「はい」または「いいえ」と答えたかどうかを解読するために、音声データの配列リストを繰り返し処理しています。シンプルねえ...

これは、「はい」と「いいえ」の両方を含む不明確な応答を検出する必要がある最初のチェックです。完璧に動作しますが、それを見るだけで、投稿するのが恥ずかしいと思います。大幅に簡略化できます。

    if ((element.toString().startsWith("yes ")
    || element.toString().endsWith(" yes")
    || element.toString().contains(" yes "))
    && (element.toString().startsWith("no ")
    || element.toString().endsWith(" no")       
    || element.toString().contains(" no "))) {

    // I heard both yes and no - inform user I don't understand

ユーザーが希望する自然な音声を使用して受け入れたり拒否したりできるようにしたいので、配列データに次のような起こりそうもない事態を考慮する必要があります。

  • はい・いいえ
  • sey on
  • はいノック
  • 昨日いいえ
  • 昨日ノック
  • ベイズの定理ポルノ

私はこれまで多くの正規表現の投稿やチュートリアルを行ってきましたが、何をしても、投稿されたコードよりもうまく機能する解決策を見つけることができません。空白[\\s]が存在するか'|' いいえ、解決できません...

よろしくお願いします!

4

1 に答える 1

6

「yes」または「no」という単語だけが必要な場合(つまり、「ベイズの定理ポルノ」と「昨日」のものが一致しない\b場合) 、正規表現の境界文字として使用できます: PatternJavaDoc境界チュートリアル

入力をすでに小文字にしていると仮定すると、これは機能するはずです。

Pattern yes = Pattern.compile(".*\\byes\\b.*");
Pattern no = Pattern.compile(".*\\bno\\b.*");
...
bool matchesYes = yes.matcher(input).matches();
bool matchesNo = no.matcher(input).matches();

if (matchesYes == matchesNo) {
    ... //Do "invalid answer" here -
    //we either matched both (true, true) or neither (false, false)
} else if (matchesYes) {
    ... //Do "Yes" here
} else { //Else matches No
    ... //Do "No" here
}

テストコード:

private static Pattern yes = Pattern.compile(".*\\byes\\b.*");
private static Pattern no = Pattern.compile(".*\\bno\\b.*");
/**
 * @param args
 */
public static void main(String[] args) {
    TestMethod("yes"); //Yes
    TestMethod("no"); //No
    TestMethod("yesterday"); //Bad
    TestMethod("fred-no-bob"); //No
    TestMethod("fred'no'bob"); //No
    TestMethod("fred no bob"); //No
    TestMethod("snow"); //Bad
    TestMethod("I said yes"); //Yes
    TestMethod("yes no"); //Bad
    TestMethod("no yes"); //Bad
}

private static void TestMethod(String input) {
    System.out.print("Testing '" + input + "': ");
    bool matchesYes = yes.matcher(input).matches();
    bool matchesNo = no.matcher(input).matches();

    if (matchesYes == matchesNo) {
        System.out.println("Bad");
    } else if (matchesYes) {
        System.out.println("Yes");
    } else {
        System.out.println("No");
    }
}
于 2012-05-20T19:28:06.703 に答える