Advertisement
Guest User

Untitled

a guest
Mar 30th, 2017
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 19.93 KB | None | 0 0
  1. <?php
  2.  
  3. namespace app\modules\nomad\models\Exports;
  4.  
  5. class Keywords {
  6.     private $partialIndexList = [25, 27, 29, 30, 35, 37, 39, 42, 44, 45, 76, 77, 89, 90, 120, 121, 135, 136];
  7.  
  8.     const EVENT_TYPE_SPORT = 'SPORT';
  9.     const EVENT_TYPE_THEATER = 'THEATER';
  10.     const EVENT_TYPE_CONCERT = 'CONCERT';
  11.     const AD_TYPE_DEFAULT = 'default';
  12.     const AD_TYPE_CONCERT = 'concert';
  13.     const AD_TYPE_TOUR = 'tour';
  14.  
  15.     /**
  16.      *
  17.      * @param array $keywordsParams
  18.      * @param string $eventType SPORT|THEATER|CONCERT
  19.      * @param string $eventCategory
  20.      * @param bool $partial
  21.      * @param string $adBlock default|concert|tour
  22.      * @return array
  23.      */
  24.     public function getKeywordsList($keywordsParams, $eventType, $eventCategory, $partial = false, $adBlock = 'default') {
  25.         $keywordsList = [];
  26.         $keywordsMap = $this->getKeywordsMap($adBlock, $eventType);
  27.  
  28.         foreach ($keywordsMap as $adBlock => $keywords) {
  29.             foreach ($keywords as $index => $keyword) {
  30.                 if (in_array($index, $this->partialIndexList) && $partial) {
  31.                     continue;
  32.                 }
  33.                 foreach ($keywordsParams as $param => $value) {
  34.                     if (strpos($keyword, '+' . $param) !== false) {
  35.                         $keyword = str_replace('+' . $param, $this->addPlusForEveryWord($value), $keyword);
  36.                     } elseif (strpos($keyword, $param) !== false) {
  37.                         $keyword = str_replace($param, $value, $keyword);
  38.                     }
  39.                 }
  40.  
  41.                 $keywordsList[$index] = [
  42.                     'Criterion Type' => $adBlock,
  43.                     'Keyword' => $keyword
  44.                 ];
  45.             }
  46.         }
  47.  
  48.         if ($eventType == self::EVENT_TYPE_SPORT) {
  49.             $keywordsList = $this->prepareKeywordsList($keywordsList, $keywordsParams, $eventCategory);
  50.            
  51.         }
  52.  
  53.         $resultKeywordsList = [];
  54.         foreach ($keywordsList as $keywords) {
  55.             $keyword = $keywords['Keyword'];
  56.             $keyword = strtolower(
  57.                 str_replace([" - ", ":"], [" ", ""], $keyword)
  58.             );
  59.  
  60.             $keyword = $this->deduplicateTerms($keyword);
  61.  
  62.             if (!$this->checkKeywordsByLimits($keyword)) {
  63.                 continue;
  64.             }
  65.            
  66.             $resultKeywordsList[md5($keywords['Criterion Type'].$keyword)] = [
  67.                 'Criterion Type' => $keywords['Criterion Type'],
  68.                 'Keyword' => $keyword
  69.             ];
  70.         }
  71.        
  72.         //$resultKeywordsList = array_map("unserialize", array_unique(array_map("serialize", $resultKeywordsList)));
  73.         return $resultKeywordsList;
  74.  
  75.     }
  76.    
  77.     private function prepareKeywordsList(array $keywordsList, array $keywordsParams, $eventCategory) {
  78.         $sportKeywords = $this->getAdditionalSportKeywords();
  79.         $sportKeywordParams = $this->getSportKeywordParamsByCategory($eventCategory);
  80.         $sportKeywordParams = array_merge($sportKeywordParams, $keywordsParams);
  81.  
  82.         foreach ($sportKeywordParams as $param => $valuesStr) {
  83.  
  84.             $values = explode(',', $valuesStr);
  85.             $sportKeywordsQueue = [];
  86.             foreach ($sportKeywords as $sportKeyword) {
  87.                 if (strpos($sportKeyword, $param) !== false) {
  88.                     if (empty($valuesStr)) {
  89.                         continue;
  90.                     }
  91.                 }
  92.                
  93.                 foreach ($values as $value) {
  94.                     $sportKeywordsQueue[] = str_replace($param, $value, $sportKeyword);
  95.                 }
  96.             }
  97.  
  98.             $sportKeywords = $sportKeywordsQueue;
  99.         }
  100.  
  101.        array_map(function($key)use(&$keywordsList){
  102.             $keywordsList[] = [
  103.                 'Criterion Type' => 'Broad',
  104.                 'Keyword' => $this->addPlusForEveryWord($key)
  105.             ];
  106.             $keywordsList[] = [
  107.                 'Criterion Type' => 'Exact',
  108.                 'Keyword' => $key
  109.             ];
  110.         }, array_unique($sportKeywords));
  111.        
  112.         return $keywordsList;
  113.  
  114.     }
  115.  
  116.     private function getKeywordsMap($adBlock, $eventType) {
  117.         $negativeBroad = [
  118.             self::AD_TYPE_DEFAULT => [
  119.                 'Negative Broad' => [
  120.                     47 => 'tour',
  121.                     48 => 'concert'
  122.                 ]
  123.             ],
  124.             self::AD_TYPE_CONCERT => [
  125.                
  126.             ],
  127.             self::AD_TYPE_TOUR => [
  128.                
  129.             ]
  130.         ];
  131.        
  132.         $keywordsMap = [
  133.             self::AD_TYPE_DEFAULT => [
  134.                 'Broad' => [
  135.                     22 => '+{EventName} +{Venue}',
  136.                     23 => '+{EventName} +tickets +{Venue}',
  137.                     24 => '+{EventName} +tickets',
  138.                     25 => '+{EventName} +{City}',
  139.                     26 => '+{EventName} +tickets +{City}',
  140.                     27 => '+{EventName} +{State}',
  141.                     28 => '+{EventName} +tickets +{State}',
  142.                     29 => '+{EventName}',
  143.                     30 => '+{EventName} +{Year}',
  144.                     31 => '+{EventName} +{Year} +tickets'
  145.                 ],
  146.                 'Exact' => [
  147.                     32 => '{EventName} {Venue}',
  148.                     33 => '{EventName} tickets {Venue}',
  149.                     34 => '{EventName} tickets',
  150.                     35 => '{EventName} {City}',
  151.                     36 => '{EventName} tickets {City}',
  152.                     37 => '{EventName} {City} {State}',
  153.                     38 => '{EventName} tickets {City} {State}',
  154.                     39 => '{EventName} {City} {StateAbbreviation}',
  155.                     40 => '{EventName} tickets {City} {StateAbbreviation}',
  156.                     41 => 'tickets {EventName}',
  157.                     42 => '{EventName} {State}',
  158.                     43 => '{EventName} tickets {State}',
  159.                     44 => '{EventName}',
  160.                     45 => '{EventName} {Year}',
  161.                     46 => '{EventName} {Year} tickets'
  162.                 ],
  163.             ],
  164.             self::AD_TYPE_CONCERT => [
  165.                 'Broad' => [
  166.                     68 => '+{EventName} +concert +{Venue}',
  167.                     69 => '+{EventName} +concert +tickets +{Venue}',
  168.                     70 => '+{EventName} +concert +tickets',
  169.                     71 => '+{EventName} +concert +{City}',
  170.                     72 => '+{EventName} +concert +tickets +{City}',
  171.                     73 => '+{EventName} +concert +{State}',
  172.                     74 => '+{EventName} +concert +tickets +{State}',
  173.                     75 => '+{EventName} +concert',
  174.                     76 => '+{EventName} +{Year} +concert',
  175.                     77 => '+{EventName} +{Year} +concert +tickets'
  176.                 ],
  177.                 'Exact' => [
  178.                     78 => '{EventName} concert',
  179.                     79 => '{EventName} concert {Venue}',
  180.                     80 => '{EventName} concert tickets {Venue}',
  181.                     81 => '{EventName} concert tickets',
  182.                     82 => '{EventName} concert {City}',
  183.                     83 => '{EventName} concert tickets {City}',
  184.                     84 => '{EventName} concert {City} {State}',
  185.                     85 => '{EventName} concert tickets {City} {State}',
  186.                     86 => '{EventName} concert {City} {StateAbbreviation}',
  187.                     87 => '{EventName} concert tickets {City} {StateAbbreviation}',
  188.                     88 => 'concert tickets {EventName}',
  189.                     89 => '{EventName} {Year} concert',
  190.                     90 => '{EventName} {Year} concert tickets'
  191.                 ],
  192.             ],
  193.             self::AD_TYPE_TOUR => [
  194.                 'Broad' => [
  195.                     110 => '+{EventName} +tour +{Venue}',
  196.                     111 => '+{EventName} +tour +tickets +{Venue}',
  197.                     112 => '+{EventName} +tour +tickets',
  198.                     113 => '+{EventName} +tour +{City}',
  199.                     114 => '+{EventName} +tour +tickets +{City}',
  200.                     115 => '+{EventName} +tour +{State}',
  201.                     116 => '+{EventName} +tour +tickets +{State}',
  202.                     117 => '+{EventName} +tour',
  203.                     118 => '+{EventName} +concert +tour',
  204.                     119 => '+{EventName} +concert +tour +tickets',
  205.                     120 => '+{EventName} +{Year} +tour',
  206.                     121 => '+{EventName} +{Year} +tour +tickets'
  207.                 ],
  208.                 'Exact' => [
  209.                     122 => '{EventName} tour',
  210.                     123 => '{EventName} concert tour',
  211.                     124 => '{EventName} concert tour tickets',
  212.                     125 => '{EventName} tour {Venue}',
  213.                     126 => '{EventName} tour tickets {Venue}',
  214.                     127 => '{EventName} tour tickets',
  215.                     128 => '{EventName} tour {City}',
  216.                     129 => '{EventName} tour tickets {City}',
  217.                     130 => '{EventName} tour {City} {State}',
  218.                     131 => '{EventName} tour tickets {City} {State}',
  219.                     132 => '{EventName} tour {City} {StateAbbreviation}',
  220.                     133 => '{EventName} tour tickets {City} {StateAbbreviation}',
  221.                     134 => 'tour tickets {EventName}',
  222.                     135 => '{EventName} {Year} tour',
  223.                     136 => '{EventName} {Year} tour tickets'
  224.                 ]
  225.             ]
  226.         ];
  227.  
  228.         switch ($eventType) {
  229.             case self::EVENT_TYPE_CONCERT:
  230.                 $template = array_merge($keywordsMap[$adBlock], $negativeBroad[$adBlock]);
  231.                 break;
  232.             case self::EVENT_TYPE_SPORT:
  233.             case self::EVENT_TYPE_THEATER:
  234.             default:
  235.                 $template = $keywordsMap[$adBlock];
  236.         }
  237.  
  238.         return $template;
  239.  
  240.     }
  241.  
  242.     private function getAdditionalSportKeywords() {
  243.         $addSportKeywords = [
  244.             '{EventName} {EventTerm} {Venue}',
  245.             '{EventName} {SportTerm} {EventTerm} {Venue}',
  246.             '{EventName} {LeagueTerm} {EventTerm} {Venue}',
  247.             '{EventName} {LeagueTerm} tickets {Venue}',
  248.             '{EventName} {SportTerm} tickets {Venue}',
  249.             '{EventName} {LeagueTerm} tickets',
  250.             '{EventName} {SportTerm} tickets',
  251.             '{EventName} {EventTerm} tickets',
  252.             '{EventName} {LeagueTerm} {SportTerm} tickets',
  253.             '{EventName} {SportTerm} {EventTerm} tickets',
  254.             '{EventName} {LeagueTerm} {EventTerm} tickets',
  255.             '{EventName} {LeagueTerm} {City}',
  256.             '{EventName} {SportTerm} {City}',
  257.             '{EventName} {EventTerm} {City}',
  258.             '{EventName} {LeagueTerm} {SportTerm} {City}',
  259.             '{EventName} {SportTerm} {EventTerm} {City}',
  260.             '{EventName} {LeagueTerm} {EventTerm} {City}',
  261.             '{EventName} {SportTerm} tickets {City}',
  262.             '{EventName} {EventTerm} tickets {City}',
  263.             '{EventName} {SportTerm} {City} {State}',
  264.             '{EventName} {EventTerm} {City} {State}',
  265.             '{EventName} {LeagueTerm} tickets {City} {State}',
  266.             '{EventName} {SportTerm} tickets {City} {State}',
  267.             '{EventName} {EventTerm} tickets {City} {State}',
  268.             '{EventName} {SportTerm} {City} {StateAbbreviation}',
  269.             '{EventName} {EventTerm} {City} {StateAbbreviation}',
  270.             '{EventName} {LeagueTerm} {SportTerm} {City} {StateAbbreviation}',
  271.             '{EventName} {SportTerm} {EventTerm} {City} {StateAbbreviation}',
  272.             '{EventName} {LeagueTerm} tickets {City} {StateAbbreviation}',
  273.             '{EventName} {SportTerm} tickets {City} {StateAbbreviation}',
  274.             '{EventName} {EventTerm} tickets {City} {StateAbbreviation}',
  275.             '{LeagueTerm} {EventName} tickets',
  276.             '{EventName} {SportTerm} tickets',
  277.             '{EventName} {EventTerm} tickets',
  278.             '{EventName} {LeagueTerm} {SportTerm} tickets',
  279.             '{EventName} {LeagueTerm} {SportTerm} {EventTerm} tickets',
  280.             '{EventName} {SportTerm} {EventTerm} tickets',
  281.             '{EventName} {LeagueTerm} {EventTerm} tickets',
  282.             '{EventName} {LeagueTerm}',
  283.             '{EventName} {SportTerm}',
  284.             '{EventName} {EventTerm}',
  285.             '{EventName} {LeagueTerm} {SportTerm}',
  286.             '{EventName} {LeagueTerm} {SportTerm} {EventTerm}',
  287.             '{EventName} {SportTerm} {EventTerm}',
  288.             '{EventName} {LeagueTerm} {EventTerm}',
  289.             '{EventName} {Year} {LeagueTerm}',
  290.             '{EventName} {Year} {SportTerm}',
  291.             '{EventName} {Year} {EventTerm}',
  292.             '{EventName} {Year} {LeagueTerm} {SportTerm}',
  293.             '{EventName} {Year} {LeagueTerm} {SportTerm} {EventTerm}',
  294.             '{EventName} {Year} {SportTerm} {EventTerm}',
  295.             '{EventName} {Year} {LeagueTerm} {EventTerm}',
  296.             '{EventName} {Year} {LeagueTerm} tickets',
  297.             '{EventName} {Year} {SportTerm} tickets',
  298.             '{EventName} {Year} {EventTerm} tickets',
  299.             '{EventName} {Year} {LeagueTerm} {SportTerm} tickets',
  300.             '{EventName} {Year} {LeagueTerm} {SportTerm} {EventTerm} tickets',
  301.             '{EventName} {Year} {SportTerm} {EventTerm} tickets',
  302.             '{EventName} {Year} {LeagueTerm} {EventTerm} tickets'
  303.         ];
  304.  
  305.         return $addSportKeywords;
  306.     }
  307.  
  308.     private function getSportKeywordParamsByCategory($category) {
  309.         $sportKeywordVariables = $this->getSportKeywordParamVariables();
  310.  
  311.         return isset($sportKeywordVariables[$category]) ? $sportKeywordVariables[$category] : [];
  312.     }
  313.  
  314.     private function getSportKeywordParamVariables() {
  315.         $sportKeywordVariables = [
  316.             'Arena Football' => [
  317.                 '{LeagueTerm}' => '',
  318.                 '{SportTerm}' => 'Football',
  319.                 '{EventTerm}' => 'Game'
  320.             ],
  321.             'Baseball' => [
  322.                 '{LeagueTerm}' => '',
  323.                 '{SportTerm}' => 'Baseball',
  324.                 '{EventTerm}' => 'Game'
  325.             ],
  326.             'Basketball' => [
  327.                 '{LeagueTerm}' => '',
  328.                 '{SportTerm}' => 'Basketball,Bball',
  329.                 '{EventTerm}' => 'Game'
  330.             ],
  331.             'Boxing and Fighting' => [
  332.                 '{LeagueTerm}' => '',
  333.                 '{SportTerm}' => '',
  334.                 '{EventTerm}' => ''
  335.             ],
  336.             'College' => [
  337.                 '{LeagueTerm}' => '',
  338.                 '{SportTerm}' => '',
  339.                 '{EventTerm}' => ''
  340.             ],
  341.             'College Baseball' => [
  342.                 '{LeagueTerm}' => '',
  343.                 '{SportTerm}' => 'Baseball',
  344.                 '{EventTerm}' => 'Game'
  345.             ],
  346.             'Extreme Sports' => [
  347.                 '{LeagueTerm}' => '',
  348.                 '{SportTerm}' => '',
  349.                 '{EventTerm}' => ''
  350.             ],
  351.             'Football' => [
  352.                 '{LeagueTerm}' => '',
  353.                 '{SportTerm}' => 'Football',
  354.                 '{EventTerm}' => 'Game'
  355.             ],
  356.             'Gymnastics' => [
  357.                 '{LeagueTerm}' => '',
  358.                 '{SportTerm}' => 'Gymnastics',
  359.                 '{EventTerm}' => ''
  360.             ],
  361.             'Hockey' => [
  362.                 '{LeagueTerm}' => '',
  363.                 '{SportTerm}' => 'Hockey',
  364.                 '{EventTerm}' => 'Game'
  365.             ],
  366.             'Horse Racing' => [
  367.                 '{LeagueTerm}' => '',
  368.                 '{SportTerm}' => '',
  369.                 '{EventTerm}' => 'Race'
  370.             ],
  371.             'Lacrosse' => [
  372.                 '{LeagueTerm}' => '',
  373.                 '{SportTerm}' => 'Lacrosse',
  374.                 '{EventTerm}' => 'Game,Match'
  375.             ],
  376.             'Minor League Baseball' => [
  377.                 '{LeagueTerm}' => 'Baseball',
  378.                 '{SportTerm}' => '',
  379.                 '{EventTerm}' => 'Game'
  380.             ],
  381.             'MLB Baseball' => [
  382.                 '{LeagueTerm}' => 'MLB',
  383.                 '{SportTerm}' => 'Baseball',
  384.                 '{EventTerm}' => 'Game'
  385.             ],
  386.             'Motorsports' => [
  387.                 '{LeagueTerm}' => '',
  388.                 '{SportTerm}' => '',
  389.                 '{EventTerm}' => ''
  390.             ],
  391.             'NASCAR Racing' => [
  392.                 '{LeagueTerm}' => 'NASCAR',
  393.                 '{SportTerm}' => '',
  394.                 '{EventTerm}' => 'Race'
  395.             ],
  396.             'NBA Basketball' => [
  397.                 '{LeagueTerm}' => 'NBA',
  398.                 '{SportTerm}' => 'Basketball,Bball',
  399.                 '{EventTerm}' => 'Game'
  400.             ],
  401.             'NCAA Basketball' => [
  402.                 '{LeagueTerm}' => 'NCAAB,NCAA',
  403.                 '{SportTerm}' => 'College Basketball,Basketball,Bball',
  404.                 '{EventTerm}' => 'Game'
  405.             ],
  406.             'NCAA Football' => [
  407.                 '{LeagueTerm}' => 'NCAAF,NCAA',
  408.                 '{SportTerm}' => 'Football,College Football',
  409.                 '{EventTerm}' => 'Game'
  410.             ],
  411.             'NFL Football' => [
  412.                 '{LeagueTerm}' => 'NFL',
  413.                 '{SportTerm}' => 'Football',
  414.                 '{EventTerm}' => 'Game'
  415.             ],
  416.             'NHL Hockey' => [
  417.                 '{LeagueTerm}' => 'NHL',
  418.                 '{SportTerm}' => 'Hockey',
  419.                 '{EventTerm}' => 'Game'
  420.             ],
  421.             'Olympics' => [
  422.                 '{LeagueTerm}' => '',
  423.                 '{SportTerm}' => '',
  424.                 '{EventTerm}' => ''
  425.             ],
  426.             'Other Sports' => [
  427.                 '{LeagueTerm}' => '',
  428.                 '{SportTerm}' => '',
  429.                 '{EventTerm}' => ''
  430.             ],
  431.             'PGA Golf' => [
  432.                 '{LeagueTerm}' => 'PGA',
  433.                 '{SportTerm}' => 'Golf',
  434.                 '{EventTerm}' => 'Tournament'
  435.             ],
  436.             'Racing' => [
  437.                 '{LeagueTerm}' => '',
  438.                 '{SportTerm}' => '',
  439.                 '{EventTerm}' => ''
  440.             ],
  441.             'Rodeo' => [
  442.                 '{LeagueTerm}' => '',
  443.                 '{SportTerm}' => 'Rodeo',
  444.                 '{EventTerm}' => ''
  445.             ],
  446.             'Rugby' => [
  447.                 '{LeagueTerm}' => '',
  448.                 '{SportTerm}' => 'Rugby',
  449.                 '{EventTerm}' => 'Match'
  450.             ],
  451.             'Skating' => [
  452.                 '{LeagueTerm}' => '',
  453.                 '{SportTerm}' => 'Skating',
  454.                 '{EventTerm}' => ''
  455.             ],
  456.             'Soccer' => [
  457.                 '{LeagueTerm}' => '',
  458.                 '{SportTerm}' => 'Soccer',
  459.                 '{EventTerm}' => 'Game,Match'
  460.             ],
  461.             'Softball' => [
  462.                 '{LeagueTerm}' => '',
  463.                 '{SportTerm}' => 'Softball',
  464.                 '{EventTerm}' => 'Game'
  465.             ],
  466.             'Tennis' => [
  467.                 '{LeagueTerm}' => '',
  468.                 '{SportTerm}' => 'Tennis',
  469.                 '{EventTerm}' => 'Match,Tournament'
  470.             ],
  471.             'Volleyball' => [
  472.                 '{LeagueTerm}' => '',
  473.                 '{SportTerm}' => 'Volleyball',
  474.                 '{EventTerm}' => 'Game'
  475.             ],
  476.             'Wrestling' => [
  477.                 '{LeagueTerm}' => '',
  478.                 '{SportTerm}' => 'Wrestling',
  479.                 '{EventTerm}' => 'Match'
  480.             ]
  481.         ];
  482.  
  483.         return $sportKeywordVariables;
  484.     }
  485.    
  486.     public function addPlusForEveryWord($text) {
  487.         return '+' . str_replace([' ', ' +-'], [' +', ' -'], $text);
  488.  
  489.     }
  490.  
  491.     private function deduplicateTerms($text) {
  492.         $textAr = explode(" ", $text);
  493.         $textAr = array_unique($textAr);
  494.         $text = implode(" ", $textAr);
  495.  
  496.         return $text;
  497.     }
  498.  
  499.     private function checkKeywordsByLimits($keywords, $charactersLimit = 80, $wordsLimit = 10) {
  500.         if (!empty($keywords)) {
  501.             if (strlen($keywords) > $charactersLimit || substr_count($keywords, ' ') > $wordsLimit - 1) {
  502.                 return false;
  503.             }
  504.         }
  505.  
  506.         return true;
  507.  
  508.     }
  509.  
  510. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement