2

所以,假设我有一个简单的句子数组。根据用户输入搜索它并返回最接近的匹配项的最佳方法是什么?

Levenshtein 功能似乎很有希望,但我不认为我想使用它们。用户输入可能很简单highest mountain,在这种情况下,我想在数组中搜索具有highest mountain. 如果该确切的短语不存在,那么我想搜索具有highestANDmountain但不是背靠背的句子,依此类推。Levenshtein 函数在每个字符的基础上工作,但我真正需要的是每个单词的基础。

当然,在某种程度上,Levenshtein 函数可能仍然有用,因为我还想考虑句子包含短语highest mountains(注意 S)或类似内容的可能性。

你有什么建议?是否有任何已经存在的 PHP 系统可以做到这一点?单独的 Levenshtein 函数会是一个适当的解决方案吗?是否有我不知道的基于单词的 Levenshtein 函数?

谢谢!

编辑- 我已经考虑了 MySQL 全文搜索,并且还考虑了将 A) 输入和 B) 每个句子分成单独的单词数组的可能性,然后使用 Levenshtein 函数来解释单词的变化。(颜色,颜色,颜色等)但是,我担心这种方法虽然可能很聪明,但在计算上可能会很繁重。

4

3 回答 3

1

由于我不喜欢为您编写代码,因此我通常会先问您尝试过什么。但是,我目前遇到了一些问题,所以休息一下来写这个:

$results=array();
foreach($array as $sentence){
    if(stripos($sentence,$searchterm)!==false)
        $results[]=$sentence;
}
if(count($results)==0){
    $wordlist=explode(" ",$searchterm);
    foreach($wordlist as $word){
        foreach($array as $sentence){
            if(stripos($sentence,$word)!==false)
                $results[]=$sentence;
        }
    }
}
print_r($results);

这将准确搜索一系列句子的术语。如果您输入“microsift”并且句子中包含“Microsoft”一词,它将找不到结果。它不区分大小写,因此它应该更好地工作。如果使用完整术语没有找到结果,则将其分解并按单词搜索。希望这至少为您指明了一个起点。

于 2012-08-02T17:36:57.757 回答
0

PHP 没有内置函数来执行此操作。这是因为您所要求的内容涉及搜索相关性、相关术语、迭代搜索以及需要在搜索中模仿人类逻辑的许多更复杂的操作。您可以尝试寻找基于 PHP 的搜索类,尽管我知道的是数据库搜索引擎而不是数组搜索类。自己制作是非常复杂的。

于 2012-08-02T17:36:51.193 回答
0

检查这个: http: //framework.zend.com/manual/en/zend.search.lucene.overview.html

Zend_Search_Lucene 提供了一个 HTML 解析特性。可以直接从 HTML 文件或字符串创建文档:

$doc = Zend_Search_Lucene_Document_Html::loadHTML($htmlString);
$index->addDocument($doc);
于 2012-08-02T17:46:04.060 回答