За последние 24 часа нас посетили 16126 программистов и 1667 роботов. Сейчас ищет 831 программист ...

Подсчет повторяющихся слов

Тема в разделе "PHP для новичков", создана пользователем New_neo, 17 ноя 2015.

  1. New_neo

    New_neo Новичок

    С нами с:
    15 ноя 2015
    Сообщения:
    77
    Симпатии:
    3
    Здравствуйте! Помогите пожалуйста нужно решить задачу: Подсчет повторяющихся слов, вывод 10 самых частых из текста. Спасибо. Написал только количество:
    Код (PHP):
    1. $text="Текст какой-нибудь";
    2. $ar= preg_split("/[\s,]+/", $text);
    3.         
    4.         
    5.     $res=array();
    6.     foreach($ar as $val)
    7.     $res[$val]++;
    8.     $i=0;
    9.     while (count($ar)>$i) {
    10.                 
    11.         print ($stemmer->stem_word($ar[$i]))." — ".$res[$ar[$i]]."<br/>";
    12.         $i++;
    13.  
    14.     }   
     
  2. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
  3. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    заняться нечем?
     
  4. New_neo

    New_neo Новичок

    С нами с:
    15 ноя 2015
    Сообщения:
    77
    Симпатии:
    3
    Удалить тему "Помогите пожалуйста нужно решить задачу?"
     
  5. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    New_neo, зачем?
     
  6. New_neo

    New_neo Новичок

    С нами с:
    15 ноя 2015
    Сообщения:
    77
    Симпатии:
    3
    Задача оказалась не из легких = найти топ 10 повторяющихся слов в тексте. :-(
     
  7. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    нет, задача простая, правда не надо за нее браться не имея достаточных познаний, бери те задачи, которые можешь сделать.
     
  8. New_neo

    New_neo Новичок

    С нами с:
    15 ноя 2015
    Сообщения:
    77
    Симпатии:
    3
    Я думаю решение 1-нужно найти все максимумы, а дальше будет видно.
     
  9. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    Код (PHP):
    1. $text = 'This is a test is do do do';
    2.  
    3. function rec($text) {
    4.     $ex = explode(' ', $text);
    5.     $str_count = array();
    6.     for ($i = 0; $i < count($ex); $i++) {
    7.         $str_count[$ex[$i]]['count'] = 0;
    8.         for ($j = 0; $j < count($ex); $j++) {
    9.             if ($ex[$i] == $ex[$j]) {
    10.                 $str_count[$ex[$i]]['count']++;
    11.             }
    12.         }
    13.     }
    14.     
    15.     return $str_count;
    16. }
    17.  
    18. echo "<pre>";
    19. var_dump(rec($text)); 
    возможно лучше получится через preg_match_all()
     
  10. New_neo

    New_neo Новичок

    С нами с:
    15 ноя 2015
    Сообщения:
    77
    Симпатии:
    3
    Не совсем понятно?
    А в итоге он не считает топ 10
     
  11. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    тут надо для начала разобраться что есть слова, например "или" это слово или нет, составить словарь "не слов", ну а потом через рег. выражение искать, считать..
    ни чего абсолютно сложного, только писать много.
     
  12. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
  13. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Код (PHP):
    1. $result = array();
    2. foreach (explode(' ', $text) as $w) {
    3.  $result[$w]++;
    4. }
    5. arsort($result);
    6. print_r($result); 
     
  14. New_neo

    New_neo Новичок

    С нами с:
    15 ноя 2015
    Сообщения:
    77
    Симпатии:
    3
    Я решил так
    Код (PHP):
    1. $text="какой-нибудь текст";
    2.         $ar= preg_split("/[\s-,^()]+/ ",$text);
    3.         
    4.         
    5.         
    6.     $res=array();
    7.     foreach($ar as $val)
    8.     $res[$val]++;
    9.     $i=0;
    10.     while (count($ar)>$i) {
    11.                 
    12.                 
    13.         print ($stemmer->stem_word($ar[$i]))." — ".$res[$ar[$i]]."<br/>";
    14.         
    15.                 $i++;
    16.  
    17.     }
    18.         
    19.         
    20.         
    21.         //Ищем самое часто встречаемое слово и заносим в массив $result
    22.  
    23. $result=array_count_values($ar);
    24.  
    25. //ищем максимум в массиве $result 
    26. $max_num=0;
    27. $min_num=0;
    28. $word="";
    29. foreach($result as $key=>$value)
    30. {
    31.  
    32. if($value>$max_num)
    33. {
    34. $max_num=$value;
    35. $word=$key;
    36. }
    37. }
    38. echo "Слово <b>".$word."</b> встретилос чаще всех <b>".$max_num."</b> раз<br>"; 
    Теперь нужно найти топ 10 слов самых частых
     
  15. New_neo

    New_neo Новичок

    С нами с:
    15 ноя 2015
    Сообщения:
    77
    Симпатии:
    3
    Топ 10 повторяющихся слов:
    Код (PHP):
    1.         
    2.                 $result=array_count_values($ar);
    3.  
    4.                 //ищем максимум в массиве $result 
    5. $max_num=0;
    6.     $min_num=0;
    7.         $word="";
    8.             asort($result);
    9.         $result=array_slice($result, -10);
    10.     foreach($result as $key=>$value)
    11.     {
    12.  
    13.     if($value>$max_num)
    14.     {
    15.  
    16.     $max_num=$value;
    17.     $word=$key;
    18.     }
    19.  
    20.     echo "<td>".$stemmer->stem_word($key)."</td><td align='center'>".$value."</td><tr>";
    21.     } 
     
  16. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    Чисто ради прикола, напиши пожалуйста через регулярные выражения)
     
  17. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    New_neo, а самому дописать чего не хватало, там до возврата просто через функции пропустить оставалось)
    Код (PHP):
    1. $text = 'This is a test is do do do do kk kk ddd ddd ttt ttt ppp ppp ';
    2.  
    3. function rec($text) {
    4.     $ex = explode(' ', $text);
    5.     $str_count = array();
    6.     for ($i = 0; $i < count($ex); $i++) {
    7.         $str_count[$ex[$i]]['count'] = 0;
    8.         for ($j = 0; $j < count($ex); $j++) {
    9.             if ($ex[$i] == $ex[$j]) {
    10.                 $str_count[$ex[$i]]['count'] ++;
    11.             }
    12.         }
    13.     }
    14.     arsort($str_count); //сортируем
    15.     // по совету Ganzal срезаем массив
    16.     //оставляем нужное количество
    17.     $str_count = array_slice($str_count, 0, 10); 
    18.     return $str_count; //возвращаем результат
    19. }
    20.  
    21. echo "<pre>";
    22. var_dump(rec($text));
    Добавлено спустя 8 минут 31 секунду:
    [vs], твой вариант сыплет нотисы, но работает. Понятно почему сыплет, но не хотелось бы)

    Добавлено спустя 16 минут 54 секунды:
    его в роли explode?
     
  18. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Угу. Я просто хотел показать, что базовый алгоритм очень простой. Остается только решить проблемы с разным регистром и знаками препинания, которые могут прилипнуть к словам.
     
  19. New_neo

    New_neo Новичок

    С нами с:
    15 ноя 2015
    Сообщения:
    77
    Симпатии:
    3
    Нормальный код! Только как теперь это в нормальный вид привести, например в таблицу?
     
  20. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    New_neo, подсказка:
    Код (PHP):
    1. foreach ($arr as $key => $value) {
    2.     echo "Ключ: $key; Значение: $value<br />\n";
    3. }
     
  21. New_neo

    New_neo Новичок

    С нами с:
    15 ноя 2015
    Сообщения:
    77
    Симпатии:
    3
    вместо значения $value пишет Array, в чем беда?
     
  22. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
  23. New_neo

    New_neo Новичок

    С нами с:
    15 ноя 2015
    Сообщения:
    77
    Симпатии:
    3
    Доработал код чтоб выводил на экран результат:
    Код (PHP):
    1. function rec($text) {
    2.     $stemmer = new Lingua_Stem_Ru();
    3.         $text = preg_replace('/[ ]([\S]{1,2}|[\S]{21,})[ ]/',' ', $text);
    4.     $text = preg_replace('/[^\p{L}0-9 ]/iu',' ', $text);
    5.         $text = preg_replace('#\s*?\r?\n\s*?(?=\r\n|\n)#s', "", $text);
    6.         while ( strpos($text,'  ')!==false )
    7.  {
    8.    $text = str_replace('  ',' ',$text);
    9.  }; 
    10.         $ex = explode(' ', $text);
    11.     $str_count = array();
    12.     for ($i = 0; $i < count($ex); $i++) {
    13.         $str_count[$ex[$i]]['count'] = 0;
    14.         for ($j = 0; $j < count($ex); $j++) {
    15.             if ($ex[$i] == $ex[$j]) {
    16.                 $str_count[$ex[$i]]['count'] ++;
    17.             }
    18.         }
    19.     }
    20.     arsort($str_count); //сортируем
    21.     // по совету Ganzal срезаем массив
    22.     //оставляем нужное количество
    23.     $str_count = array_slice($str_count, 0, 10); 
    24.     //return $str_count; //возвращаем результат
    25.         echo "<div align='center'><table border='1' colspan='2'><caption><b>Топ 10 слов :</b></caption>
    26.                     <tr><td align='center'><b>Слово</b></td>
    27.                     <td align='center' ><b>Кол-во:</b></td></tr><tr>";
    28.         foreach ($str_count as $key=>$value) {
    29.     echo "<td>".$stemmer->stem_word($key)."</td><td>".$value['count']."</td></tr>";
    30. }
    31. echo "</table></div></body></html>";
    32. }
    33. rec($text);
    34. } 
     
  24. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    New_neo, и этот код как выложил работает?

    Вообще, ты что-то оттуда что-то отсюда взял и что-то сделал...
     
  25. New_neo

    New_neo Новичок

    С нами с:
    15 ноя 2015
    Сообщения:
    77
    Симпатии:
    3
    Да работает код нормально- есть баги конечно, ну то уже я как-нибудь доделаю. Всем спасибо огромное!