如果有人曾经向 digg 提交过故事,它会检查该故事是否已经提交,我假设是通过模糊搜索。
我想实现类似的东西,想知道他们是否使用开源的 php 类?
Soundex 不这样做,句子/字符串的长度可达 250 个字符
不幸的是,在 PHP 中执行此操作非常昂贵(高 CPU 和内存利用率)。但是,您当然可以将该算法应用于小型数据集。
具体扩展如何创建服务器崩溃:几个内置的 PHP 函数将确定字符串之间的“距离”:levenshtein Và văn bản tương tự.
虚拟数据:(假装它们是新闻标题)
$titles = <<< EOFAppleApplesOrangeOrangesBananaEOF;$titles = explode("\n", $titles );
此时,$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 BananaApple 0 1 5 6 6Apples 1 0 6 5 6Orange 5 6 0 1 5Oranges 6 5 1 0 5Banana 6 6 5 5 0
实际的 $matches 数组看起来像这样(截断):
Array( [Apple] => Array ( [Apple] => 0 [Apples] => 1 [Orange] => 5 [Banana] => 6 [Oranges] => 6 ) [Apples] => Array ( ...
无论如何,这取决于您(通过实验)确定一个好的数值距离截止值可能最匹配 - 然后应用它。否则,请阅读 sphinx-search 并使用它 - 因为它确实有 PHP 库。
Orange 你很高兴你问了这个问题?
Tôi là một lập trình viên xuất sắc, rất giỏi!