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

17 浏览
0 Comments

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

我正在尝试创建一个脚本,用于在我的表格行之间找到匹配的百分比。例如,我的mySQL数据库中的产品表包含了一个名为name的字段(已建立索引,全文搜索),其中包含如下值:\n

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

\n正如你所看到的,它们都有一些相同的关键词。但是第一个和第二个名称更相似,此外,第三个和第四个之间的关键词也比第一个和第二个之间更相似。\n我的mySQL数据库中有数千个产品名称。我想要找到那些具有超过百分之六十(假设)相似度的名称。\n例如,如我所说,第一个、第二个(和任何其他名称)之间的匹配度超过60%的将以分组格式输出,以便让我知道这些产品是相似的。第三个和第四个以及其他任何匹配度超过60%的将在另一组后输出,告诉我这些产品是匹配的。\n如果可能的话,将输出满足所有分组匹配名称的关键词。例如,LG S24AW 24000 BTU是第三个和第四个名称中包含的关键词。\n最后,我将创建一个包含所有这些关键词的列表。\n我现在有以下查询(正如Jitamaro所建议的):\n

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

\n它在所有其他名称旁边创建了一个新的名称字段。抱歉我不知道怎么正确解释它,但这就是它的作用:(实际值为上面的产品名称)\n查询之前:\n

-name-
A
B
C
D
E

\n查询之后:\n

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

\n是否有一种方法,无论是使用mySQL还是PHP,可以找到匹配的名称并提取上述描述的关键词?请提供代码示例。\n谢谢社区。

0
0 Comments

如何在MySQL行之间找到相似性?

当我看到你的例子时,我考虑了如何根据标题来查找相似的产品。从你的两个例子中,我可以看到每行中的一个突出的东西:型号号码。50PK350可能只会出现在与这个型号相关的地方。

现在,MySQL本身并不是设计来处理这类问题的,但是一些它上面的附加工具可以做到。问题的一部分是在所有这些字段的所有位置上进行查询是昂贵的。你真的想要按照某种方式拆分它并对其进行索引。Lucene的相似性类将为那些在所有数据中很少出现但在你的数据的很高百分比中出现的单词提供高分数。参见High level explanation of Similarity Class for Lucene?

你还应该参考Comparison of full text search engine - Lucene, Sphinx, Postgresql, MySQL?

对于每个单词,根据Lucene的相似性类进行评分应该更快更可靠。你的分数之和应该给出与之相关性最高的产品。对于电视,我希望首先看到完全匹配,然后是一些相同尺寸的其他产品,然后是品牌,然后是普通电视等等。

无论你做什么,要意识到除非你使用SQL系统上的另一个工具来创建更好的数据结构,否则你的查询将会过慢且昂贵。我认为Lucene可能是一个不错的选择。Sphinx或其他未提及的选项也可能值得考虑。

我认为Lucene的方法(或类似的方法)应该非常有效。我已经在一个通用产品搜索功能中实现了几乎相同的功能,尽管它不支持自动建议,但它很容易实现,因为Lucene已经返回给定搜索查询的“不同”产品。因此,你只需要设置一个定期的脚本,用新的/更改的/删除的产品更新你的Lucene索引(我必须保留Oracle数据库,因为它不在我控制之下...)。

0
0 Comments

如何找到MySQL行之间的相似度?

问题的出现原因:用户想要找到MySQL数据库中行之间的相似度。

解决方法:使用MySQL中的levenshtein()函数。

代码示例:

SELECT column_name
FROM table_name
WHERE levenshtein(column_name, 'search_term') <= 3;

以上是一个示例查询,其中column_name是要搜索的列名,table_name是要搜索的表名,search_term是要搜索的术语。通过使用levenshtein()函数,可以找到与搜索术语相似度小于等于3的行。

注意:levenshtein()函数返回两个字符串之间的编辑距离,即转换一个字符串成为另一个字符串所需的最少编辑操作数。在这种情况下,编辑操作可以是插入、删除或替换一个字符。

这种解决方法可以帮助用户在MySQL数据库中找到相似的行。

0
0 Comments

在处理MySQL行之间的相似性时,出现的主要问题是如何自动检查所有名称与其他名称的相似度,以及在查看每个产品时是否需要进行昂贵的表扫描。为了解决这个问题,可以采取以下方法:

1. 使用LIKE或REGEXP查询数据库:

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

这将查询包含"LG"的产品名称。

2. 循环结果并使用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%");

这将计算数据库中的值与用户查询之间的相似度。

3. 可以定义一个比例(比如40%)来匹配产品。请注意,similar_text()对大小写敏感,因此应将字符串转换为小写。

4. 如果数据库非常庞大,可以考虑使用更高效的算法来计算相似度,例如使用Levenshtein距离或Jaccard相似度。

通过使用LIKE或REGEXP查询数据库,使用similar_text()函数计算相似度,并定义匹配的比例,可以找到MySQL行之间的相似性。此外,还可以考虑使用更高效的算法来处理大型数据库。

0