模糊文本搜索:正则表达式通配符搜索生成器?
Posted
技术标签:
【中文标题】模糊文本搜索:正则表达式通配符搜索生成器?【英文标题】:Fuzzy Text Search: Regex Wildcard Search Generator? 【发布时间】:2010-12-15 19:02:54 【问题描述】:我想知道是否有某种方法可以在 php 中进行模糊字符串匹配。在长字符串中查找一个单词,即使拼写错误也能找到可能的匹配项;如果由于 OCR 错误而将其关闭一个字符,就会找到它。
我在想一个正则表达式生成器可能能够做到这一点。所以给定一个“疯狂”的输入,它会生成这个正则表达式:
.*((crazy)|(.+razy)|(c.+azy)|cr.+zy)|(cra.+y)|(craz.+)).*
然后它将返回该单词的所有匹配项或该单词的变体。
如何构建生成器: 我可能会将搜索字符串/单词拆分为一个字符数组并构建正则表达式,对新创建的数组执行 foreach 用“.+”替换键值(字符串中字母的位置)。
这是进行模糊文本搜索的好方法还是有更好的方法?某种字符串比较如何根据它的接近程度给我一个分数?我正在尝试查看某些转换错误的 OCR 文本是否包含简短的单词。
【问题讨论】:
您的正则表达式错误 - 将+
替换为 .
感谢您的提示,用 .+ 解决了这个问题
c.+azy
将匹配 calksjdazy
- c
后跟一个或多个字符,后跟 azy
。对于单个字符,使用c.azy
【参考方案1】:
当您不知道正确的词是什么时,字符串距离函数是无用的。我建议使用 pspell 函数:
$p = pspell_new("en");
print_r(pspell_suggest($p, "crazzy"));
http://www.php.net/manual/en/function.pspell-suggest.php
【讨论】:
啊,说明我是PHP新手:没听说过这种方法!很好的建议,这应该被投票。 +1 +1 表明每天都有新东西要学习!但是请注意,pspell_suggest
在给出正确拼写的单词时,将不会为您提供拼写错误的选项。因此,它不会真正满足 OP 的需要。【参考方案2】:
echo generateRegex("crazy");
function generateRegex($word)
$len = strlen($word);
$regex = "\b((".$word.")";
for($i = 0; $i < $len; $i++)
$temp = $word;
$temp[$i] = '.';
$regex .= "|(".$temp.")";
$regex = $regex.")\b";
return $regex;
【讨论】:
OP 要求提供基于 PHP 的解决方案。 同意。但是翻译这个有多难? 翻译成 php - 点击 diff 中的 viewsource 链接查看 java 版本。【参考方案3】:Levenshtein 是字符串Edit-distance 的一个示例。有不同的指标用于不同的目的。熟悉它们并找到适合您的。
【讨论】:
以上是关于模糊文本搜索:正则表达式通配符搜索生成器?的主要内容,如果未能解决你的问题,请参考以下文章