如何在一个句子中将单词与一个完整单词(并且只有完整单词)模糊匹配?

时间:2016-04-25 23:21:43

标签: python regex fuzzy-search

大多数commonly misspelled English words都存在两到三个印刷错误(替换组合 s ,插入 i 或字母删除 d )从他们正确的形式。即单词对absence - absense中的错误可归纳为1 s ,0 i 和0 d

使用 to-replace-re regex python module可以模糊匹配查找单词及其拼写错误。

下表总结了从一些句子中对一个感兴趣的词进行模糊分段的尝试:

enter image description here

  • Regex1在word中找到最佳sentence匹配,最多允许2个匹配 错误
  • Regex2在word中找到允许的最佳sentence匹配 尝试仅操作(我认为)整个单词时最多2个错误
  • Regex3在word允许的时间内找到最佳sentence匹配 只运行(我认为)整个单词时最多2个错误。我不知何故错了。
  • Regex4在word允许的时间内找到最佳sentence匹配 最多2个错误(我认为)寻找匹配结束时是一个单词边界

如何编写正则表达式,如果可能的话,在这些单词 - 句子对上消除假阳性和假阴性模糊匹配?

一种可能的解决方案是仅将句子中的单词(由空格包围的字符串或行的开头/结尾)与感兴趣的单词(主要单词)进行比较。如果主要单词和句子中的单词之间存在模糊匹配(e <= 2),则从句子中返回该完整单词(并且只返回该单词)。

代码

将以下数据框复制到剪贴板:

            word                  sentence
0      cub cadet              cub cadet 42
1        plastex              vinyl panels
2            spt  heat and air conditioner
3     closetmaid                closetmaid
4          ryobi           batteries kyobi
5          ryobi       10' table saw ryobi
6  trafficmaster           traffic mast5er

现在使用

import pandas as pd, regex
df=pd.read_clipboard(sep='\s\s+')

test=df
test['(?b)(?:WORD){e<=2}']=df.apply(lambda x: regex.findall(r'(?b)(?:'+x['word']+'){e<=2}', x['sentence']),axis=1)
test['(?b)(?:\wWORD\W){e<=2}']=df.apply(lambda x: regex.findall(r'(?b)(?:\w'+x['word']+'\W){e<=2}', x['sentence']),axis=1)
test['(?V1)(?b)(?:\w&&WORD){e<=2}']=df.apply(lambda x: regex.findall(r'(?V1)(?b)(?:\w&&'+x['word']+'){e<=2}', x['sentence']),axis=1)
test['(?V1)(?b)(?:WORD&&\W){e<=2}']=df.apply(lambda x: regex.findall(r'(?V1)(?b)(?:'+x['word']+'&&\W){e<=2}', x['sentence']),axis=1)

将表格加载到您的环境中。

1 个答案:

答案 0 :(得分:2)

执行'(?b)\m(?:WORD){e<=2}\M'