Здравствуйте! Помогите пожалуйста нужно решить задачу: Подсчет повторяющихся слов, вывод 10 самых частых из текста. Спасибо. Написал только количество: Код (PHP): $text="Текст какой-нибудь"; $ar= preg_split("/[\s,]+/", $text); $res=array(); foreach($ar as $val) $res[$val]++; $i=0; while (count($ar)>$i) { print ($stemmer->stem_word($ar[$i]))." — ".$res[$ar[$i]]."<br/>"; $i++; }
нет, задача простая, правда не надо за нее браться не имея достаточных познаний, бери те задачи, которые можешь сделать.
Код (PHP): $text = 'This is a test is do do do'; function rec($text) { $ex = explode(' ', $text); $str_count = array(); for ($i = 0; $i < count($ex); $i++) { $str_count[$ex[$i]]['count'] = 0; for ($j = 0; $j < count($ex); $j++) { if ($ex[$i] == $ex[$j]) { $str_count[$ex[$i]]['count']++; } } } return $str_count; } echo "<pre>"; var_dump(rec($text)); возможно лучше получится через preg_match_all()
тут надо для начала разобраться что есть слова, например "или" это слово или нет, составить словарь "не слов", ну а потом через рег. выражение искать, считать.. ни чего абсолютно сложного, только писать много.
вы издеваетесь? https://php.net/manual/en/function.str-word-count.php + https://php.net/manual/en/function.krsort.php + https://php.net/manual/en/function.array-slice.php
Код (PHP): $result = array(); foreach (explode(' ', $text) as $w) { $result[$w]++; } arsort($result); print_r($result);
Я решил так Код (PHP): $text="какой-нибудь текст"; $ar= preg_split("/[\s-,^()]+/ ",$text); $res=array(); foreach($ar as $val) $res[$val]++; $i=0; while (count($ar)>$i) { print ($stemmer->stem_word($ar[$i]))." — ".$res[$ar[$i]]."<br/>"; $i++; } //Ищем самое часто встречаемое слово и заносим в массив $result $result=array_count_values($ar); //ищем максимум в массиве $result $max_num=0; $min_num=0; $word=""; foreach($result as $key=>$value) { if($value>$max_num) { $max_num=$value; $word=$key; } } echo "Слово <b>".$word."</b> встретилос чаще всех <b>".$max_num."</b> раз<br>"; Теперь нужно найти топ 10 слов самых частых
Топ 10 повторяющихся слов: Код (PHP): $result=array_count_values($ar); //ищем максимум в массиве $result $max_num=0; $min_num=0; $word=""; asort($result); $result=array_slice($result, -10); foreach($result as $key=>$value) { if($value>$max_num) { $max_num=$value; $word=$key; } echo "<td>".$stemmer->stem_word($key)."</td><td align='center'>".$value."</td><tr>"; }
New_neo, а самому дописать чего не хватало, там до возврата просто через функции пропустить оставалось) Код (PHP): $text = 'This is a test is do do do do kk kk ddd ddd ttt ttt ppp ppp '; function rec($text) { $ex = explode(' ', $text); $str_count = array(); for ($i = 0; $i < count($ex); $i++) { $str_count[$ex[$i]]['count'] = 0; for ($j = 0; $j < count($ex); $j++) { if ($ex[$i] == $ex[$j]) { $str_count[$ex[$i]]['count'] ++; } } } arsort($str_count); //сортируем // по совету Ganzal срезаем массив //оставляем нужное количество $str_count = array_slice($str_count, 0, 10); return $str_count; //возвращаем результат } echo "<pre>"; var_dump(rec($text)); Добавлено спустя 8 минут 31 секунду: [vs], твой вариант сыплет нотисы, но работает. Понятно почему сыплет, но не хотелось бы) Добавлено спустя 16 минут 54 секунды: его в роли explode?
Угу. Я просто хотел показать, что базовый алгоритм очень простой. Остается только решить проблемы с разным регистром и знаками препинания, которые могут прилипнуть к словам.
New_neo, подсказка: Код (PHP): foreach ($arr as $key => $value) { echo "Ключ: $key; Значение: $value<br />\n"; }
New_neo $value содержит массив. Вот инструкция как разобраться в работе программы и отладить её http://phpfaq.ru/debug https://netbeans.org/kb/docs/php/debugging_ru.html Код (PHP): $str = "This is a test is do do do do kk kk ddd ddd ttt ttt ppp ppp "; $r = array_count_values(str_word_count($str, 1)); arsort($r); var_export($r);
Доработал код чтоб выводил на экран результат: Код (PHP): function rec($text) { $stemmer = new Lingua_Stem_Ru(); $text = preg_replace('/[ ]([\S]{1,2}|[\S]{21,})[ ]/',' ', $text); $text = preg_replace('/[^\p{L}0-9 ]/iu',' ', $text); $text = preg_replace('#\s*?\r?\n\s*?(?=\r\n|\n)#s', "", $text); while ( strpos($text,' ')!==false ) { $text = str_replace(' ',' ',$text); }; $ex = explode(' ', $text); $str_count = array(); for ($i = 0; $i < count($ex); $i++) { $str_count[$ex[$i]]['count'] = 0; for ($j = 0; $j < count($ex); $j++) { if ($ex[$i] == $ex[$j]) { $str_count[$ex[$i]]['count'] ++; } } } arsort($str_count); //сортируем // по совету Ganzal срезаем массив //оставляем нужное количество $str_count = array_slice($str_count, 0, 10); //return $str_count; //возвращаем результат echo "<div align='center'><table border='1' colspan='2'><caption><b>Топ 10 слов :</b></caption> <tr><td align='center'><b>Слово</b></td> <td align='center' ><b>Кол-во:</b></td></tr><tr>"; foreach ($str_count as $key=>$value) { echo "<td>".$stemmer->stem_word($key)."</td><td>".$value['count']."</td></tr>"; } echo "</table></div></body></html>"; } rec($text); }
New_neo, и этот код как выложил работает? Вообще, ты что-то оттуда что-то отсюда взял и что-то сделал...