2010-07-08 140 views
6

如果有人曾经向digg提交过故事,它会检查故事是否已经提交,我假设通过模糊搜索。php(模糊)搜索匹配

我想实现类似的东西,想知道他们是否使用开源的PHP类?

探测法心不是这样做,句子/串可高达250chars长度

+1

你确定他们不只是匹配标题或网址吗?..我已经取得了Levenshtein公式的巨大成功,但我相信它会开始失败,并带有大量数据集。 – Fosco 2010-07-08 23:20:20

+0

即时通讯现在尝试,但即时通讯认为它会融化与任何形式牵引便宜的托管帐户 – chris 2010-07-08 23:33:11

回答

0

你可以(根据您的数据集的大小),MySQL的全文检索使用,并查找项目(S),具有高评分并且在一定的时间范围内,并向用户建议这些/这些。

更多是here:MySQL Fulltext Search Score Explained

+0

数学不是我的强项 – chris 2010-07-09 00:15:29

+0

不幸的是,编程与数学很大程度上。 – Pete 2010-07-09 10:56:52

5

不幸的是,在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库。

橙你很高兴你问这个?

2

我建议服用用户提交的URL并将它们存储在多个部分中;域名,路径和查询字符串。使用PHP parse_url()函数来派生提交的URL的部分。

索引至少是域名和路径。然后,当新用户提交URL时,您可以在数据库中搜索匹配域和路径的记录。由于列是索引的,因此您将首先筛选出不在同一个域中的所有记录,然后搜索剩余的记录。根据您的数据集,这应该更快,只需索引整个URL即可。确保您的WHERE子句按照正确的顺序进行设置。

如果这不符合您的需求,我会建议尝试狮身人面像。 Sphinx是一个开源的SQL全文搜索引擎,它的速度比MySQL内建的全文搜索快得多。它支持词干和其他一些不错的功能。

http://sphinxsearch.com/

你也可以把用户提交的标题或文本内容,运行它通过一个函数来生成关键字,并在数据库中搜索与那些或相似的关键字现有记录。