字串 - PHP短文本匹配的排序演算法

來源:互聯網
上載者:User
PHP做簡單的短文本搜尋匹配時,我用的是最長公用子序列。但是如果關鍵字匹配到兩條文本的相似性一樣時,如何將兩條文本中關鍵字更靠前的返回?舉例:關鍵字“無”匹配到“無雙”和“虛無”,我要如何在返回的結果中把“無雙”排在“虛無”前面?那“無雙”匹配到的“無小明的雙”和“小明無的雙”呢?

 $len_2 ? $len_1 : $len_2;  $dp = array();  for ($i = 0; $i <= $len; $i++) {    $dp[$i] = array();    $dp[$i][0] = 0;    $dp[0][$i] = 0;  }  for ($i = 1; $i <= $len_1; $i++) {    for ($j = 1; $j <= $len_2; $j++) {      if ($str_1[$i - 1] == $str_2[$j - 1]) {        $dp[$i][$j] = $dp[$i - 1][$j - 1] + 1;      } else {        $dp[$i][$j] = $dp[$i - 1][$j] > $dp[$i][$j - 1] ? $dp[$i - 1][$j] : $dp[$i][$j - 1];      }    }  }  return $dp[$len_1][$len_2];}function search($name) {  Global $names;  $sort_list = array();  if (mb_strlen($name, 'utf-8') != strlen($name)) { // 是否全英文字元    $arr_1 = array_unique(split_name($name));    foreach ($names as $value) {      $arr_2 = array_unique(split_name($value));      $similarity = count($arr_2) - count(array_diff($arr_2, $arr_1));      $sort_list[$value] = $similarity;    }  } else {    foreach ($names as $value) {      $similarity = LCS($name, $value);      $sort_list[$value] = $similarity;    }  }  arsort($sort_list);  return $sort_list;}header('content-type:text/html;charset=utf-8');print_r(search('無'));

回複內容:

PHP做簡單的短文本搜尋匹配時,我用的是最長公用子序列。但是如果關鍵字匹配到兩條文本的相似性一樣時,如何將兩條文本中關鍵字更靠前的返回?舉例:關鍵字“無”匹配到“無雙”和“虛無”,我要如何在返回的結果中把“無雙”排在“虛無”前面?那“無雙”匹配到的“無小明的雙”和“小明無的雙”呢?

 $len_2 ? $len_1 : $len_2;  $dp = array();  for ($i = 0; $i <= $len; $i++) {    $dp[$i] = array();    $dp[$i][0] = 0;    $dp[0][$i] = 0;  }  for ($i = 1; $i <= $len_1; $i++) {    for ($j = 1; $j <= $len_2; $j++) {      if ($str_1[$i - 1] == $str_2[$j - 1]) {        $dp[$i][$j] = $dp[$i - 1][$j - 1] + 1;      } else {        $dp[$i][$j] = $dp[$i - 1][$j] > $dp[$i][$j - 1] ? $dp[$i - 1][$j] : $dp[$i][$j - 1];      }    }  }  return $dp[$len_1][$len_2];}function search($name) {  Global $names;  $sort_list = array();  if (mb_strlen($name, 'utf-8') != strlen($name)) { // 是否全英文字元    $arr_1 = array_unique(split_name($name));    foreach ($names as $value) {      $arr_2 = array_unique(split_name($value));      $similarity = count($arr_2) - count(array_diff($arr_2, $arr_1));      $sort_list[$value] = $similarity;    }  } else {    foreach ($names as $value) {      $similarity = LCS($name, $value);      $sort_list[$value] = $similarity;    }  }  arsort($sort_list);  return $sort_list;}header('content-type:text/html;charset=utf-8');print_r(search('無'));

所以你只是想讓搜尋結果中字在前的排名越前咯?那不就直接把所有匹配到的字的位置相加越小的不就在前面嗎?不知道我理解錯沒有... 代碼線上運行:http://3v4l.org/K0X7m

 $v) {    $pos = array();    foreach($v['single'] as $k => $s) {        if(in_array($s, $search)) $pos[$s][] = $k;    }    if(count($pos) != count($search)) {        unset($res[$name]);    } else {        $seq = 0;        array_walk_recursive($pos, function($i) use(&$seq) {            $seq += $i;        });        $res[$name] = $seq;    }}ksort($res);$res = array_keys($res);var_dump($res);
  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.