fork download
  1. <?php
  2. // Топ N самых часто встречающихся слов и словосочетаний в тексте(из 2-3-х слов)
  3.  
  4. $stopWords = array('и', 'у', 'к', 'с', 'о', 'от', 'в', 'же', 'из', 'на', 'не', 'вы', 'как',
  5. 'но', 'чтобы', 'что');
  6. $input = 'Эта функция сортирует массив в обратном порядке таким образом, что
  7. сохраняются отношения между ключами и значениями. Сохраняются отношения и
  8. сохраняются отношения и еще сохраняются отношения и опять сохраняются отношения.';
  9.  
  10. // Функция удаляющая слова и словосочетания являющиеся частью больших словосочений
  11. function removeRepetition($moreWords, $words)
  12. {
  13. // Создаем индекс слов из больших словосочетаний
  14. $bigPhrases = array_keys($moreWords);
  15. foreach ($bigPhrases as $moreKey => $moreWord) {
  16. $temp = explode(' ', $moreWord);
  17. foreach ($temp as $key) {
  18. $index[$key][] = $moreKey;
  19. }
  20. }
  21. if (!isset($index)) {
  22. return $words;
  23. }
  24.  
  25. //массив с информацие о том сколько раз было найдено большое словосочетание
  26. $frequencies = array_values($moreWords);
  27. // Если во втором массиве словосочетания, иначе слова
  28. foreach ($words as $phrase => $frequency) {
  29. if (mb_strpos($phrase, ' ') != false) {
  30. $tempWords = explode(' ', $phrase);
  31. $result = array_intersect($index[$tempWords[0]], $index[$tempWords[1]]);
  32. if (!empty($result) && $frequencies[$result[0]] === $frequency) {
  33. unset($words[$phrase]);
  34. }
  35. } else {
  36. if (isset($index[$phrase]) && $frequencies[$index[$phrase][0]] === $frequency) {
  37. unset($words[$phrase]);
  38. }
  39. }
  40. }
  41. return $words;
  42. }
  43.  
  44. // Разбиваем текст на предложения
  45. $input = mb_strtolower($input);
  46. $input = preg_replace('/\s+/u', ' ', $input);
  47. $input = preg_replace('/[^\w.!?\s]/u', '', $input);
  48. $input = trim($input);
  49. $sentences = preg_split('/[.!?]/', $input, 0, PREG_SPLIT_NO_EMPTY);
  50.  
  51. // Формируем словосочетания
  52. foreach ($sentences as $sentence) {
  53. $sentence = trim($sentence);
  54. $words = preg_split('/ /', $sentence, 0, PREG_SPLIT_NO_EMPTY);
  55. $words = array_values(array_diff($words, $stopWords));
  56. for ($i = 0; $i < (count($words) - 1); ++$i) {
  57. $oneWords[] = $words[$i];
  58. $twoWords[] = $words[$i] . ' ' . $words[$i + 1];
  59. if ($i !== 0) {
  60. $threeWords[] = $words[$i - 1] . ' ' . $words[$i] . ' ' . $words[$i + 1];
  61. }
  62. }
  63. $oneWords[] = $words[$i];
  64. }
  65.  
  66. // Считаем, удаляем все что было найдено 1 раз и сортируем
  67. $countWords = array_diff(array_count_values($oneWords), array(1));
  68. $countTwoWords = array_diff(array_count_values($twoWords), array(1));
  69. $countThreeWords = array_diff(array_count_values($threeWords), array(1));
  70.  
  71. // Удаляем слова и словосочеания являющиеся часть других
  72. $countWords = removeRepetition($countThreeWords, $countWords);
  73. $countWords = removeRepetition($countTwoWords, $countWords);
  74. $countTwoWords = removeRepetition($countThreeWords, $countTwoWords);
  75.  
  76. $top = array_merge($countWords, $countTwoWords, $countThreeWords);
  77.  
  78. // Выводим результат нашей магии
  79. if (!count($top)) {
  80. echo 'Увы, но в данном тексте нет частых слов или словосочетаний встречающихся больше одного раза :(';
  81. } elseif (count($top) == 1) {
  82. foreach ($top as $words => $count) {
  83. echo 'Самое частое слово/словосочетание: "' . $words . '", оно встречается - ' . $count .
  84. ' раз.';
  85. }
  86. } else {
  87. arsort($top);
  88. echo "Самые частые слова/словосочетания:\n";
  89. foreach ($top as $words => $count) {
  90. echo $words . " - встречается " . $count . " раз.\n";
  91. }
  92. }
Success #stdin #stdout 0.01s 20568KB
stdin
Standard input is empty
stdout
Самое частое слово/словосочетание: "сохраняются отношения", оно встречается - 5 раз.