3

我正在构建一个应用程序,它通过 Twilio 从 SMS 文本中获取输入。我想建立一个表格,将传入的 SMS 正文与适当的响应相匹配。

例如,假设我正在构建一个 NFL 文本消息。

有人在“红皮队”中发短信,我们回短信,“红人队在联邦快递球场打球” 有人在“小马队”发短信,我们回短信,“小马队是印第安纳州的骄傲。”

这是棘手的部分:

当然,我们的 Rails 应用程序需要通过正则表达式来解释传入的团队名称,因为很多人会发短信:Redskins 或 REDSKINS 或 REDSKIN 或 Redskin 或 REDskin ......

对于一两个团队,可以将 RegExp 和响应硬编码到控制器中……但是对于 30 个团队,这似乎是错误的。(并且有 120 个条目——比如说所有职业运动——甚至更糟)。

有没有人有任何关于从输入阶段获取团队名称的提示,通过 DB 表阶段,中间有一个“RegExp”转换?

提前致谢。

4

4 回答 4

2

我不认为你想要正则表达式。拼写错误怎么办?为了提供帮助(尤其是来自 txt msg),我认为您也希望允许缩短。

也许一个基于Soundex的库或拼写更正的东西会是最好的。你想要一个最接近的匹配算法而不是模式匹配算法。

于 2011-04-05T14:17:17.733 回答
2

对于少量关键字,我建议使用包含关键字和别名的两表方法,始终以小写形式存储。将输入转换为小写。对于每个关键字(例如 redskins),您在 Alias 中手动添加 5-10 个变体(包括正确的变体),所有这些变体都有 Alias.keyword_id = 关键字的 id。因此,您只需在 Alias 中搜索用户输入,如果找到匹配项,您将获得关键字的 keyword_id。

它有两个优点:快速且易于扩展……如果您记录“不匹配”,您将获得一个新别名列表,以便将其添加到 dbase 一次。比尝试通过正则表达式更容易和更可靠。

于 2011-05-13T04:40:12.067 回答
0

如果短信不是太长,你应该先把它切成文字,然后与团队名称列表相交。

array_of_team_names = %w(Redskins Colts ... ) # keep it all capitalized
'cOLts blah blah'.scan(/\w+/).map{|word| word.capitalize} & array_of_team_names
# => ['Colts']

如果您想按照 Drysdam 的建议处理错误类型,或者如果您想更准确地处理较大的文本,您应该使用一些特定的库。

于 2011-04-05T14:26:43.740 回答
0

我认为您要问的是“我如何避免将正则表达式硬编码到我的代码中,因为我可能有很多,而且它们实际上是一个数据元素”?

如果你想用正则表达式进行匹配,你应该注意你可以从一个字符串创建一个正则表达式,这样你就可以很容易地拥有一个包含字符串形式的正则表达式列的表。然后,您可以动态创建用于搜索传入字符串的正则表达式对象数组。诀窍是当你有比赛时该怎么做。您需要制定一组规则(另一个表),基本上说明根据传入文本选择哪个响应。例如,如果您的规则只是“根据球队名称匹配并说出他们的比赛地点”,那很容易。您正在搜索的每个正则表达式都映射到一个动作(“The Bears play in Chicago”)。如果你的规则更复杂(寻找熊,然后看看“时间表”这个词是否

于 2011-04-05T15:29:16.777 回答