3

データベースから記事を検索する検索クエリを作成しようとしています。ユーザーが入力した検索文字列を取得して、可能な検索語の特定のセットを探したいと思います。ユーザーが「2011 年のドイツの平均給与のリスト」という検索文字列を入力した場合、検索する用語のリストを生成したいと思います。文字列全体と、連続した単語の部分文字列を探すことにしました。つまり、「2011 年のドイツのリスト」ではなく、「平均給与のリスト」と「2011 年のドイツ」を検索したいということです。

これまでのところ、検索語を生成するためのコードは次のとおりです。

  $searchString = "listing of average salaries in germany for 2011";
  $searchTokens = explode(" ", $searchString);
  $searchTerms = array($searchString);

  $tokenCount = count($searchTokens);
  for($max=$tokenCount - 1; $max>0; $max--) {
      $termA = "";
      $termB = "";
      for ($i=0; $i < $max; $i++) {
          $termA .= $searchTokens[$i] . " ";
          $termB .= $searchTokens[($tokenCount-$max) + $i] . " ";
      }
      array_push($searchTerms, $termA);
      array_push($searchTerms, $termB);
  }

  print_r($searchTerms);

そして、この用語のリストが表示されます:

  • 2011 年のドイツの平均給与のリスト
  • ドイツの平均給与のリスト
  • 2011 年のドイツの平均給与
  • ドイツの平均給与のリスト
  • 2011 年のドイツの平均給与
  • の平均給与のリスト
  • 2011 年のドイツの給与
  • 平均給与のリスト
  • 2011年のドイツで
  • 平均のリスト
  • 2011年のドイツ
  • のリスト
  • 2011年
  • リスティング
  • 2011年

取得方法がわからないのは、欠落している用語です。

  • ドイツの平均給与の
  • ドイツの平均給与の
  • のドイツの平均給与
  • の平均給与
  • ドイツの平均給与
  • のドイツでの給与
  • 等...

アップデート

私は「パワーセット」を探しているわけではないので、このような答えやこれは無効です。たとえば、用語のリストにこれらを入れたくない:

  • 平均的なドイツ
  • 2011年の給与一覧
  • ドイツの

連続した単語のみを探しています。

4

2 に答える 2

0

まず最初に、検索のためにこれらすべてを SQL データベースに対して実行する場合、非常に非効率的であることをお知らせしたいと思います。このLIKEオプションを使用することをお勧めします。http://www.techonthenet.com/sql/like.php

ここで、可能なすべての組み合わせを取得するには、単語を配列に分割し (explode で行ったように)、この質問に関する @ulvund のアドバイスに従ってください: PHP: 1D 配列のすべての可能な組み合わせを取得する方法?

つまり、

<?php

$array = explode(" ", "listing of average salaries in germany for 2011");

function depth_picker($arr, $temp_string, &$collect) {
    if ($temp_string != "") 
        $collect []= $temp_string;

    for ($i=0; $i<sizeof($arr);$i++) {
        $arrcopy = $arr;
        $elem = array_splice($arrcopy, $i, 1); // removes and returns the i'th element
        if (sizeof($arrcopy) > 0) {
            depth_picker($arrcopy, $temp_string ." " . $elem[0], $collect);
        } else {
            $collect []= $temp_string. " " . $elem[0];
        }   
    }   
}

$collect = array();
depth_picker($array, "", $collect);
print_r($collect);

?>
于 2013-06-20T19:07:19.947 に答える
0

展開された文字列のすべての連続したサブセットを見つけたい場合は、配列を から開始して、最大offset=0で分割します。length=1count-offset

$search_string = 'listing of average salaries in germany for 2011';
$search_array = explode(' ',$search_string);
$count = count($search_array);

$s = array();
$min_length = 1;

for ($offset=0;$offset<$count;$offset++) {
    for ($length=$min_length;$length<=$count-$offset;$length++) {
        $match = array_slice($search_array,$offset,$length);
        $search_matches []= join(' ',$match);
    }
}

print_r($search_array);
print_r($search_matches);
于 2013-06-21T17:12:24.170 に答える