最新面試經歷:面試的感觸(二)、面試的感觸
最新的架構:高並發數據采集的架構應用(Redis的應用)
吐槽:今天也是剛把心態調整好,繼續寫以前沒有完成的文章,最近幾個月自己也是休整了一段時間,回家做苦力,也當作是鍛煉鍛煉自己的身體,畢竟任何東西都換不回你的健康,我也是建議做IT行業的帥哥們多活動活動你們其它的部位。
第二十二天
起點:手把手教你做關鍵詞匹配項目(搜索引擎)---- 第一天
回顧:手把手教你做關鍵詞匹配項目(搜索引擎)---- 第二十一天
小帥帥是樂於做總結的人,根據以前所學的知識他總結了如下:
1. 寶貝屬性的擴展和類型的問題初步已經得到很好的控制了,不過要推廣和運營維護還是遇到了很大的障礙。
2. 對關鍵詞的拆分使用了scws擴展以及自己原生的業務拆詞方案,拆詞有效的解決了詞組方面的匹配難度。
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 }
整個代碼相對來說實現了該有的功能,小帥帥非常的高興,因為項目完成了肯定少不了項目獎金,說不定還有一餐豐富的晚餐,
想想都開始流口水了。
小帥帥把代碼交給於老大,滿懷期待的等候於老大的最後肯定。
於老大看了之後會有哪些反應呢?請關注第三章:關鍵詞匹配項目深入研究(一)
第二章已完結,源代碼地址:手把手教你做關鍵詞匹配項目(二章完結篇)