如果有人曾经向 digg 提交过故事,它会检查该故事是否已经提交,我假设是通过模糊搜索。
我想实现类似的东西,并想知道他们是否使用开源的 php 类?
Soundex 没有这样做,句子/字符串的长度最多可达 250 个字符
不幸的是,在 PHP 中执行此操作非常昂贵(CPU 和内存利用率很高。)但是,您当然可以将该算法应用于小型数据集。
具体扩展如何创建服务器崩溃:几个内置 PHP 函数将确定字符串之间的“距离”:levenshtein 和 similar_text。
虚拟数据:(假装它们是新闻标题)
$titles = <<< EOF Apple Apples Orange Oranges Banana EOF;$标题=爆炸(“ ", $titles );
此时,$titles应该只是一个字符串数组。现在,创建一个矩阵并将每个标题与其他每个标题进行相似性比较。换句话说,对于 5 个头条新闻,您将得到一个 5 x 5 矩阵(25 个条目)。这就是 CPU 和内存接收器发挥作用的地方。
这就是为什么此方法(通过 PHP)无法应用于数千个条目。但如果你想:
$matches = array(); foreach( $titles 作为 $title ) { $matches[$title] = array(); foreach( $titles 作为 $compare_to ) { $matches[$title][$compare_to] = levenshtein( $compare_to, $title ); } asort( $matches[$title], SORT_NUMERIC ); }
此时,您基本上拥有的是一个具有“文本距离”的矩阵。从概念上看(不是在实际数据中),它看起来有点像下表。请注意,有一组 0 值对角线排列 - 这意味着在匹配循环中,两个相同的单词是 - 嗯,相同。
苹果 苹果 橙子 橙子 香蕉 苹果 0 1 5 6 6 苹果 1 0 6 5 6 橙色 5 6 0 1 5 橙子 6 5 1 0 5 香蕉 6 6 5 5 0
实际的 $matches 数组看起来有点像这样(被截断):
数组 ( [苹果] => 数组 ( [苹果] => 0 [苹果] => 1 [橙色] => 5 [香蕉] => 6 [橙子] => 6 ) [苹果] => 数组 ( ...
无论如何,由您(通过实验)确定一个好的数值距离截止值可能最匹配 - 然后应用它。否则,请阅读 sphinx-search 并使用它 - 因为它确实有 PHP 库。
橙色你很高兴你问了这个问题?
我建议将用户提交的 URL 存储在多个部分中:域名、路径和查询字符串。使用 PHP parse_url() 函数导出提交的 URL 的各个部分。
至少索引域名和路径。然后,当新用户提交 URL 时,您将在数据库中搜索与域和路径匹配的记录。由于列已建立索引,因此您将首先过滤掉不在同一域中的所有记录,然后搜索剩余的记录。根据您的数据集,这应该比简单地索引整个 URL 更快。确保您的 WHERE 子句以正确的顺序设置。
如果这不能满足您的需求,我建议尝试 Sphinx。 Sphinx 是一个开源 SQL 全文搜索引擎,其速度远远快于 MySQL 内置的全文搜索。它支持词干提取和其他一些不错的功能。
您还可以获取用户提交的标题或文本内容,通过函数运行它以生成关键字,并在数据库中搜索具有这些或类似关键字的现有记录。
您可以(根据数据集的大小)使用 mySQL 的全文搜索,查找得分高且在特定时间范围内的项目,并向用户建议这个/这些。
更多关于分数的信息:MySQL全文搜索分数解释