php(模糊)搜索匹配

chr*_*ris 7 php mysql full-text-search

如果有人曾经提交过故事,那么它会检查故事是否已经提交,我通过模糊搜索来假设.

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

Soundex没有这样做,句子/字符串的长度最多可达250个

pp1*_*9dd 5

不幸的是,在PHP中执行此操作非常昂贵(高CPU和内存利用率.)但是,您当然可以将算法应用于小数据集.

要专门扩展如何创建服务器崩溃:几个内置的PHP函数将确定字符串之间的"距离":levenshteinsimilar_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库.

橙色你很高兴你问过这件事吗?


Pet*_*ete 1

您可以(取决于数据集的大小)使用 mySQL 的全文搜索,查找得分高且在特定时间范围内的项目,并向用户建议这个/这些。

有关分数的更多信息,请参见:MySQL 全文搜索分数解释