chr*_*ris 7 php mysql full-text-search
如果有人曾经提交过故事,那么它会检查故事是否已经提交,我通过模糊搜索来假设.
我想实现类似的东西,并想知道他们是否使用开源的PHP类?
Soundex没有这样做,句子/字符串的长度最多可达250个
不幸的是,在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库.
橙色你很高兴你问过这件事吗?
| 归档时间: |
|
| 查看次数: |
6893 次 |
| 最近记录: |