Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: подсчет одинаковых слов на странице [2]
Форумы портала PHP.SU » PHP » Программирование на PHP » подсчет одинаковых слов на странице

Страниц (2): « 1 [2]
 

16. JustUserR - 29 Декабря, 2010 - 18:03:07 - перейти к сообщению
LEONeso В качестве наиболее простого решения для предполагаемой вами задачи возможно использование следующей схемы которая однако не является оптимальным - осуществляеся разбиение предоставленной строковой константы на набор слов по ключевому разделителю такому как пробельным символ - после чего обеспечивается просмотр полученного индексного массива и очистка его элементов от дополнительных знаков пунктуации и тд - далее на основании указанного массива осуществляется просмотр его элементов и инкрементация связанных счетчиков в ассоциативном массиве
17. OrmaJever - 29 Декабря, 2010 - 18:05:49 - перейти к сообщению
LEONeso пишет:
OrmaJever, опробовал совет jewel с strip_tags() и даже с fgetss(), применял данные функции к каждой переменной, но все было провально, куда бы я их не тыкал (метод тыка, откинув здравый смысл - отчаянье? )

Когда я писал пост, я отвечал на вопрос про регулярное выражение. А что имено нужно зделать?
18. LEONeso - 29 Декабря, 2010 - 18:17:35 - перейти к сообщению
Хочу, что типа, авто заполнения ключевых слов исходя из контента страницы по частоте их повторения, но есть вероятность, что это не так просто как кажется. Однако типа аналога как в движке DLE, где после создания новости/статической страницы движок сам проверяет (заполнено ли поле, если нет, то заполняет сам)
19. LEONeso - 02 Января, 2011 - 23:29:43 - перейти к сообщению
потыкал, вышло следующее:
PHP:
скопировать код в буфер обмена
  1. $url='http://php.su/';
  2. $content = file_get_contents($url);
  3. $content = strip_tags($content); //удаляем html+php
  4. $content = stripslashes ($content); //удаляем слеши
  5. $content = preg_replace('/\  /s','', $content); //удаляем двойные пробелы
  6. $content = preg_replace('/[(0-9)]/','', $content); //удаляем цифры, если необходимо
  7. $content = preg_replace('/[^(\w)(\s)]/','', $content); //подчищаем все кроме букв (и символов, но их уже нет)
  8. $content = strtolower($content); //преобразуем в нижний регистр
  9. $content = trim($content); //удаляем пробелы до и после слова
  10.  
  11.       $pieces = explode(" ", $content);
  12.       foreach($pieces as $val)
  13.       $pos[$val] = @substr_count($content, $val);
  14.  
  15.  
  16.       foreach($pos as $key => $cal)
  17.       {
  18.             if ($cal >= 3 AND strlen($key) >= 4) {
  19. echo <<<HTML
  20. Кол-во повторений: <b>$key</b> = $cal<br>
  21. HTML;
  22.             }
  23.       }

прокоментил действия (для себя в основном)
попытался максимально зачистить выдачу, но с регулярными проблема.

Слово выводит при условии, что оно повторилось 3 и более раза, слово имеет 4 и более символов.
20. LEONeso - 03 Января, 2011 - 21:44:31 - перейти к сообщению
пока никто ничего не пишет =)

поправил код, добавил странные регулярки, который породил мой мозг
PHP:
скопировать код в буфер обмена
  1. $url='http://smayly.net.ru/';
  2. $content = file_get_contents($url);
  3. $content = strip_tags($content); //удаляем html+php
  4. $content = stripslashes ($content); //удаляем слеши
  5.       $patterns = array (
  6.       '/[(0-9a-zA-Z_\r\n)]/',//удаляем цифры и латиницу, нижнее подчеркивание, конец строки
  7.       '/\  /s',//удаляем двойные пробелы
  8.       '/\       /s',//удаляем табуляторы
  9.       '/[^(\w)(\s)]/'//подчищаем
  10.       );
  11. $content = preg_replace($patterns,null,$content); //прогоняем регулярки
  12. $content = strtolower($content); //преобразуем в нижний регистр
  13. $content = trim($content); //удаляем пробелы до и после слова
  14.  
  15.       $pieces = explode(" ", $content);
  16.       foreach($pieces as $val)
  17.       $pos[$val] = @substr_count($content, $val);
  18.  
  19.  
  20.       foreach($pos as $key => $cal)
  21.       {
  22.             if ($cal >= 3 AND strlen($key) >= 4) {
  23. echo <<<HTML
  24. <b>$key</b> повторений $cal, <br />\r\n
  25. HTML;
  26.             }
  27.       }


результатом работы кода:
CODE (html):
скопировать код в буфер обмена
  1. смайлы повторений 4,
  2. новости повторений 5,
  3. января повторений 3,
  4. будут повторений 3,
  5. проекта повторений 3,
  6. версия повторений 3,
  7. сайта повторений 7,
  8. сайт повторений 21,
  9. будит повторений 3, - кого будит)? до сих пор стыдно, перед посетителями, за эту ошибку
  10. время повторений 3,
  11. сайте повторений 6,
  12. работ повторений 4,
  13. после повторений 4,


