【问题标题】:PHP - Search array of sentences for search term(s)?PHP - 搜索搜索词的句子数组?
【发布时间】:2012-08-02 17:30:39
【问题描述】:

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

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

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

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

谢谢!

编辑 - 我考虑了 MySQL 全文搜索,还考虑了将 A) 输入和 B) 每个句子分解为单独的单词数组的可能性,然后以这种方式进行比较,使用Levenshtein 函数用于解释单词的变化。 (颜色、颜色、颜色等)但是,我担心这种方法虽然可能很聪明,但计算量可能会很大。

【问题讨论】:

  • 为什么不在数据库中做呢?您的数据来源是什么?
  • 这更适合于数据库中的全文搜索,而不是 PHP 中手动构建的东西。
  • 我正在将维基百科的文章解析成句子。如果将这些存储在数据库中、全文搜索然后从数据库中删除这些条目会更快,我愿意接受这种解决方案,尽管我无法想象它会非常有效。
  • 您在使用framework.zend.com/manual/en 吗?里面有一个 Lucene 库,从来没用过,但如果你想远离 DB,这似乎是对的!

标签: php arrays search levenshtein-distance


【解决方案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”一词,它将找不到结果。它不区分大小写,因此它应该更好地工作。如果使用完整术语没有找到结果,则将其分解并按单词搜索。希望这至少为您指明了一个起点。

【讨论】:

  • 谢谢!我正在寻找的可能比这更复杂一些(除了基于单词的完整搜索之外,它还需要一个模糊搜索),但我很欣赏这个想法!
【解决方案2】:

检查这个: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);

【讨论】:

  • 嗯。这可能有效,但看起来相当复杂。我会做一些研究。谢谢指点!
  • 感谢您的研究请求,Lucene 在 Java 世界中是众所周知的,从现在开始我会在 PHP 中考虑这个 =)
  • 我用过 Zend Lucene。这不是一个很棒的港口。在某些情况下,性能比 Java Lucene 差几个数量级(在 Zend Lucene 中,5 ms 查询变成了 5 秒查询),并且功能集不完整。
  • 我明白了。您查询了多少数据?
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-06
    • 2013-06-22
    • 1970-01-01
    • 2019-02-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多