【问题标题】:Matching best similar array element匹配最佳相似数组元素
【发布时间】:2019-12-31 07:20:55
【问题描述】:

我有一个关键字数组,我在其上运行foreach 循环并将每个元素与特定的搜索词匹配。例如我有类似的数组

Array(
   [0] => polka dresses
   [1] => polka clothes
   [2] => polka dots dress
   [3] => polka dots bottoms
)

然后我在我的数组中搜索术语polka。使用strposstristr 时会给出结果(也尝试过similar_text 但没有结果)。

问题

如果我搜索polka,它可以工作,但如果我不小心输入p0lka,那么它不会给出任何结果。 有没有办法做到这一点。

【问题讨论】:

  • polkap0lka 是不同的,所以很明显你不会得到任何结果,你问的是大写问题。在你的问题中它是零'0'
  • 也许你需要使用合适的字符串匹配算法,设置匹配百分比的阈值并选择那些低于该阈值的字符串。

标签: php regex elasticsearch similarity


【解决方案1】:
  • 如果你想得到一个键入的单词最相似的结果,那么你可以在搜索到的单词和存储的单词之间计算Levenshtein distance,并返回距离最小的结果。

  • 您可以使用 PHP 的 levenshtein 函数。

PHP 代码段:

<?php

$data = array(
   'polka dresses',
   'polka clothes',
   'polka dots dress',
   'polka dots bottoms',
   'dummy dummy'
);

function getSimilarMatches($sentences,$search_str){
    $min_distance = -1;
    $closest_matches = [];

    foreach($sentences as $sentence){
        $min_levenshtein_dist = -1;
        foreach(explode(" ",$sentence) as $word){
            $levenshtein_dist = levenshtein($word,$search_str);
            if($min_levenshtein_dist == -1 ||  $min_levenshtein_dist > $levenshtein_dist){
                $min_levenshtein_dist = $levenshtein_dist;
            }
        }
        if($min_distance == -1 || $min_distance > $min_levenshtein_dist){
            $min_distance = $min_levenshtein_dist;
            $closest_matches = [];
            $closest_matches[] = $sentence;
        }else if($min_distance === $min_levenshtein_dist){
            $closest_matches[] = $sentence;
        }
    }

    return $closest_matches;
}


print_r(getSimilarMatches($data,'polka'));
print_r(getSimilarMatches($data,'p0lka'));

演示: https://3v4l.org/E9gea

【讨论】:

  • 非常感谢脚本....它起作用了....
  • @MuhammadHashirAnwaar 我认为这是可能的。目前,此代码仅给出最接近的结果,而忽略其他所有内容。所以你只得到最相关的。
猜你喜欢
  • 1970-01-01
  • 2018-04-14
  • 2012-07-13
  • 1970-01-01
  • 2018-12-29
  • 1970-01-01
  • 2017-10-06
  • 1970-01-01
  • 2019-03-09
相关资源
最近更新 更多