как видно, склонения он не понимает, вопрос: с этим можно, что-то поделать? сравнивание слов на совпадение первых букв за исключением последних 2-х? если соответствую друг другу, то объединять и выводить слово, которое меньше имеет букв?
21. movEAX - 04 Января, 2011 - 09:50:32 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1. $text = file_get_contents( 'http://smayly.net.ru' );
  2. $text = mb_strtolower( strip_tags( $text ) );
  3. $patterns = array(
  4.     // заменяем все не кириллические символы и не пробелы
  5.     // на пробельный символ
  6.     '#[^а-я ]#',
  7.     // уничтожаем множественные пробелы
  8.     '# {2,}#'
  9. );
  10. $text = preg_replace( $patterns, ' ', $text );
  11. $words = array_unique( explode( ' ', $text ) );
  12. // оставляем только слова, которые не меньше 4х букв
  13. $words = preg_grep( '#[а-я]{4,}#', $words );
  14. $text .= ' ';
  15.  
  16. foreach( $words as $word ) {
  17.     // исключаем схожие слова, добавляя пробел
  18.     // исключаем слова, вхождениие которых меньше 3х
  19.     if( ( $cnt = substr_count( $text, $word.' ' ) ) < 3 )
  20.         continue;
  21.     echo '<b>', $word, '</b> повторений: ', $cnt, '</br>';
  22. }


На выходе:
смайлы повторений: 4
сайта повторений: 7
новости повторений: 5
сайт повторений: 7
сайте повторений: 6
января повторений: 3
года повторений: 3
проекта повторений: 3
будут повторений: 3
версия повторений: 3
будит повторений: 3
время повторений: 3
22. LEONeso - 04 Января, 2011 - 20:15:39 - перейти к сообщению
movEAX, о спасибо, интересно, но как-то не очень. В итоге он вывел мало слов и большинство из них были одинаковые (по склонению). и не подсчитывает кол-во повторений

попытался скрестить оба кода в один, в итоге провал, но регулярку и некоторые функции подчеркнул для себя (разобрал код).


Попытался с помощью substr() и strlen() устроить следующее:
1. Подсчитать кол-во символов в слове
2. Добавить результат работы strlen в substr при этом разделить на 3 и округлить до целых round('',0) и вычесть данное значение из конца слова
3. далее провести сравнивание слов на схожесть ...

дальше мысль потеряна ... тонна ошибок в коде ... сдался.


в данный момент все осталось на прежнем месте, с малым изменением кода:
PHP:
скопировать код в буфер обмена
  1. $url='http://smayly.net.ru/';
  2. $content = file_get_contents($url);
  3. $content = strip_tags($content); //удаляем html+php
  4. $content = stripslashes ($content); //удаляем слеши
  5.       $patterns = array (
  6.       '/[(0-9a-zA-Z_\r\n\t\0\x0B)]/',//удаляем цифры и латиницу, нижнее подчеркивание, конец строки, табуляторы и нулевой байт
  7.       '/\  /s',//удаляем двойные пробелы
  8.       '#[^а-я ]#i'//ставляем только латиницу и пробелы
  9.       );
  10. $content = preg_replace($patterns,null,$content); //прогоняем регулярки
  11. $content = strtolower($content); //преобразуем в нижний регистр
  12. $content = trim($content); //удаляем пробелы до и после слова , '\x00..\x1F'
  13.  
  14.       $pieces = explode(" ", $content);
  15.      //print_r ($pieces);
  16.       foreach($pieces as $val)
  17.       $pos[$val] = @substr_count($content, $val);
  18.  
  19.  
  20.       foreach($pos as $key => $cal)
  21.       {
  22.             if ($cal >= 3 AND strlen($key) >= 4) {
  23. echo <<<HTML
  24. <b>$key</b> повторений $cal, <br />\r\n
  25. HTML;
  26.             }
  27.       }

если применять, только одну регулярку "#[^а-я ]#i", то результат работы будет такой же, но при просмотре массива, он составит 1200+ ключей и естественно время работы скрипта больше, при полном цикле регулярок, ключей стало 400+, время работы сократилось (с учетом выбранного контента).
23. movEAX - 04 Января, 2011 - 20:26:17 - перейти к сообщению
LEONeso пишет:
если применять, только одну регулярку "#[^а-я ]#i", то результат работы будет такой же, но при просмотре массива, он составит 1200+ ключей и естественно время работы скрипта больше, при полном цикле регулярок, ключей стало 400+, время работы сократилось (с учетом выбранного контента).

array_unique()

Первая регулярка не нужна.
(Добавление)
Какой результат на выходе?
24. JustUserR - 04 Января, 2011 - 20:54:39 - перейти к сообщению
LEONeso пишет:
Дальше мысль потеряна ... тонна ошибок в коде
Для осуществления решения предполагаемой вами задачи в частном случае достаточно использование единичного рерулярного выражения и функции поддержки работы с ассоциативными массивами - в частности вначале осуществляется конфигурация региональных параметров рабочей станции и кодовой таблицы для осуществления представления информационных полей - что позволяет установить элемент разделителя \w для слов русского языка и сохранить их списков из оригинального источника индексный массив - после чего процесс подсчета количества вхождений описан ранее в потоке обсуждения

 

Powered by ExBB FM 1.0 RC1