URL路径相似度/字符串相似度算法

Posted

技术标签:

【中文标题】URL路径相似度/字符串相似度算法【英文标题】:URL path similarity/string similarity algorithm 【发布时间】:2011-12-10 04:23:11 【问题描述】:

我的问题是我需要比较 URL 路径并推断它们是否相似。下面我提供要处理的示例数据:

# GROUP 1
/robots.txt

# GROUP 2
/bot.html

# GROUP 3
/phpMyAdmin-2.5.6-rc1/scripts/setup.php
/phpMyAdmin-2.5.6-rc2/scripts/setup.php
/phpMyAdmin-2.5.6/scripts/setup.php
/phpMyAdmin-2.5.7-pl1/scripts/setup.php
/phpMyAdmin-2.5.7/scripts/setup.php
/phpMyAdmin-2.6.0-alpha/scripts/setup.php
/phpMyAdmin-2.6.0-alpha2/scripts/setup.php

# GROUP 4
//phpMyAdmin/

我试过 Levenshtein 距离来比较,但对我来说不够准确。我不需要 100% 准确的算法,但我认为 90% 及以上是必须的。

我认为我需要某种分类器,但问题是新数据的每个部分都可以包含应该分类到新的未知类的路径。

请您指引我往右边走好吗?

谢谢

【问题讨论】:

所以,基本上,你有一组 URL,你想把它分成分离集(做clustering),或者更准确地说你的任务是什么?我也猜想,类的数量是先验的,对吧? *disjunctive -> 不相交 是的,你是对的,我的任务是某种聚类。问题是数据总是来的,所以算法应该适应新数据——可以增加类的数量。此任务是预处理数据以在下一步中使用它们。我想要实现的是了解请求了哪个应用程序/脚本,对我来说,它是 phpMyAdmin 版本 2.5.6 还是 2.6.0 没有区别 - 我需要知道请求了 phpMyAdmin setup.php 脚本。我希望这可以帮助您理解我的问题 【参考方案1】:

我知道这不是您问题的确切答案,但您熟悉k-means 算法吗?

我想即使 Levenshtein 也可以在这里工作,但困难在于如何用这种方法计算质心。

也许您可以将输入集划分为不相交的子集,然后为每个子集中的每个 URL 计算到同一子集中的所有其他 URL 的距离,并且距离总和最小的 URL 应该是质心(当然,这取决于输入集有多大;对于大型集,这样做可能不是一个好主意。

k-means 的好处是你可以从绝对随机的划分开始,然后迭代地让它变得更好。

k-means 的坏处是你必须在开始之前精确k。但是,在运行期间(可能在前几次迭代后情况稳定),您可以测量每个集合的内部相似性,如果它很低,您可以将集合分成两个子集并继续使用相同的算法。

【讨论】:

【参考方案2】:

Levenshtein 距离是最佳选择,但要调整距离。您必须在标记上使用加权编辑距离和可能的分割路径 - 单词和数字。因此,例如像“2.5.6-rc2 和 2.5.6”这样的版本可以被视为 0 权重差异,但像 phpMyAdmin 和 javaMyAdmin 这样的名称标记给出 1 权重差异。

【讨论】:

【参考方案3】:

在查看@jakub.gieryluk 的建议时,我偶然发现了令我满意的解决方案——“Hobohm 聚类算法,最初设计用于减少生物序列数据集的冗余。”

Bruno Vecchi 实现的 PERL 库测试给了我非常好的结果。唯一的问题是我需要Python实现,但我相信我可以在网上找到一个或者自己重新实现代码。

接下来我还没有检查过这个算法的主动学习能力;)

【讨论】:

这正是我正在寻找的东西。你在这方面取得了进展吗? 也许这对你有帮助 --> ***.com/a/67293055/1514627 (nodejs)

以上是关于URL路径相似度/字符串相似度算法的主要内容,如果未能解决你的问题,请参考以下文章

百度面试题 字符串相似度 算法 similar_text 和页面相似度算法

字符串相似度算法?

如何计算两个文档的相似度

词义相似度计算

文本、语音相似度算法

文本相似度之Sim_hash算法