C# 分类或关键字匹配自然语言字符串或短语

C# 分类或关键字匹配自然语言字符串或短语,c#,machine-learning,nlp,artificial-intelligence,match,C#,Machine Learning,Nlp,Artificial Intelligence,Match,这是我关于StackOverflow的第一篇文章,如果缺少正确的信息,请道歉 情景 我正在从谷歌天气API转移到BOM(澳大利亚)天气服务。我使用streamreaders等工具从BOM中获取了天气数据,但我一直停留在与每日天气预报相匹配的图像图标上 我对旧的谷歌天气API所做的是相当残酷的,但却成功了。GoogleWeatherAPI只提供了几种不同类型的预测,我可以将它们组合成一个字符串,然后在imageURL中使用 我用谷歌天气API做的例子 imageDay1.ImageUrl=“ima

这是我关于StackOverflow的第一篇文章,如果缺少正确的信息,请道歉

情景

我正在从谷歌天气API转移到BOM(澳大利亚)天气服务。我使用streamreaders等工具从BOM中获取了天气数据,但我一直停留在与每日天气预报相匹配的图像图标上

我对旧的谷歌天气API所做的是相当残酷的,但却成功了。GoogleWeatherAPI只提供了几种不同类型的预测,我可以将它们组合成一个字符串,然后在imageURL中使用

我用谷歌天气API做的例子

imageDay1.ImageUrl=“images/weather/”+lbWeatherDay1Cond.Text.Replace(“,string.Empty)+.png”

“大部分阳光充足”=mostlysunny.png

“Sunny”=Sunny.png

“下雨的机会”=chanceofrain.png

“淋浴”=淋浴.png

“部分多云”=部分云.png

每日预测有15种不同的可能选择

我现在和BOM(澳大利亚气象服务)的问题是

可能是早阵雨

一两个淋浴,待会再清理

还有成千上万。。。。没有标准

我所希望的是,这里的一些伟大的思想有可能从这个字符串中的关键字创建一个字符串?类似于“Showers.png”中的“Showers”,或者更复杂一些,将“Showers的机会”识别为“Chanceshowers.jpg”,而将“Shower或two”保留为“Showers.png”

我很容易接受任何想法或解决方案(希望是c#)。只要它非常轻量级(5天预测必须重复该过程),并且可以捕获几乎任何场景

此时,我将继续使用String.Replace,在String.Replace之后,在String.Replace之后,在String.Replace选项。。。。现在就可以了,但我不能像这样把它投入生产

干杯

特伦特


etc

我在评论中注意到您正在尝试使用regex查找表,它可能足以解决问题。不过,我将进一步介绍Adriano提到的更健壮的贝叶斯解决方案

这是一个与机器学习和人工智能相关的问题。它涉及一些自然语言处理,比如谷歌如何解释用户的要求,或者邮件垃圾邮件过滤器如何工作

Sebastian Thrun在以下作为在线课程一部分的视频中描述了一个简单而有趣的系统。它开始描述一种基本方法,通过该方法,算法可以学习将一组单词(如来自电子邮件的单词)分类为“垃圾邮件”或“非垃圾邮件”

(大部分视频都很短。)

  • -
  • -
  • -
  • -
  • -
  • -
  • -
  • -
  • -
  • 这种贝叶斯方法对动态输入具有鲁棒性,并且学习速度相当快。然后,在消耗了足够的训练数据之后,您只需要保存一个概率查找表,并在运行时进行一系列算术计算


    在这个基础上,你可以使用相同的方法来进行多个分类,例如每个天气图像的一个。

    < P>如果你已经捕获了网页,你就不能捕捉到他们把图片放进去并获得图像的片段吗?如果有“部分阳光”的纯文本,您也可以捕获该分区并使用自己的图片。仅仅为了刮天气而使用贝叶斯网听起来非常痛苦。

    您是否尝试过使用查找表(您将提取第一个匹配项),其中的键是正则表达式?如果没有标准,就不能依赖定义良好的算法。一个可爱的(而且更健壮的)选择可能是贝叶斯算法(如果你真的不能用任何其他方式来处理这个问题的话)。Arianao,谢谢你的建议,但是我不是世界上最伟大的编码器,甚至不知道如何从查找表或贝叶斯算法开始。如果你能给我指出一些MSDN文章等,我相信我能很快学会:)。谢谢你的帮助@Trent您需要实现一个
    字典
    ,其中键字符串是正则表达式,值字符串是相应图像的名称。您将根据此字典中的所有正则表达式测试输入,对于第一个匹配的正则表达式,您将获得相应的图像值。Regex:@Rotem,字典是无序的,所以如果字符串匹配多个Regex,“第一个匹配的”将是不确定的。最好使用有序列表,例如,
    list
    。查看贝叶斯(别忘了你并不需要非常好的东西)。查找表只是一个…列表,看看.NET上任何Regex类的例子。我不认为他真的想处理一个有几千个(变量)情况的switch语句…是的,我只是在看这个,如果我在做if和else if语句,这将是一样的?看看bom上的brisbane,我也会这样做。
    $api_string = "Mostly sunny"; 
    $image = "default.png";
    
    switch($api_string)
    {
        case "Mostly sunny":
            $image = "mostlysunny.png";
        break;
        case "showers":
            $image = "showers.png"
        break;
    }