国产探花免费观看_亚洲丰满少妇自慰呻吟_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編程

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

  • 發表評論 共有條評論
    用戶名: 密碼:
    驗證碼: 匿名發表
    主站蜘蛛池模板: 锦屏县| 沅陵县| 琼海市| 正安县| 高邑县| 西昌市| 尚义县| 自贡市| 松江区| 潼南县| 衡东县| 阿城市| 东台市| 吴江市| 江源县| 葵青区| 额尔古纳市| 会同县| 九江市| 青川县| 杨浦区| 深圳市| 分宜县| 赤水市| 乌兰浩特市| 封开县| 江永县| 惠东县| 蓝山县| 苍山县| 琼海市| 广丰县| 垫江县| 桓仁| 富民县| 河源市| 阿勒泰市| 鲁山县| 元氏县| 交口县| 明溪县|