国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > PHP > 正文

Thinkphp 3.2 中詞分詞 加權搜索

2020-03-22 20:24:42
字體:
來源:轉載
供稿:網友
  •  原文地址:http://www.cnblogs.com/kekukele/p/4544349.html

     前段時間,利用業余時間做了一個磁力搜索的網站Btdog,其中使用到了簡單的中文分詞與加權搜索,在這里分享給大家,供大家參考。

      在我的網站中,中文分詞使用的是SCWS分詞系統,這個分詞系統提供PHP兩種使用方式:一種是你可以采用源碼安裝,具體安裝步驟請參考這里;

    另外一種是使用其提供的API接口,具體方法參考這里。

      下面,我們假設你已經掌握了SCWS的使用,事實上,其使用也非常簡單,若你不會其使用,也不影響本文下面的閱讀。 

      SCWS系統中其每個分好的詞包括以下屬性/鍵值:

      word詞的內容off該詞在未分詞文本中的偏移位置idf該詞的 IDF 值attr詞性 (北大標注格式)參見這里。

        在這里我們重點介紹下分詞屬性中的idf,這個是我們在我們的分詞算法中需要用到的。

        IDF全稱inverse document frequency(逆向文檔頻率)是一個詞普遍重要性的度量,某一特定詞的IDF值,用總文件數除以包含該詞的文章數量,再將得到的商取對數(log)。計算公式:IDF = log(D/Dt),D為文章總數,Dt為該詞出現的文章數量。IDF的主要思想是:如果包含詞條t的文檔越少,也就是Dt越小,IDF越大,則說明詞條t具有很好的類別區分能力。

        我們舉例說明下,如 搜索內容 ”復仇者的聯盟“,其SCWS的分詞結果如下:

        可以看出,其分詞結果中,關鍵詞”復仇者“的idf為9.06,最具區分能力,而關鍵詞”的“的idf值為0,基本沒有區分能力,”聯盟“的idf為4.34也具有較強的區別能力。因此,我們在我們的分詞搜索中,可以簡單地使用idf值作為加權排序的依據。

        在scws分詞系統中,其idf的取值為0-10,因此在我們下面給出的算法中,我們把內容全文匹配的權重設為10,即最大。其他分詞后關鍵詞的權重值設為其idf值,然后根據權重大小將結果逆序排列。這要我們就實現了簡單的中文分詞加權排序。核心代碼具體如下: 

      //@param:需要分詞的內容  
      //Return:mysql查詢條件字符串,加權排序字符串,關鍵詞

      private function split_words($text){ $split_words = scws_new(); $split_words->set_charset('utf-8'); $split_words->set_ignore(true); $split_words->set_dict('/usr/local/scws/etc/dict.utf8.xdb'); $split_words->set_rule('/usr/local/scws/etc/rules.utf8.ini'); $split_words->send_text($text); $weight=10; $condition['where'] = "name LIKE '%".$text."%'"; $condition['order'] = "(CASE WHEN name LIKE '%".$text."%' THEN $weight ELSE 0 END)"; //設置全文匹配最大權重 while ($words_result = $split_words->get_result()) { foreach($words_result as $word_arr){ $condition['where'] .= " OR name LIKE '%".$word_arr['word']."%'";
                  //設置分詞后關鍵詞的權重為其idf的值
      $condition['order'] .= " + (CASE WHEN name LIKE '%".$word_arr['word']."%' THEN ".$word_arr['idf']." ELSE 0 END)"; $condition['keywords'][$cnt++] = $word_arr['word']; } } $split_words->close(); return $condition; }

        當然,更復雜的分詞還要考慮詞的詞頻TF,不過即使簡單的這樣,我們也基本能達到比較好的效果了,具體效果,大家可以到http://btdog.com.cn體驗下。

      PHP編程

      鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

  • 發表評論 共有條評論
    用戶名: 密碼:
    驗證碼: 匿名發表
    主站蜘蛛池模板: 集贤县| 奇台县| 额敏县| 临武县| 凌源市| 黔江区| 岐山县| 湖州市| 会昌县| 前郭尔| 塘沽区| 普洱| 南和县| 佛教| 崇阳县| 广水市| 安吉县| 武威市| 三江| 乌审旗| 博野县| 全椒县| 大足县| 新闻| 武安市| 二连浩特市| 太保市| 青岛市| 乐清市| 桦南县| 曲阜市| 北宁市| 北辰区| 新田县| 五常市| 和政县| 榆树市| 平陆县| 屏边| 大渡口区| 晋宁县|