2012-08-02 60 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