最新的架構:高併發數據採集的架構應用(Redis的應用)html
吐槽:今天也是剛把心態調整好,繼續寫之前沒有完成的文章,最近幾個月本身也是休整了一段時間,回家作苦力,也看成是鍛鍊鍛鍊本身的身體,畢竟任何東西都換不回你的健康,我也是建議作IT行業的帥哥們多活動活動大家其它的部位。面試
第二十二天算法
起點:手把手教你作關鍵詞匹配項目(搜索引擎)---- 第一天編程
回顧:手把手教你作關鍵詞匹配項目(搜索引擎)---- 第二十一天架構
小帥帥是樂於作總結的人,根據之前所學的知識他總結了以下:併發
1. 寶貝屬性的擴展和類型的問題初步已經獲得很好的控制了,不過要推廣和運營維護仍是遇到了很大的障礙。高併發
2. 對關鍵詞的拆分使用了scws擴展以及本身原生的業務拆詞方案,拆詞有效的解決了詞組方面的匹配難度。post
3. 全部的初始工做好像已經完成了,只須要最後的整理項目應該能夠正式運行起來了。測試
小帥帥的主動意識比較強烈,他沒有去問於老大,就本身動手寫了份代碼,該代碼主要是爲了把全部的步驟鏈接起來。
寶貝屬性的擴展CharList的構建請參照:手把手教你作關鍵詞匹配項目(搜索引擎)---- 第十二天 ~ 手把手教你作關鍵詞匹配項目(搜索引擎)---- 第十八天
Selector主要步驟以下:
1. 獲取寶貝屬性。
2. 使用業務知識擴充寶貝屬性,造成CharList
3. 從詞庫中獲取關鍵詞
4. 關鍵詞拆分算法
5. 匹配度算法
6. 返回匹配上的關鍵詞列表
代碼以下:
1 <?php 2 #@Filename:selector/Selector.php 3 #@Author:oshine 4 5 require_once dirname(__FILE__) . '/SelectorItem.php'; 6 require_once dirname(__FILE__) . '/charlist/CharList.php'; 7 require_once dirname(__FILE__) . '/charlist/CharlistHandle.php'; 8 require_once dirname(dirname(__FILE__)) . '/lib/Logger.php'; 9 10 class Selector 11 { 12 13 private static $charListHandle = array( 14 "黑名單" => "BacklistCharListHandle", 15 "近義詞" => "LinklistCharListHandle" 16 ); 17 18 public static function select($num_iid) 19 { 20 $selectorItem = SelectorItem::createFromApi($num_iid); 21 22 Logger::trace($selectorItem->props_name); 23 24 $charlist = new CharList(); 25 26 foreach (self::$charListHandle as $matchKey => $className) { 27 28 $handle = self::createCharListHandle($className, $charlist, $selectorItem); 29 $handle->exec(); 30 31 } 32 33 $selectWords = array(); 34 35 $keywords = DB::makeArray("select word from keywords"); 36 foreach ($keywords as $val) { 37 # code... 38 $keywordEntity = SplitterApp::split($val["word"]); 39 40 # code... 41 if(MacthExector::macth($keywordEntity,$charlist)){ 42 $selectWords[] = $val["word"]; 43 } 44 45 } 46 47 return $selectWords; 48 } 49 50 public static function createCharListHandle($className, $charlist, $selectorItem) 51 { 52 if (class_exists($className)) { 53 return new $className($charlist, $selectorItem); 54 } 55 throw new Exception("class not exists", 0); 56 } 57 }
測試驅動代碼編程請參照:
也是使用同樣的原理,先把測試代碼寫好,後續補全MatchExector代碼。
MatchExector主要功能計算匹配度。
1. 若是隻要有一個詞在黑名單裏面,匹配度確定爲零。
2. 若是是核心詞,那麼根據之前提到的算法來計算,請參照:手把手教你作關鍵詞匹配項目(搜索引擎)---- 第十九天
1 <?php 2 #@Filename:mathes/MatchExector.php 3 #@Author:oshine 4 5 class MatchExector { 6 7 public static function match(KeywordEntity $keywordEntity,CharList $charlist){ 8 9 $matchingDegree = 0; 10 $elementWords = $keywordEntity->getElementWords(); 11 foreach ($elementWords as $word) { 12 # code... 13 if(in_array($word, $charlist->getBlacklist())) 14 return false; 15 if(in_array($word, $charlist->getCore())) 16 $matchingDegree+=$keywordEntity->calculateWeight($word); 17 18 } 19 20 if($matchingDegree>0.8) 21 return true; 22 return false; 23 24 } 25 26 }
整個代碼相對來講實現了該有的功能,小帥帥很是的高興,由於項目完成了確定少不了項目獎金,說不定還有一餐豐富的晚餐,
想一想都開始流口水了。
小帥帥把代碼交給於老大,滿懷期待的等候於老大的最後確定。
於老大看了以後會有哪些反應呢?請關注第三章:關鍵詞匹配項目深刻研究(一)
第二章已完結,源代碼地址:手把手教你作關鍵詞匹配項目(二章完結篇)