在python中匹配错误拼写的单词与正确的拼写单词

Har*_*rry 3 python regex

我正在构建一个获取传入短信的应用,然后根据关键字,它会查看该关键字是否与正在运行的任何广告系列相关联.我现在这样做的方法是加载一个关键字列表和可能的拼写组合,然后当短信进来时,我会查看所有关键字和组合,看看是否有匹配.

如何不使用此方法,而是通过实际查找可能与另一个单词匹配的单词.

假设正确的拼写是HAMSTER,通常我会给HMSTER HIMSTER HAMSTAR HAMSTR HAMSTIR等竞选替代品.

这样做有一种聪明的方法吗?

仓鼠

"hamstir".compare_to("仓鼠")?比赛

编辑:

2个字怎么样?假设我们知道SMS中需要匹配两个单词:

正确的第一个词=第一个词

纠正第二个字=和第二个字

短信=第一个词第二个

编辑:

理想情况下,人们应该将逗号分隔的单词发送短信,我会知道在哪里拆分并查找单词.

但是,如果他们不喜欢,如:

独特的关键字 第二个参数

我怎么知道这些词分裂在哪里?第一个单词可能是3个单词长,第二个单词可能是3个或1个或2个等.

在这些示例中,您将如何使用以下技术查找这两个单词?

你会看两次吗?每个需要的参数或关键字一个?

Dav*_*son 8

最简单的解决方案是使用difflib包,它具有get_close_matches近似字符串匹配的功能:

import difflib
difflib.get_close_matches(word, possibilities)
Run Code Online (Sandbox Code Playgroud)


Sha*_*hin 5

您正在寻找的是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)

请注意,这是一种非常简单的方法,即使输入完全不同,它也会始终返回一些内容。