2012-08-02 61 views
2

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

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

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

你有什么建议?有没有这样做的PHP已经存在的任何系统? Levenshtein的功能会是一个适当的解决方案吗?是否有一个我不知道的基于词汇的Levenshtein函数?

谢谢!

EDIT - 我已经考虑两者的MySQL全文检索,并且还考虑打破两个A)输入端和B)每个句子成单词的单独的阵列的可能性,并且然后比较该方式,使用的Levenshtein功能以考虑在词的变化。 (颜色,颜色,颜色等)但是,我担心这种方法虽然可能很聪明,但可能会造成计算上的负担。

+1

为什么不这样做的DB:文档可以直接从一个HTML文件或字符串创建?数据的来源是什么? – Niloct 2012-08-02 17:33:52

+0

这比在PHP中手工构建的东西更适合在数据库中进行全文搜索。 – 2012-08-02 17:35:02

+0

我正在将维基百科文章解析为句子。如果将这些数据存储在数据库,全文搜索,然后从数据库中删除这些条目会更快,我愿意接受该解决方案,尽管我无法想象它非常高效。 – Nathanael 2012-08-02 17:35:10

回答

0

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

Zend_Search_Lucene中提供了一个HTML解析功能。

$doc = Zend_Search_Lucene_Document_Html::loadHTML($htmlString); 
$index->addDocument($doc); 
+0

嗯。这可能有效,但看起来中等复杂。我会做一些研究。感谢指针! – Nathanael 2012-08-02 17:57:31

+0

感谢您的研究请求,Lucene在Java世界中是众所周知的,我将从现在开始考虑这个PHP =) – Niloct 2012-08-02 17:59:44

+0

我已经使用了Zend Lucene。这不是一个很好的港口。性能在某些情况下比Java Lucene差几个数量级(5 ms查询成为Zend Lucene中的5秒查询),而且功能集不完整。 – 2012-08-02 18:12:46

0

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

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”一词,它将不会找到结果。它不区分大小写,所以它应该更好。如果没有找到使用全部术语的结果,则将其分解并通过单词进行搜索。希望这至少可以指引你出发的地方。

+0

谢谢!我所寻找的可能比这更复杂一点(它需要一个模糊搜索IN ADDITION到一个完整的基于单词的搜索),但我很欣赏这个想法! – Nathanael 2012-08-02 17:59:49