我的问题是我需要比较网址路径并推断它们是否相似。下面我提供要处理的示例数据:
# 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%以上是必须的。
我认为我需要某种分类器,但问题是新数据的每一部分都可能包含应归类为新未知类的路径。
你能指引我到正确的方向吗?
由于
答案 0 :(得分:1)
我知道这不是你问题的确切答案,但是你熟悉k-means算法吗?
我想Levenshtein甚至可以在这里工作,但难点在于如何用这种方法计算质心。
也许您可以将输入集划分为不相交的子集,然后为每个子集中的每个URL计算到同一子集中所有其他URL的距离,并且具有最小距离总和的URL应该是质心(当然,这取决于输入集的大小;对于大集合,这样做可能不是一个好主意。)
关于k-means的好处是你可以从绝对随机的划分开始,然后迭代地使它变得更好。
关于k-means的坏处是你必须在开始前精确k
。但是,在运行期间(可能在第一次迭代后情况稳定),您可以测量每个集合的内部相似性,如果它是低的,您可以将该集合划分为两个子集并继续使用相同的算法。
答案 1 :(得分:1)
Levenshtein距离是最佳选择,但调整距离。您必须使用加权编辑距离和可能在标记上拆分路径 - 单词和数字。因此,例如像“2.5.6-rc2和2.5.6”这样的版本可以被视为0重量差异,但是像phpMyAdmin和javaMyAdmin这样的名称标记给出了1个重量差异。
答案 2 :(得分:1)
当检查@jakub.gieryluk建议时,我意外地找到了满足我的解决方案 - “Hobohm聚类算法,最初设计用于减少生物序列数据集的冗余。”
Bruno Vecchi实施的PERL库测试给了我很好的结果。唯一的问题是我需要Python实现,但我相信我可以在互联网上找到一个或者自己重新实现代码。
接下来的事情是我还没有检查过这个算法的主动学习能力;)