我正在构建一个获取传入短信的应用,然后根据关键字,它会查看该关键字是否与正在运行的任何广告系列相关联.我现在这样做的方法是加载一个关键字列表和可能的拼写组合,然后当短信进来时,我会查看所有关键字和组合,看看是否有匹配.
如何不使用此方法,而是通过实际查找可能与另一个单词匹配的单词.
假设正确的拼写是HAMSTER,通常我会给HMSTER HIMSTER HAMSTAR HAMSTR HAMSTIR等竞选替代品.
这样做有一种聪明的方法吗?
仓鼠
"hamstir".compare_to("仓鼠")?比赛
编辑:
2个字怎么样?假设我们知道SMS中需要匹配两个单词:
正确的第一个词=第一个词
纠正第二个字=和第二个字
短信=第一个词第二个
编辑:
理想情况下,人们应该将逗号分隔的单词发送短信,我会知道在哪里拆分并查找单词.
但是,如果他们不喜欢,如:
独特的关键字 第二个参数
我怎么知道这些词分裂在哪里?第一个单词可能是3个单词长,第二个单词可能是3个或1个或2个等.
在这些示例中,您将如何使用以下技术查找这两个单词?
你会看两次吗?每个需要的参数或关键字一个?
最简单的解决方案是使用difflib包,它具有get_close_matches近似字符串匹配的功能:
import difflib
difflib.get_close_matches(word, possibilities)
Run Code Online (Sandbox Code Playgroud)
您正在寻找的是Levenshtein 距离。
假设您的广告系列列表不是太大,您可以计算输入词与每个广告系列的输入词之间的距离,然后选择最短的那个。要过滤掉完全错误的单词,您可能需要设置最小可接受距离,如果最短距离仍然超出限制,则丢弃输入。
要计算两个单词之间的距离,您可以尝试以下模块之一:
例如,使用levenshtein.py:
from levenshtein import levenshtein
campaigns = (
"HAMSTER",
"TWO WORDED",
"FRIDAY",
)
def get_campaign(word):
return min(campaigns, key=lambda x: levenshtein(word, x))
Run Code Online (Sandbox Code Playgroud)
用法:
>>> get_campaign("HAMSTA")
'HAMSTER'
>>> get_campaign("HAM WORDED")
'TWO WORDED'
>>> get_campaign("FROODY")
'FRIDAY'
>>> get_campaign("FRIDAY")
'FRIDAY'
Run Code Online (Sandbox Code Playgroud)
请注意,这是一种非常简单的方法,即使输入完全不同,它也会始终返回一些内容。