布尔检索php

时间:2011-05-05 15:22:17

标签: php matrix search-engine boolean information-retrieval

我正在使用php创建一个基于布尔检索的简单搜索引擎 我有预定义的文件 例如: - doc0:我叫凯撒 - doc1:凯撒是人物...... -doc2 .....

我构建了术语 - 文档矩阵,如下所示:enter image description here

所以例如“my”存在于第一个文档中,但不存在于第二个文档中,“caesar”存在于两个文档中 当我搜索单个术语时,我得到该术语的布尔值,因此如果我在搜索引擎中输入“name”,我将获得1 0。

我的问题是我想搜索一个词而不是一个词,例如:“caesar character” 我想在它们的布尔值之间做一个布尔值,因此搜索的结果将是0 1为1 1& 0 1 = 01  所以我需要php函数,让我使用上面提到的方法搜索多个单词

这是代码 $ query = $ _REQUEST ['keyword']; $ stoplists = array(“i”,“。”,“a”,“”); $字=阵列(); $ wordsdoc =阵列(); $矩阵=阵列(); $ docs = array(“我的名字是caesar”,“caesar是一个角色”); $ K = 0;

//looping the docs array
for ($i=0;$i<sizeof($docs);$i++)
{
    //splitting doc[i] on " " (space)
    $words_temp=explode(" ",$docs[$i]);

   //looping the splitted words
   for ($j=0;$j<sizeof($words_temp);$j++)
   {
        //checking if the word is not in stop dictionnary and does not already added in words array
        if (!in_array($words_temp[$j],$stoplists) && !in_array($words_temp[$j],$words))
        {
            //adding word to words array
            $words[$k]=$words_temp[$j];
            //incrementing counter
            $k++;       
        }

    }
    //print_r($words[1]);
}

echo "<b>Words:</b> ";
for ($j=0;$j<sizeof($words);$j++)
{
    echo $words[$j]." ";
}

echo "<br><br>";

//looping the docs array
for($i=0;$i<sizeof($docs);$i++)
{
    //splitting doc[i] on " " (space)
    $words_temp=explode(" ",$docs[$i]);
    //initialize counter
    $l=0;

    //looping the splitted words
    for ($j=0;$j<sizeof($words_temp);$j++)
    {
        //checking if the word is not in stop dictionnary
        if (!in_array($words_temp[$j],$stoplists) )
        {
            //adding word to 2d array
            $wordsdoc[$i][$l]=$words_temp[$j];
            //incrementing counter
            $l++;       
        }

    }
}

echo "<b><u>Docs:</u></b><br>";
for($i=0;$i<sizeof($wordsdoc);$i++)
{
    echo "doc".$i.": ";
    for($j=0;$j<sizeof($wordsdoc[$i]);$j++)
    {
        echo $wordsdoc[$i][$j]." ";
    }
    echo "<br>";
}
echo "<br>";

echo "<b>Res Matrix First Col:</b><br>";
for($i=0;$i<sizeof($words);$i++)
{
    $matrix[$i][0]=$words[$i];
    echo $matrix[$i][0]."<br>";
}

$i1=0;
$i2=0;

foreach($wordsdoc as $items)
{
        for($i=0;$i<sizeof($words);$i++)
        {   
            if(in_array($matrix[$i][0],$items))
                $matrix[$i][$i1+1] = 1;
            else
                $matrix[$i][$i1+1] =0;
        }
    $i1++;
}

echo "<table border=1><br>";
echo "<tr><td></td>";

for($i=0;$i<sizeof($docs);$i++)
{
    echo "<td>doc".($i+1)."</td>";
}
echo "</tr><br>";

foreach($matrix as $items)
{
    echo "<tr>";
    foreach($items as $item)
    {
        echo "<td>".$item."</td>";
    }
    echo "</tr><br>";
}
echo "</table><br>";    

*我很抱歉发布这么长的问题,但我真的需要帮助:S * 谢谢你们提前:)

2 个答案:

答案 0 :(得分:2)

也许您应该尝试爆炸搜索查询并搜索数组的每个部分,然后根据需要合并结果

答案 1 :(得分:1)

function search($word) {
  ... code to query the matrix ...
  return $result_array;
}

使用多个单词

$search_terms = array('my', 'caesar');
$overall_result = array(true, true);
foreach($search_terms as $st) {
  $this_result = search($st);
  $overal_index = 0;
  foreach($this_result as $b) {
    $overall_result[$overal_index] = $b && $overall_result[$overal_index];
    $overal_index++;
  }
}