1. 宝贝属性的扩展和类型的问题初步已经得到很好的控制了,不过要推广和运营维护还是遇到了很大的障碍。
2. 对关键词的拆分使用了scws扩展以及自己原生的业务拆词方案,拆词有效的解决了词组方面的匹配难度。
3. 所有的初始工作好像已经完成了,只需要最后的整理项目应该可以正式运行起来了。
小帅帅的主动意识比较强烈,他没有去问于老大,就自己动手写了份代码,该代码主要是为了把所有的步骤连接起来。
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 }