在 MySQL / PHP 中匹配相似的字符串
Posted
技术标签:
【中文标题】在 MySQL / PHP 中匹配相似的字符串【英文标题】:Matching similar strings in MySQL / PHP 【发布时间】:2021-08-19 19:31:01 【问题描述】:我正在开发一个允许用户创建媒体列表的系统。我正在尝试匹配名称并对重复项进行分组,但保留用户的原始名称。我的问题是如何准确匹配相似的名称。例如,如果我有:
“哈利波特与魔法石” 《点金石——哈利波特》 《哈利波特——贤者之石》
如何在 mysql 数据库中匹配这 3 个?是否有任何查询可以用来执行此操作,或者可能需要结合其他技术来执行此操作?
【问题讨论】:
这是一个有趣的问题......但想象一下结果会是什么:1)“哈利波特”,2)“哈利哲学家之石”,3)“哈利波特与石头”, 4) “迈克尔杰克逊和魔法石”,5) “波特魔法石和哈利哲学家” - 这些选项中的哪一个与“哈利波特和魔法石”匹配? 您想自动比较还是手动创建不同命名选项之间的链接? 我希望自动创建链接,但我知道可能需要一些手动确认,尤其是在“迈克尔杰克逊和哲学家之石”以及任何可能类似但不是相同的。我只需要找到一种方法来抓住大多数人,并可能提示用户确认。 这被称为“模糊匹配”,是文本分析领域的一个重要话题。有许多不同的算法,具有不同程度的复杂性和不同的优点/缺点。一些更简单的(例如levenshtein distance)可以在mysql中实现,但更复杂的需要适当的编程语言。这些算法中的大多数是在 python 或 R 中实现的,而不是在 php 中实现的。您需要研究算法并选择最适合您的业务案例的算法。 【参考方案1】:首先,您需要定义如何理解 2 个字符串是否“相似”。 “相似度”的衡量标准是什么?
当你在思考这个问题时,我记得 PHP 中有一个内置函数:similar_text
。以下是示例:click。
代码:
$str = [
"Harry Potter and the philosophers stone",
"The philosophers stone - Harry Potter",
"Harry Potter - the philosophers stone"
];
for ($i = 0; $i < count($str); $i++)
echo "[" . $i . "] " . $str[$i] . "\n";
for ($i = 0; $i < count($str); $i++)
for ($j = $i + 1; $j < count($str); $j++)
$value = similar_text($str[$i], $str[$j], $p);
echo "[" . $i . "] VS [" . $j . "] = " . $value . " (" . $p . " %)\n";
给我们这个结果:
[0] Harry Potter and the philosophers stone
[1] The philosophers stone - Harry Potter
[2] Harry Potter - the philosophers stone
[0] VS [1] = 21 (55.263157894737 %)
[0] VS [2] = 36 (94.736842105263 %)
[1] VS [2] = 21 (56.756756756757 %)
您可以看到“哈利波特与魔法石”和“哈利波特 - 魔法石”相似度高达 94%。
我只能推荐你阅读这本 PHP 手册:click 以及下面的所有 cmets。
附: PHP 中还有另外两个函数:levenshtein
和 soundex
。您可以自己检查它们。 manual page 也提到了它们。
【讨论】:
【参考方案2】:您的数据库中可能有三个不同的字段,每个字段的字符串名称如上,但给它们一个唯一的标识符作为数字。
【讨论】:
不确定我是否理解。这些只是示例,可以输入更多应该链接到同一事物的示例。我链接它们没有问题,这是关于首先匹配它们以创建链接。以上是关于在 MySQL / PHP 中匹配相似的字符串的主要内容,如果未能解决你的问题,请参考以下文章
哪个 MySQL 排序规则与 PHP 的字符串比较完全匹配?
MySQL 排序规则类型是不是需要匹配 PHP 页面字符集类型?