使用levenshtein匹配目标字符串+额外文本

时间:2011-09-09 21:03:20

标签: php levenshtein-distance

我正在开发一个网站转换项目,我需要匹配不精确的字符串。我正在考虑使用leveshtein,但我不知道我应该为我的任务设置什么参数。

假设我有一个目标字符串elephant。我想要的匹配是elephant mouse,例如

<?

$target = "elephant";

$data = array(
  'elephant mouse',
  'rhinoceros',
  'alligator',
  'hippopotamus',
  'rat',
);

foreach ( $data as $datum ) {
  echo "$target >> $datum == " .  levenshtein($target, $datum) . "\n";
}

我得到了结果

elephant >> elephant mouse == 6
elephant >> rhinoceros == 10
elephant >> alligator == 7
elephant >> hippopotamus == 10
elephant >> rat == 7

因此,虽然rhinohippo位于10,但在我的实际数据集中,我无法区分elephant mouserat和{{1}之间的区别这是伪造的数据,但是在我的数据集中,长度更接近的单词得分远低于alligator的单词。

我应该如何配置target + extra的选项?我可以为插入,替换和删除的成本设置新的整数值。什么加权会给我我想要的东西?

(如果你能想到一个更好的标题,请编辑我的帖子)。

2 个答案:

答案 0 :(得分:2)

加权levenshtein($target, $datum, 1, 10, 10)给了我

elephant >> elephant mouse == 6
elephant >> rhinoceros == 65
elephant >> alligator == 52
elephant >> hippopotamus == 64
elephant >> rat == 60

哪种方法效果很好:)插入成本低,而替换和删除都很高。这意味着target + extra得分较低,其中长度相等或较短但字符不同的字符串成本较高。

答案 1 :(得分:1)

你应该尝试将单个单词与levenshtein()匹配,而不是整个短语,因为如果一个短语包含的内容类似于被搜索的单词,那么你显然想要将短语视为一个好的匹配。换句话说,将$datum中的每个字符串拆分为单个字词,为每个字词运行levenshtein($target, $word),然后选择最小的数字。 (如果$target也可以包含多个单词,那么您也需要拆分它。)

我强烈怀疑你可以通过调整插入/删除/替换成本来达到预期的效果,因为Levenshtein不考虑单个单词,只考虑整个字符串。您可以尝试使插入非常便宜,但这也可以提供良好的分数,例如“qwErtyLasdEdgfhdPasdxcHdfjAlkjNlkhTkjh”,因为它包含所有正确的字母。