如果有人曾经提交过故事,那么它会检查故事是否已经提交,我通过模糊搜索来假设。
我想实现类似的东西,并想知道他们是否使用的是开源的php类?
Soundex不这样做,句子/字符串的长度最多可达250个
答案 0 :(得分:5)
不幸的是,在PHP中执行此操作非常昂贵(高CPU和内存利用率。)但是,您当然可以将算法应用于小数据集。
要专门扩展如何创建服务器崩溃:几个内置的PHP函数将确定字符串之间的“距离”: levenshtein 和 similar_text 。
虚拟数据:(假装它们是新闻标题)
$titles = <<< EOF Apple Apples Orange Oranges Banana EOF;$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 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
实际的$ matches数组看起来像这样(截断):
Array ( [Apple] => Array ( [Apple] => 0 [Apples] => 1 [Orange] => 5 [Banana] => 6 [Oranges] => 6 ) [Apples] => Array ( ...
无论如何,由你(通过实验)确定一个好的数字距离截止值可能最匹配 - 然后应用它。否则,请阅读sphinx-search并使用它 - 因为它确实有PHP库。
你很高兴问过这个吗?答案 1 :(得分:2)
我建议让用户提交的网址并将其存储在多个部分;域名,路径和查询字符串。使用PHP parse_url()函数派生提交的URL的部分。
至少索引域名和路径。然后,当新用户提交URL时,您将在数据库中搜索与域和路径匹配的记录。由于列已编制索引,因此您将首先筛选出不在同一域中的所有记录,然后搜索其余记录。根据您的数据集,这应该更快,只需索引整个URL。确保以正确的顺序设置WHERE子句。
如果这不符合您的需求,我建议您尝试使用Sphinx。 Sphinx是一个开源的SQL全文搜索引擎,比MySQL内置的全文搜索要快得多。它支持词干和其他一些很好的功能。
您还可以获取用户提交的标题或文本内容,通过函数运行以生成关键字,并在数据库中搜索包含这些或类似关键字的现有记录。
答案 2 :(得分:0)
您可以(根据您的数据集的大小)使用mySQL的FULLTEXT搜索,并查找具有高分并且在特定时间范围内的项目,并向用户建议这些/这些。</ p >
有关得分的更多信息,请访问:MySQL Fulltext Search Score Explained