如果有人曾经向digg提交过故事,它会检查故事是否已经提交,我假设通过模糊搜索。php(模糊)搜索匹配
我想实现类似的东西,想知道他们是否使用开源的PHP类?
探测法心不是这样做,句子/串可高达250chars长度
如果有人曾经向digg提交过故事,它会检查故事是否已经提交,我假设通过模糊搜索。php(模糊)搜索匹配
我想实现类似的东西,想知道他们是否使用开源的PHP类?
探测法心不是这样做,句子/串可高达250chars长度
你可以(根据您的数据集的大小),MySQL的全文检索使用,并查找项目(S),具有高评分并且在一定的时间范围内,并向用户建议这些/这些。
不幸的是,在PHP这样做是非常昂贵的。然而,你可以在算法肯定适用于小数据集(高CPU和内存使用率)。
要明确扩大了如何创建一个服务器崩溃:夫妇的内置PHP函数将确定字符串之间的“距离”:莱文斯坦和similar_text。
虚拟数据:(假装他们是新闻标题)
$titles = <<< EOF Apple Apples Orange Oranges Banana EOF;$titles = explode("\n", $titles);
在这一点上,$标题应该只是一个字符串数组。现在,创建一个矩阵,并将每个标题与每个其他标题的相似度进行比较。换句话说,对于5条标题,您将得到一个5 x 5矩阵(25个条目)。这就是CPU和内存接收器所在的位置。
这就是为什么此方法(通过PHP)无法应用于数千条目。但如果你想:
$matches = array(); foreach($titles as $title) { $matches[$title] = array(); foreach($titles as $compare_to) { $matches[$title][$compare_to] = levenshtein($compare_to, $title); } asort($matches[$title], SORT_NUMERIC ); }
在这一点上,你基本上有一个矩阵与“文本距离”。在概念上(不是真实的数据),它看起来有点像这张表。注意有一组0值是否对角 - 这意味着在匹配循环中,两个相同的单词是 - 相同的。
Apple Apples Orange Oranges Banana Apple 0 1 5 6 6 Apples 1 0 6 5 6 Orange 5 6 0 1 5 Oranges 6 5 1 0 5 Banana 6 6 5 5 0
实际$匹配阵列看起来有点像这样(截断):
Array ( [Apple] => Array ( [Apple] => 0 [Apples] => 1 [Orange] => 5 [Banana] => 6 [Oranges] => 6 ) [Apples] => Array ( ...
无论如何,它给你(通过实验)确定什么好数字距离截止可能大多比赛 - 然后应用它。否则,请阅读sphinx-search并使用它 - 因为它具有PHP库。
橙你很高兴你问这个?
我建议服用用户提交的URL并将它们存储在多个部分中;域名,路径和查询字符串。使用PHP parse_url()函数来派生提交的URL的部分。
索引至少是域名和路径。然后,当新用户提交URL时,您可以在数据库中搜索匹配域和路径的记录。由于列是索引的,因此您将首先筛选出不在同一个域中的所有记录,然后搜索剩余的记录。根据您的数据集,这应该更快,只需索引整个URL即可。确保您的WHERE子句按照正确的顺序进行设置。
如果这不符合您的需求,我会建议尝试狮身人面像。 Sphinx是一个开源的SQL全文搜索引擎,它的速度比MySQL内建的全文搜索快得多。它支持词干和其他一些不错的功能。
你也可以把用户提交的标题或文本内容,运行它通过一个函数来生成关键字,并在数据库中搜索与那些或相似的关键字现有记录。
你确定他们不只是匹配标题或网址吗?..我已经取得了Levenshtein公式的巨大成功,但我相信它会开始失败,并带有大量数据集。 – Fosco 2010-07-08 23:20:20
即时通讯现在尝试,但即时通讯认为它会融化与任何形式牵引便宜的托管帐户 – chris 2010-07-08 23:33:11