• 手把手教你做关键词匹配项目(搜索引擎)---- 第二十二天


    最新面试经历:面试的感触(二)面试的感触

    最新的架构:高并发数据采集的架构应用(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 }

    整个代码相对来说实现了该有的功能,小帅帅非常的高兴,因为项目完成了肯定少不了项目奖金,说不定还有一餐丰富的晚餐,

    想想都开始流口水了。

    小帅帅把代码交给于老大,满怀期待的等候于老大的最后肯定。

    于老大看了之后会有哪些反应呢?请关注第三章:关键词匹配项目深入研究(一)

    第二章已完结,源代码地址:手把手教你做关键词匹配项目(二章完结篇)

  • 相关阅读:
    解决DataGridView中回车换行的问题
    几条经典的SQL语句
    SQL中把一个表中的数据导出到一个新表中
    [转载]TCP的网络编程中一些典型的问题,以及一些分析和解决方案
    Delphi调用C#web服务参数无法接收的问题
    IIS服务器不支持中文文件名的解决方法
    SQL SERVER2005导入导出工具
    为远程IP服务器取个本地认识的主机名
    Win Form中如何把ENter回车键转换成Tab键
    CheckedListBox 用法
  • 原文地址:https://www.cnblogs.com/oshine/p/4179691.html
Copyright © 2020-2023  润新知