Как стать автором
Обновить

Полуавтоматическое добавление тегов — решение

Время на прочтение8 мин
Количество просмотров486
Как-то в сентябре некто torwald положил идею, о полуавтоматической генерации ключевых слов, но решения не было предложено.

Послушав предложения на форуме ngcms и 2z-project родилось появилось решение:

View



class.php (класс который определяет ключевые слова)
  1. <?
  2. class autokeyword {
  3.         var $contents;
  4.         var $encoding;
  5.         var $keywords;
  6.         var $wordLengthMin;
  7.         var $wordOccuredMin;
  8.         var $wordLengthMax;
  9.         var $wordGoodArray;
  10.         var $wordBlockArray;
  11.         var $wordMaxCount;
  12.         var $wordB;
  13.         var $wordAddTitle;
  14.         var $wordTitle;
  15.         function autokeyword($params, $encoding)
  16.         {
  17.                 $this->wordGoodArray = array();
  18.                 $this->wordBlockArray = array();
  19.                 $this->encoding = $encoding;
  20.                 $this->wordLengthMin = $params['min_word_length'];
  21.                 $this->wordLengthMax = $params['max_word_length'];
  22.                 $this->wordMaxCount = $params['word_count'];
  23.                 if($params['good_b']) {$this->wordB = 1;}
  24.                 if($params['add_title'] > 0)
  25.                 {
  26.                 $this->wordAddTitle = $params['add_title']; $this->wordTitle = $params['title'];
  27.                 for($i=0; $i<$this->wordAddTitle;$i++){$content .= $this->wordTitle.' ';}
  28.                 $params['content'] = $content.' '.$params['content'];
  29.                 }
  30.                 if($params['good_array'] && $params['good_word'] == true){$this->wordGoodArray = explode("\r\n",$params['good_array']);}
  31.                 if($params['block_array'] && $params['block_word'] == true){$this->wordBlockArray = explode("\r\n",$params['block_array']);}   
  32.                 $this->contents = $this->replace_chars($params['content']);
  33.         }
  34.         function replace_chars($content)
  35.         {
  36.                 $content = strtolower($content);
  37.                 $content = strip_tags($content);
  38.                 if($this->wordB == 1){$content = preg_replace('![b](.*)[/b]!si','$1 $1',$content); }
  39.                 $punctuations = array(',', ')', '(', '.', "'", '"','<', '>', ';', '!', '?', '/', '-',
  40.                 '_', '[', ']', ':', '+', '=', '#','$', '"', '©', '>', '<',chr(10), chr(13), chr(9));
  41.                 $punctuations = array_merge($this->wordBlockArray,$punctuations);
  42.                 $content = str_replace($punctuations, " ", $content);
  43.                 $content = preg_replace('/ {2,}/si', " ", $content);
  44.                 return $content;
  45.         }
  46.         function parse_words()
  47.         {
  48.                 $common = array("aaaaaaa","aaaaaaa");
  49.                 $s = split(" ", $this->contents);
  50.                 $k = array();
  51.                 foreach( $s as $key=>$val ) {
  52.                 if(strlen(trim($val)) >= $this->wordLengthMin && strlen(trim($val)) <= $this->wordLengthMax  && !in_array(trim($val), $common)  && !is_numeric(trim($val)))
  53.                     {
  54.                         $k[] = trim($val);
  55.                     }
  56.                 }
  57.                 $k = array_count_values($k);
  58.                 $occur_filtered = $this->occure_filter($k, $this->wordOccuredMin);
  59.                 arsort($occur_filtered);
  60.                 $occur_filtered = array_flip($this->wordGoodArray) + $occur_filtered;
  61.                 array_splice($occur_filtered,$this->wordMaxCount);
  62.                 $imploded = $this->implode(", ", $occur_filtered);
  63.                 unset($k);
  64.                 unset($s);
  65.                 return $imploded;
  66.         }
  67.         function occure_filter($array_count_values, $min_occur)
  68.         {
  69.                 $occur_filtered = array();
  70.                 foreach ($array_count_values as $word => $occured) {
  71.                         if ($occured >= $min_occur) {
  72.                                 $occur_filtered[$word] = $occured;
  73.                         }
  74.                 }
  75.                 return $occur_filtered;
  76.         }

  77.         function implode($gule, $array)
  78.         {
  79.                 $c = "";
  80.                 foreach($array as $key=>$val) {
  81.                         @$c .= $key.$gule;
  82.                 }
  83.                 return $c;
  84.         }
  85. }
  86. ?>


