c#将因子合二为一

时间:2013-10-19 22:08:02

标签: c# speech-recognition

我会尽力说出最好的话。我希望有多个因素,并使它们等于一个可重用因子。作为一个例子,我正在做一个语音识别项目,我希望sup代表一个单词列表。

EX :(甚至不知道if语句是否适合这项工作。)

var lower = speech.ToLower();
{
  if (lower.Contains("hello") || lower.Contains("hi") || lower.Contains("hey"))                    
    {                        
      object == sup;                    
    }
}

这种方式现在代表你好,嗨,嘿,让事情变得更简单。再一次,我甚至不知道if语句是否适合该作业,或者是否支持对象适合此类场景。我希望这是有道理的,谢谢你!

3 个答案:

答案 0 :(得分:1)

当然,创建一个字典,其中包含一侧的值列表和另一侧的响应。

private IDictionary<List<String>, List<String>> _responses = new Dictionary<List<String>, List<String>>();

_responses.Add(
            new List<String> { "Hello there!", "Hey mate", "Hi!" }},
            new List<String> { "sup" );

_responses.Add(
            new List<String> { "Buddy", "Mate", "Hombre" }},
            new List<String> { "sup");

现在为了检索一些东西:

foreach(var keyword in _responses.Keys){
 if(keywords.Contains("sup"){
  return _responses[keyword];
 }
}

搜索“sup”会返回适当的回复列表。我也使用List<String>作为查找值,这样您就可以将多个关键字链接到相同的搜索结果。

如果您要输入由多个值组成的字符串,只需添加一个外部循环:

整个重写:

此示例假定您有一个输入字符串。您的要求是检查此输入字符串是否包含任何一组单词。每组单词都应该能够用一个单词来引用。

void Main()
{
    var babel = new Babel("hi homies, this is for my mate out there.");
    if(babel.HasAnswer("sup") && babel.HasAnswer("friend")){
        Console.WriteLine ("It has both!");
    } else {
        Console.WriteLine ("Boo Jeroen you suck");
    }
}

public class Babel {
    private IDictionary<List<String>, List<String>> _responses = new Dictionary<List<String>, List<String>>();
    private String query;

    public Babel(string query){
        this.query = query;
        _responses.Add(
                new List<String> { "sup" },
                new List<String> { "hello", "hey", "hi"});

        _responses.Add(
                new List<String> {"friend" },
                new List<String> { "buddy", "mate", "hombre" });
    }

    public bool HasAnswer(string input){

     foreach(var token in input.Split(' ')) {
      foreach(var keyword in _responses.Keys){
        if(keyword.Contains(token)){
         return ContainsAny(_responses[keyword]);
        }
      }
     } 
     return false;
    }

    private bool ContainsAny(List<String> toCompare){
        foreach(string item in toCompare){
            foreach(string token in query.Split(' ')){
                if(token == item) return true;
            }
        }
        return false;               
    }


}

输出:

  

它有两个!

这种方法的好处:添加一组新单词就像在词典中添加一个条目一样简单。非常高的可扩展性!你也可以让多个值引用同一个列表(如果你想创建“howdie”,它应该引用与“sup”相同的值,你可以将它添加到列表中并完成)。

答案 1 :(得分:1)

如果您想要多个输入指向一个输出,那么Dictionary看起来是个不错的选择。请注意constructor我使用StringComparer.OrdinalIgnoreCase作为IEqualityComparer<string>获取StringComparer对象,该对象执行不区分大小写的序数字符串比较,因此您不需要使用{在Sting.ToLower()上使用密钥时{1}}。

Dictionary

要找到正确的响应,您可以循环遍历Dictionary<string,string> simple = new Dictionary<string,string>(StringComparer.OrdinalIgnoreCase) { {"hello", "sup"}, {"hi", "sup"}, {"hey", "sup"} } ,如下所示。由于你没有将密钥传递到字典中,我认为你需要在这里使用ToLower()。

KeysCollection

答案 2 :(得分:0)

哈里森说的基本上是什么,但我会使用下面的TryGetValue。

using System;
using System.Collections.Generic;

namespace Test
{
    class Program
    {
        interface Word
        {
            String GetResponse();
        }

        public class Sup : Word
        {
            public String GetResponse()
            {
                return "Hello back to you!";
            }
        }

        public class Lates : Word
        {
            public String GetResponse()
            {
                return "Sorry to see you go.";
            }
        }

        static void Main(string[] args)
        {
            var sup = new Sup();
            var lates = new Lates();
            var mapping = new Dictionary<String, Word>(StringComparer.OrdinalIgnoreCase)
            {
                {"hi", sup},
                {"hello", sup},
                {"hey", sup},
                {"bye", lates},
                {"later", lates},
                {"astalavista", lates},
            };

            Word word;
            if (mapping.TryGetValue("HELLO", out word))
                Console.WriteLine(word.GetResponse());

            if (mapping.TryGetValue("astalavista", out word))
                Console.WriteLine(word.GetResponse());

            if (mapping.TryGetValue("blaglarg", out word))
                Console.WriteLine(word.GetResponse());
        }
    }
}