如何找到mySQL行之间的相似性?

2022-08-30 19:18:51

我正在尝试创建一个脚本来查找表行之间的匹配百分比。例如,我的 mySQL 数据库在表产品中包含字段名称(索引,全文),其值类似于

LG 50PK350 PLASMA TV 50" Plasma TV Full HD 600Hz 
LG TV 50PK350 PLASMA 50"
LG S24AW 24000 BTU
Aircondition LG S24AW 24000 BTU Inverter

正如你所看到的,他们都有一些相同的关键字。但第一个名字和第二个名字更相似。此外,第 3 和第 4 个之间的关键字比第 1 个和第 2 个相似。

我的 mySQL 数据库有数千个产品名称。我想要的是找到那些相似性超过百分比(假设60%)的名字。

例如,正如我所说,它们之间匹配超过60%的第1,第2(以及任何其他名称)将以组样式格式回显,以使我知道这些产品是相似的。第3和第4名以及任何匹配率超过60%的任何其他产品都会在另一组中回响,告诉我这些产品匹配。

如果可能的话,最好回显满足所有分组匹配名称的关键字。例如,LG S24AW 24000 BTU 是第 3 个和第 4 个名称中包含的关键字。

最后,我将创建所有这些关键字的列表。

我现在拥有的是以下查询(如Jitamaro建议的那样)

Select t1.name, t2.name From products t1, products t2

将在所有其他名称旁边创建一个新名称字段。对不起,我不知道如何正确解释它,但这就是它的作用:(真正的价值是如上所述的产品名称)

查询前

-name-
A
B
C
D
E

查询之后

-name- -name-
A        A
B        A
C        A
D        A
E        A
A        B
B        B
C        B
D        B
E        B
.
.
.

有没有一种方法可以使用mySQL或PHP为我找到匹配的名称并提取关键字,如上所述?请分享代码示例。

谢谢社区。


答案 1

使用 LIKE 或 REGEXP 查询数据库:

SELECT * FROM product WHERE product_name LIKE '%LG%';
SELECT * FROM product WHERE product_name REGEXP "LG";

循环结果并使用 similar_text():

$a = "LG 50PK350 PLASMA TV 50\" Plasma TV Full HD 600Hz"; // DB value
$b = "LG TV 50PK350 PLASMA 50\"" ; // USER QUERY

$i = similar_text($a, $b, $p);
echo("Matched: $i  Percentage: $p%");

//outputs: Matched: 21 Percentage: 58.3333333333%

您的第二个示例匹配 62.0689655172%:

$a = "LG S24AW 24000 BTU"; // DB value
$b = "Aircondition LG S24AW 24000 BTU Inverter" ; // USER QUERY

$i = similar_text($a, $b, $p);
echo("Matched: $i  Percentage: $p%");

您可以定义一个高于 40% 的百分比来匹配产品。
请注意,similar_text() 是大小写 SensItivE,因此您应该将字符串小写。


答案 2

至于你的第二个问题,levenshtein()函数(在MySQL中)将是一个很好的候选者。


推荐