ajax.php (который вернёт облако)
  1. <?
  2. if($_POST['q'])
  3. {
  4. header('Content-type: text/html; charset=windows-1251');
  5. include_once("class.php");
  6. if($_POST['q']=='' || $_POST['q']=='undefined ') die('{"res":"error", "msg":"Нет данных!"}');
  7.     $params['content'] = iconv('UTF-8', 'windows-1251', $_POST['q']);
  8.     $params['min_word_length'] = 5; // минимальная длина слова
  9.     $params['max_word_length'] = 100; // максимальная длина слова
  10.     $params['min_word_occur'] = 2; // минимальное количество посторений
  11.     $params['word_sum'] = 245; // максимальная длина всех слов (учитывая точку пробел)
  12.     $params['block_word'] = false; // блокировать стоп слова (которые не хотите добавлять)
  13.     $params['block_array'] = 'привет'; // список стоп слов (разделитель новая строка)
  14.     $params['good_word'] = false; // добавлять любимые слова (которые очень хотите добавлить)
  15.     $params['good_array'] = 'хабрахабр'; // список любимых слов (разделитель новая строка)
  16.     $params['add_title'] = 0; // добавлять заголовк (количество раз котое нужно добавть заголовок)
  17.     $params['word_count'] = 245; // максимальное количество слов
  18.     $params['good_b'] = false;  // считать слова в теге <b> как двойные
  19.     $keyword = new autokeyword($params, "windows-1251");
  20.     $SQL['keywords'] = substr($keyword->parse_words(),0,$params['word_sum']);
  21.     $SQL['keywords'] = substr($SQL['keywords'],0,strrpos($SQL['keywords'], ', '));             
  22.     echo '{"res":"ok", "x1":"<span>'.$SQL['keywords'].'</span>"}';
  23. }
  24. ?>



js.js (отправляет запрос с вашей страницы)

  1. function SendPOST()
  2. {
  3.     var data = document.form.content.value;
  4.     var title = document.form.title.value;
  5.     ajaxSendPOST('ajax.php','q='+encodeURI(title)+' '+encodeURI(data), SendCallback);
  6. }
  7. function SendCallback(answer) {
  8.     var ans = eval( '(' + answer + ')' );  
  9.     if (ans.res=='error') { alert('Пусто?');return; }
  10.     if (ans.res!='ok') { alert('Незнаю что сказать');return; }
  11.     keys_out = ans.x1;
  12.     keys_out = keys_out.replace(/, /g,'</span> <span>');
  13.     document.getElementById('autokey_out').innerHTML = keys_out;
  14.     key_span = document.getElementById('autokey_out');
  15.     key_click = key_span.getElementsByTagName('span');
  16.     for(i in key_click)
  17.         {
  18.         key_click[i].onclick = function(){
  19.         if(document.form.keywords.value == '')
  20.             {
  21.             document.form.keywords.value = this.innerHTML;
  22.             this.parentNode.removeChild(this);
  23.             }
  24.         else
  25.             {
  26.             document.form.keywords.value += ', '+this.innerHTML;
  27.             this.parentNode.removeChild(this)
  28.             }
  29.         }
  30.     }
  31. }
  32. function ajaxSendPOST(xmlpage,data,callback)
  33. {
  34.     var xmlh = null;
  35.     if(window.XMLHttpRequest)
  36.         xmlh = new XMLHttpRequest();
  37.     else
  38.         try
  39.             {xmlh = new ActiveXObject('Msxml2.XMLHTTP');}
  40.         catch(ex)
  41.             {xmlh = new ActiveXObject('Microsoft.XMLHTTP');}
  42.     if(xmlh)
  43.     {
  44.         xmlh.open('post', xmlpage, true);
  45.         xmlh.onreadystatechange = function(x) { if(xmlh.readyState==4) callback(xmlh.responseText); }
  46.         xmlh.setRequestHeader("Accept-Charset", "windows-1251");
  47.         xmlh.setRequestHeader("Accept-Language","ru, en");
  48.         xmlh.setRequestHeader("Connection", "close");
  49.         xmlh.setRequestHeader("Content-length", data.length);
  50.         xmlh.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
  51.         xmlh.send(data);
  52.     }
  53. }



index.php
  1. <script type="text/javascript" src="js.js"></script>
  2. <style type="text/css">
  3. #autokey_out span {cursor:pointer; text-decoration:underline}
  4. </style>
  5. <form id="postForm" name="form" method="post" action="#" target="_self">
  6. <textarea name="content" rows="16" cols="60" tabindex="2"></textarea>
  7. <br />
  8. <input type="text" name="keywords" size="60" value="">
  9. <input type="submit" value="Get Keywords" name="autokey_keys" onclick="javascript:SendPOST(); return false;">
  10. <br />
  11. <div id="autokey_out"></div>
  12. </form>



Сорсы

Это первая статья. Не ругайте сильно.
______________________
Теги:
Хабы:
Всего голосов 23: ↑17 и ↓6+11
Комментарии9

Публикации

Истории

Ближайшие события