【发布时间】:2016-04-25 23:21:42
【问题描述】:
大多数commonly misspelled English words 出现两个或三个印刷错误(替换s、插入i 或字母删除d 的组合)从他们的正确形式。 IE。单词对absence - absense中的错误可以概括为有1个s、0个i和0个d。
可以使用 to-replace-re regex python module 进行模糊匹配以查找单词及其拼写错误。
下表总结了从某个句子中对感兴趣的词进行模糊分割的尝试:
- Regex1 在
sentence中找到最好的word匹配,最多允许2 个 错误 - Regex2 在
sentence中找到最佳的word匹配,允许在 尝试仅对(我认为)整个单词进行操作时出现最多 2 个错误 - Regex3 在
sentence中找到最佳的word匹配,允许在 仅对(我认为)整个单词进行操作时出现最多 2 个错误。不知怎的,我错了。 - Regex4 在
sentence中找到最佳的word匹配,允许在 大多数 2 错误,同时(我认为)寻找匹配的结尾是一个单词边界
如果可能的话,我将如何编写一个正则表达式来消除这些词句对上的误报和误报模糊匹配?
一种可能的解决方案是仅将句子中的单词(由空格或行的开头/结尾包围的字符串)与感兴趣的单词(主词)进行比较。如果主要单词和句子中的单词之间存在模糊匹配 (e
代码
将以下数据框复制到剪贴板:
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)
将表加载到您的环境中。
【问题讨论】:
-
这些内联修饰符是
(?V1)、(?b),它们是什么意思? -
你如何比较一个模糊的词和一个真实的词?你在使用某种字典吗?最简单的方法是在空格上拆分并使用自定义三叉树,您可以将字典中的所有单词写入该树。当您遍历树时,您可以允许 N 个字母不合适。您需要特殊的分支代码。
-
@zelusp:这些正则表达式中的 && 不是集合运算符,它只是一个文字。集合运算符只出现在字符集中,介于“[”和“]”之间。
-
\w 匹配 1 个单词字符,\W 匹配 1 个非单词字符。它们不是字边界检查。 \b 是字边界检查。还有 \m 用于词的开头和 \M 用于词尾边界检查。如果您想确保它们得到执行,您可能希望将它们放在模糊位之外。
标签: python regex fuzzy-search