【问题标题】:how can i match two strings even if they are 1 character different?我如何匹配两个字符串,即使它们有 1 个字符不同?
【发布时间】:2012-10-29 08:59:58
【问题描述】:

我有一个庞大的句子数据库,但问题是“我很好”等句子与“我很好”不匹配,反之亦然或“那是我的吗?”与“是我的”不匹配,反之亦然,当我希望它们被检测为匹配时。

我已经制作了复杂而混乱的函数,试图用通配符和研究来做到这一点,但这只是一团糟。而且我确定必须有一种方法可以使用这种 1 字符 lee 方式进行搜索。如果可以的话,我想控制哪些字符以这种背风方式出现,就像在我的示例中,主要问题原因是问号和半引号。 (?')。

我目前使用带有 php 和 mysql 的平面选择查询来执行匹配查询。

我希望得到一些帮助来解决这个问题,以便我可以清理当前执行工作不一致的大量代码。

如果有人想查看检查匹配的代码查询是这样的:

$checkqwry = "select * from `eng-jap` where (eng = '$eng' or english = '$oldeng' or english = '$oldeng2') and (jap = '$jap' or japanese = '$oldjap' or japanese = '$oldjap2');";

查询的目的是检查数据库中是否已经存在 $eng 和 $jap 的翻译。你看到 $oldeng $oldeng2 和 $oldeng3 等的原因就像我说的那样,即使有或没有问号等等,我的混乱愚蠢尝试匹配。其中一些 $oldeng 变量有问号或半引号等,而其他变量则没有。上面有更多代码附加和删除问号和东西。是的,这是一团糟。

【问题讨论】:

  • 您想寻找某种String Metric 算法,它会告诉您两个字符串“相距”多远,并根据您的容忍程度进行调整。

标签: php mysql


【解决方案1】:

您想使用上面提到的 String Metric 算法,PHP 在 http://php.net/manual/en/function.levenshtein.phphttp://www.php.net/manual/en/function.similar-text.php 中内置了这个函数。

MySQL 本身并没有实现这个(特定算法),但有些人继续编写存储过程来完成同样的任务:http://www.artfulsoftware.com/infotree/queries.php#552

在我看来,使用可以处理任意更改的字符串度量比去除标点符号更好,并且还可以捕获遗漏、换位等...

【讨论】:

  • 我刚刚创建了一个函数来匹配相似文本在完整索引比较给出的结果中返回高于 91% 的情况。一个小问题是一个小句子,比如 1 个单词。即使是一个字符差异也只会返回 85%,所以我需要让流量来考虑句子的长度。但我可以把它全部放在一个比较函数中,所以最后我还是会清理我之前弄的烂摊子。
【解决方案2】:

在比较字符串之前简单地去掉非字母数字字符可能会更好。

【讨论】:

  • 是的,这适用于单向比较,但反之则不行。数据库中已经存在的句子呢?或 ' 并且有人在没有它的情况下搜索它。那么它仍然不会匹配。
【解决方案3】:

可以使用sql中的replace函数将“'”替换为“”和“?”用“”。

【讨论】:

  • 这就是我目前正在做的事情,就像我说的,这是一团糟。
【解决方案4】:

您可能想查看 MySQL 中的 natural language full text searches。将 FULLTEXT 索引添加到 eng 列。

 ALTER TABLE `eng-jap` ADD FULLTEXT INDEX `full` (`eng`) ;

然后,使用匹配函数:

 select * from `eng-jap` where match(eng)  against ('Im happy');

这将返回我很高兴我很高兴

如果您选择相关性分数,例如:

  select id, match(eng)  against ('Im happy') from `eng-jap` where match(eng)  against ('Im happy');

您可以使用它来进一步处理 PHP 中的匹配项并进行过滤。

[编辑]:刚刚验证了 yesterdayyesterday? 的相关性分数也相同:

 select *, match(eng)  against ('yesterday') as mc from `eng-jap`

结果是:

  6, yesterday?, 0.9058732390403748
  7, yesterday, 0.9058732390403748

注意:要应用全文索引,您的 mysql 引擎必须是 MyISAM。此外,句子必须包含超过 3 个字符。索引似乎与“是”之类的词不匹配。

【讨论】:

  • 我认为 Aea 的回答看起来也可以为我解决这个问题,但是由于您包含了更详细的步骤,所以我给了您复选标记。我还没试过,谢谢!
  • 编辑:实际上这匹配了我不想要的各种东西。有没有办法调整公差?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多