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