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

9

这是我在StackOverflow上的第一篇文章,如果缺少正确的信息请谅解。

情景。

我正在从Google天气API转移到BOM(澳大利亚)天气服务。我已经成功地使用流读取器等获取了来自BOM的天气数据,但我卡在了与每日预报相匹配的图像图标上。

我在旧的Google天气API中所做的事情非常残酷但有效。Google天气API只提供了几种不同类型的预测,我可以将它们组合成一个字符串,然后再在imageURL中使用。

以下是我在Google天气API中所做的示例...

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

"大部分晴朗"=mostlysunny.png

"晴朗"=sunny.png

"有雨可能"=chanceofrain.png

"阵雨"=showers.png

"局部多云"=partlycloudy.png

每日预报有15种不同的可能选项。

现在我遇到了问题,与BOM(澳大利亚天气服务)相关的问题是...

可能有早晨阵雨

阵雨或两个,后来变晴

还有成千上万的可能性...没有标准。

我希望能够从这个字符串中的关键字创建一个字符串。例如将“阵雨”转化为“Showers.png”,或者更复杂一些,将“有阵雨可能”识别为“Chanceshowers.jpg”,同时保留“阵雨或两个”作为“Showers.png”。

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

目前,我正在使用String.Replace、String.Replace、String.Replace选项继续进行。现在可以,但我不能像这样推出生产。

谢谢大家!

Trent


3
你尝试过使用查找表(提取第一个匹配项),其中键是正则表达式吗?如果没有标准,你就不能依赖于一个定义明确的算法。一种可爱(且更加健壮)的选择可能是朴素贝叶斯算法(如果你真的无法以其他方式处理这个问题)。 - Adriano Repetti
1
Arianao,感谢您的建议,但我并不是世界上最优秀的编码人员,甚至不知道如何开始使用查找表或贝叶斯算法。如果您可以指向一些MSDN文章等,我相信我很快就能学会它 :)。感谢您的帮助! - Trent Steenholdt
@Trent,你需要实现一个 Dictionary<string, string>,其中键字符串是一个 正则表达式,值字符串是相应图像的名称。你将测试输入与此字典中的所有正则表达式匹配,并对于第一个匹配的表达式,你将获得相应的图像值。正则表达式:http://msdn.microsoft.com/en-us/library/ms228595(v=vs.80).aspx - Rotem
3
@Rotem,字典是无序的,因此如果一个字符串匹配了多个正则表达式,“第一个匹配项”将是不确定性的。最好使用有序列表,例如 List<Tuple<string, string>> - Joe White
1
请查看这篇SO帖子,了解贝叶斯(不要忘记您不需要非常好的东西)。查找表只是一个...列表,请查看.NET上Regex类的任何示例。 - Adriano Repetti
显示剩余3条评论
3个回答

3
我注意到评论中您正在尝试正则表达式查找表,这可能足以解决问题。然而,我将扩展Adriano提到的更强大的贝叶斯解决方案。
这是一个与机器学习和人工智能相关的问题。它涉及一些自然语言处理,例如Google如何尝试解释用户询问的内容,或邮件垃圾邮件过滤器如何工作。
Sebastian Thrun在以下视频中描述了一个简单而有趣的系统,该系统是在线课程的一部分。它开始描述了一种基本方法,通过该算法可以将单词集合(例如来自电子邮件)分类为“垃圾邮件”或“非垃圾邮件”。
(大多数视频非常短。)
  1. 垃圾邮件检测 - 测验答案
  2. 垃圾邮件概率 - 测验答案
  3. 最大似然 - 测验答案
  4. 与贝叶斯网络的关系 - 测验答案
  5. 分类测验 - 测验答案
  6. 分类2测验 - 测验答案
  7. 分类3测验,一个人为的例子
  8. 测验答案 & 拉普拉斯平滑 - 测验答案
  9. 平滑分类测验 - 测验答案
  10. 最终测验 - 测验答案

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

有了这个基础,您可以将相同的方法应用于多个分类,例如每个天气图像一个分类。


1

如果您已经捕获了网页,那么您是否可以仅捕获放置图片的部分并以此方式获取图像?如果有“部分晴朗”的纯文本,您也可以捕获该部分并使用自己的图片。只是为了抓取天气信息而使用贝叶斯网络听起来非常痛苦。


看看BOM上的布里斯班,我会做同样的事情。http://www.bom.gov.au/qld/forecasts/brisbane.shtml - almog.ori

-3
$api_string = "Mostly sunny"; 
$image = "default.png";

switch($api_string)
{
    case "Mostly sunny":
        $image = "mostlysunny.png";
    break;
    case "showers":
        $image = "showers.png"
    break;
}

等等


1
我认为他并不想处理有几千个(变量)情况的switch语句... - Adriano Repetti
是的,我正在看这个,如果我使用if和else if语句,那么这将是完全相同的吗? - Trent Steenholdt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接