将字符串与可能的相似字符串数组匹配的最佳方法?

Best way to match a string to an array of possible similar strings?

每天我都会收到来自不同公司的几个 excel 包含产品信息的文件,将产品与我自己的数据库匹配的唯一方法是通过产品名称。这些公司没有组织,产品名称是手写的,在同一个 excel 文件中可能会有所不同。

找到与我自己的产品列表最接近的匹配项的最佳方法是什么?有时公司 A 可能会称产品为 "Toy car 100",而我不关心它是哪个数字,我只是称其为 "Toy car"。然而,有时他们可能会称它为 "Provision for toy that is a car" 之类的不同名称,然后我需要将其与我的 "Toy car" 产品相匹配。

这种字符串匹配的最佳方法是什么,基本上我想匹配最相似的字符串。

我当前的实现涉及编写许多这样的 if 语句,当无法正确匹配变体时创建新的 if 语句。

foreach ($prodset as $p) {
    if (strpos(strtolower($dd['offer_name']), strtolower($p['prod_info'])) !== false && $p['active'] == 1) {
        $dd['product_id'] = $p['prod_id'];
        $result = $dd;
        return $result;
    }
}

可以使用similar_text函数,计算两个字符串之间的相似度。

<?php

$base = 'Toy car';

$variations = array(
    'Provision for toy that is a car',
    'Toy that looks like a car',
    'Toy Car',
    'Toy CAR'
);

foreach($variations as $variation) {
    echo "{$base} and {$variation} = " . similar_text($base, $variation);
}

因此它将以 case-sensitive 方式匹配字符,您可以 strtolower 两个字符串以获得更好的结果。

请注意,复杂度为 O(N**3),其中 N 是最长字符串的长度。

strpos() 也是可以的,你只需要添加额外的条件你想检查多少个字。逻辑是这样的,

$str = "Toy car";
$splits = split(" ",$str);

if ( strpos($splits[0]) !== false && strpos($splits[1]) !== false ){
  echo "found";
}