【问题标题】:How do I fuzzy match word to a full word (and only full word) in a sentence?如何将单词与句子中的完整单词(并且只有完整单词)模糊匹配?
【发布时间】: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 - 如果那个regex 模块可以做模糊,一两个字母丢失。从字典(或您感兴趣的单词)中制作一个正则表达式。这个 HERE 有这个工具(在试用版中起作用)可以做到这一点。它从字典单词或字符串中创建一个三叉树。这是175,000 一个字。
  • @zelusp:这些正则表达式中的 && 不是集合运算符,它只是一个文字。集合运算符只出现在字符集中,介于“[”和“]”之间。
  • \w 匹配 1 个单词字符,\W 匹配 1 个非单词字符。它们不是字边界检查。 \b 是字边界检查。还有 \m 用于词的开头和 \M 用于词尾边界检查。如果您想确保它们得到执行,您可能希望将它们放在模糊位之外。

标签: python regex fuzzy-search


【解决方案1】:

'(?b)\m(?:WORD){e&lt;=2}\M'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-27
    • 2012-04-17
    相关资源
    最近更新 更多