2014-09-10 28 views
0

我在我的程序中使用語音識別,並且比寫出每個可能的單詞組合來執行某個命令更容易,我使用.Contains函數來挑選某些關鍵字。例如...如何停止string.Contains()挑出另一個單詞內的單詞。下面更好的解釋

private void SpeechHypothesized(object sender, SpeechHypothesizedEventArgs e) 
{ 
    string speech = e.Result.Text; 

    if (speech.Contains("next") && speech.Contains("date")) 
    { 
     MessageBox.Show(speech + "\nThe date will be the 11th"); 
    } 
    else if (speech.Contains("date")) 
    { 
     MessageBox.Show(speech + "\nThe date is the 10th"); 
    } 
} 

正如你可以看到,如果語音多少有些,它會顯示一個文本框說什麼假設,然後日期。但是,當我查看文本框中顯示的語音時,它會顯示「下次更新」等內容。因此,該程序正在尋找另一個詞,即「更新」中的「日期」。我不希望發生這種情況,否則它不會那麼準確,如何使.Contains方法自己挑選出單詞,而不是查看其他單詞?謝謝

+1

什麼字符串:

static readonly char[] wordSeparators = { '\n', '\t', ',', '.', '!', '?', ';', ':', ' ', '-', '/', '\\', '[', ']', '(', ')', '<', '>', '@', '"', '\'' }; public static bool ContainsWord(this string input, string word, StringComparer comparer = null) { if (input == null || word == null) throw new ArgumentNullException("input and word must be specified"); if (input.Length < word.Length) return false; if (comparer == null) comparer = StringComparer.CurrentCultureIgnoreCase; return input.Split(wordSeparators, StringSplitOptions.RemoveEmptyEntries).Contains(word, comparer); } 

現在你可以通過這種方式在任何地方使用它'語言'看起來像?它有空間嗎?如果是這樣,您可以分割空間並搜索所需的單詞。 – 2014-09-10 20:14:40

+0

你需要像這樣使用正則表達式來表示特異性。 – alykins 2014-09-10 20:16:25

+1

'var speech = e.Result.Text.Split('');'你不需要改變任何東西 – Jonesopolis 2014-09-10 20:18:44

回答

1

通過使用正則表達式,您可以強制將單詞包圍"word boundaries"

private void SpeechHypothesized(object sender, SpeechHypothesizedEventArgs e) 
{ 
    string speech = e.Result.Text; 

    bool matchesDate = Regex.IsMatch(speech, @"\bdate\b"); 
    if (Regex.IsMatch(speech, @"\bnext\b") && matchesDate) 
    { 
     MessageBox.Show(speech + "\nThe date will be the 11th"); 
    } 
    else if (matchesDate) 
    { 
     MessageBox.Show(speech + "\nThe date is the 10th"); 
    } 
} 

這將匹配「下一個日期」,而不是「下一次更新」。

+1

正則表達式似乎超標。 'String.Split'將很好地完成這項工作。 – 2014-09-10 20:20:22

+2

@PatriceGahide分裂空間將會錯過''date''或'(date)'或其他類似的構造,儘管現在我認爲它可能不會發生在語音識別環境中! – Vache 2014-09-10 20:22:16

+0

是的,那是我的觀點;) – 2014-09-10 20:23:56

0

你使用正則表達式會好得多。

 if (Regex.IsMatch(speech, @"\bnext\b") && Regex.IsMatch(speech, @"\bdate\b")) 
     { 
      MessageBox.Show(speech + "\nThe date will be the 11th"); 
     } 
     else if (Regex.IsMatch(speech, @"\bdate\b")) 
     { 
      MessageBox.Show(speech + "\nThe date is the 10th"); 
     } 
6

替代解決方案,拆分所有的空間和檢查關鍵字

string speech_text = e.Result.Text; 
string[] speech = speech_text.Split(); 

if (speech.Contains("next") && speech.Contains("date")) 
{ 
    MessageBox.Show(speech_text + "\nThe date will be the 11th"); 
} 
else if (speech.Contains("date")) 
{ 
    MessageBox.Show(speech_text + "\nThe date is the 10th"); 
} 
+2

IMO比使用正則表達式更簡單。 – 2014-09-10 20:20:27

2

你可以使用String.Split讓所有單詞。然後使用Ènumerable.Contains來檢查其中一個單詞是否匹配。這裏是一個比較不區分大小寫的一個樣本:

char[] wordSeparators = new[] { '\n', '\t', ',', '.', '!', '?', ';', ':', ' ', '-', '/', '\\', '[', ']', '(', ')', '<', '>', '@', '"', '\'' }; 
string[] words = e.Result.Text.Split(wordSeparators, StringSplitOptions.RemoveEmptyEntries); 
bool containsNext = words.Contains("next", StringComparer.CurrentCultureIgnoreCase); 
bool containsDate = words.Contains("date", StringComparer.CurrentCultureIgnoreCase); 

if (containsNext && containsDate) 
{ 
    MessageBox.Show(e.Result.Text + "\nThe date will be the 11th"); 
} 
else if (containsDate) 
{ 
    MessageBox.Show(e.Result.Text + "\nThe date is the 10th"); 
} 

可能是方便爲extension method

bool containsNext = e.Result.Text.ContainsWord("next"); 
bool containsDate = e.Result.Text.ContainsWord("date"); 
相關問題