fork(1) 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('/,/', '', $input);
  36. foreach ($stopWords as $word) {
  37. $input = preg_replace("/\\b$word\\b/u", '', $input);
  38. }
  39.  
  40. $sentences = preg_split('/\./', $input, 0, PREG_SPLIT_NO_EMPTY);
  41.  
  42. //Формируем словосочетания
  43. foreach ($sentences as $sentence) {
  44. $words = preg_split('/ /', $sentence, 0, PREG_SPLIT_NO_EMPTY);
  45. foreach ($words as $key => $word) {
  46. $oneWords[] = $word;
  47. //Прерываем цикл на последнем слове.
  48. if ($key == (count($words) - 1)) {
  49. break;
  50. }
  51. $twoWords[] = $word . ' ' . $words[$key + 1];
  52. if ($key !== 0) {
  53. $threeWords[] = $words[$key - 1] . ' ' . $word . ' ' . $words[$key + 1];
  54. }
  55. }
  56. }
  57.  
  58. //Считаем, удаляем все что было найдено 1 раз и сортируем
  59. $countWords = array_diff(array_count_values($oneWords), array(1));
  60. $countTwoWords = array_diff(array_count_values($twoWords), array(1));
  61. $countThreeWords = array_diff(array_count_values($threeWords), array(1));
  62. arsort($countWords, SORT_NUMERIC);
  63. arsort($countTwoWords, SORT_NUMERIC);
  64. arsort($countThreeWords, SORT_NUMERIC);
  65.  
  66. //Удаляем слова и словосочеания являющиеся часть других
  67. $countWords = removeRepetition($countThreeWords, $countWords);
  68. $countWords = removeRepetition($countTwoWords, $countWords);
  69. $countTwoWords = removeRepetition($countThreeWords, $countTwoWords);
  70.  
  71. $top = array_merge($countWords, $countTwoWords, $countThreeWords);
  72.  
  73. //Выводим результат нашей магии
  74. if ($top == '') {
  75. echo 'Увы, но в данном тексте нет частых слов или словосочетаний встречающихся больше одного раза :(';
  76. } elseif (count($top) == 1) {
  77. foreach ($top as $words => $count) {
  78. echo 'Самое частое слово/словосочетание: "' . $words . '", оно встречается - ' . $count .
  79. ' раз.';
  80. }
  81. } else {
  82. arsort($top);
  83. echo "Самые частые слова/словосочетания:\n";
  84. foreach ($top as $words => $count) {
  85. echo $words . " - встречается " . $count . " раз.\n";
  86. }
  87. }
Success #stdin #stdout 0.01s 20568KB
stdin
Standard input is empty
stdout
Самое частое слово/словосочетание: "сохраняются отношения", оно встречается - 5 раз.