将字符串与可能的相似字符串数组匹配的最佳方法?
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";
}
每天我都会收到来自不同公司的几个 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";
}