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