<?php
//Топ N самых часто встречающихся слов и словосочетаний в тексте(из 2-3-х слов)
$stopWords = array('и', 'у', 'к', 'с', 'о', 'от', 'в', 'же', 'из', 'на', '.', ','); $input = 'Эта функция сортирует массив в обратном порядке таким образом, что
сохраняются отношения между ключами и значениями. Сохраняются отношения и
сохраняются отношения и еще сохраняются отношения и опять сохраняются отношения.';
//Функция удаляющая слова и словосочетания являющиеся частью больших словосочений
function removeRepetition($moreWords, $words)
{
foreach ($moreWords as $moreWord => $moreCount) {
foreach ($words as $word => $count) {
//если во втором массиве словосочетания, иначе слова
if ((mb_strpos($moreWord, $word) !== false) && ($count == $moreCount)) { }
} else {
$severalWords = explode(' ', $moreWord); if ((count($matches) != 0) && ($moreCount == $count)) { }
}
}
}
return $words;
}
//Удаляем лишнее и разбиваем текст на слова и знаки препинания
$words = preg_split('/ /', $input, 0, PREG_SPLIT_NO_EMPTY
);
//Формируем словосочетания
foreach ($words as $key => $word) {
//Прерываем цикл на последнем слове.
if ($key == (count($words) - 1)) { break;
}
//Если текущее слово из списка стоп слов переходим к следуещему
continue;
}
$nextKey = $key + 1;
//Если следующее слово из стоп слов переходим к следующему слову(по хорошему тут надо перескакивать через 1
//но я хз как)
if (in_array($words[$nextKey], $stopWords)) { continue;
}
//Если же текущее и следующее слово в порядке составляем словосочетание из 2-х слов
$twoWords[] = $word . ' ' . $words[$nextKey];
//Так же проверяем предыдущее слово, если оно существует и не находится в стоп списке
//делаем словосочетание из 3-х слов
$prevKey = $key - 1;
if ($prevKey < 0) {
continue;
} elseif (in_array($words[$prevKey], $stopWords)) { continue;
}
$threeWords[] = $words[$prevKey] . ' ' . $word . ' ' . $words[$nextKey];
}
//Удаляем из массива со словами все что есть в стоп списке
foreach ($words as $key => $word) {
}
}
//Считаем, удаляем все что было найдено 1 раз и сортируем
arsort($countWords, SORT_NUMERIC
); arsort($countTwoWords, SORT_NUMERIC
); arsort($countThreeWords, SORT_NUMERIC
);
//Удаляем слова и словосочеания являющиеся часть других
$countWords = removeRepetition($countThreeWords, $countWords);
$countWords = removeRepetition($countTwoWords, $countWords);
$countTwoWords = removeRepetition($countThreeWords, $countTwoWords);
$top = array_merge($countWords, $countTwoWords, $countThreeWords);
//Выводим результат нашей магии
if ($top == '') {
echo 'Увы, но в данном тексте нет частых слов или словосочетаний встречающихся больше одного раза :(';
} elseif (count($top) == 1) { foreach ($top as $words => $count) {
echo 'Самое частое слово/словосочетание: "' . $words . '", оно встречается - ' . $count .
' раз.';
}
} else {
echo "Самые частые слова/словосочетания:\n";
foreach ($top as $words => $count) {
echo $words . " - встречается " . $count . " раз.\n";
}
}
PD9waHAKLy/QotC+0L8gTiDRgdCw0LzRi9GFINGH0LDRgdGC0L4g0LLRgdGC0YDQtdGH0LDRjtGJ0LjRhdGB0Y8g0YHQu9C+0LIg0Lgg0YHQu9C+0LLQvtGB0L7Rh9C10YLQsNC90LjQuSDQsiDRgtC10LrRgdGC0LUo0LjQtyAyLTMt0YUg0YHQu9C+0LIpCm1iX2ludGVybmFsX2VuY29kaW5nKCdVdGYtOCcpOwoKJHN0b3BXb3JkcyA9IGFycmF5KCfQuCcsICfRgycsICfQuicsICfRgScsICfQvicsICfQvtGCJywgJ9CyJywgJ9C20LUnLCAn0LjQtycsICfQvdCwJywgJy4nLCAnLCcpOwokaW5wdXQgPSAn0K3RgtCwINGE0YPQvdC60YbQuNGPINGB0L7RgNGC0LjRgNGD0LXRgiDQvNCw0YHRgdC40LIg0LIg0L7QsdGA0LDRgtC90L7QvCDQv9C+0YDRj9C00LrQtSDRgtCw0LrQuNC8INC+0LHRgNCw0LfQvtC8LCDRh9GC0L4K0YHQvtGF0YDQsNC90Y/RjtGC0YHRjyDQvtGC0L3QvtGI0LXQvdC40Y8g0LzQtdC20LTRgyDQutC70Y7Rh9Cw0LzQuCDQuCDQt9C90LDRh9C10L3QuNGP0LzQuC4g0KHQvtGF0YDQsNC90Y/RjtGC0YHRjyDQvtGC0L3QvtGI0LXQvdC40Y8g0LgK0YHQvtGF0YDQsNC90Y/RjtGC0YHRjyDQvtGC0L3QvtGI0LXQvdC40Y8g0Lgg0LXRidC1INGB0L7RhdGA0LDQvdGP0Y7RgtGB0Y8g0L7RgtC90L7RiNC10L3QuNGPINC4INC+0L/Rj9GC0Ywg0YHQvtGF0YDQsNC90Y/RjtGC0YHRjyDQvtGC0L3QvtGI0LXQvdC40Y8uJzsKCi8v0KTRg9C90LrRhtC40Y8g0YPQtNCw0LvRj9GO0YnQsNGPINGB0LvQvtCy0LAg0Lgg0YHQu9C+0LLQvtGB0L7Rh9C10YLQsNC90LjRjyDRj9Cy0LvRj9GO0YnQuNC10YHRjyDRh9Cw0YHRgtGM0Y4g0LHQvtC70YzRiNC40YUg0YHQu9C+0LLQvtGB0L7Rh9C10L3QuNC5CmZ1bmN0aW9uIHJlbW92ZVJlcGV0aXRpb24oJG1vcmVXb3JkcywgJHdvcmRzKQp7CiAgICBmb3JlYWNoICgkbW9yZVdvcmRzIGFzICRtb3JlV29yZCA9PiAkbW9yZUNvdW50KSB7CiAgICAgICAgZm9yZWFjaCAoJHdvcmRzIGFzICR3b3JkID0+ICRjb3VudCkgewogICAgICAgICAgICAvL9C10YHQu9C4INCy0L4g0LLRgtC+0YDQvtC8INC80LDRgdGB0LjQstC1INGB0LvQvtCy0L7RgdC+0YfQtdGC0LDQvdC40Y8sINC40L3QsNGH0LUg0YHQu9C+0LLQsAogICAgICAgICAgICBpZiAocHJlZ19tYXRjaCgnL1x3KyBcdysvdScsICR3b3JkKSkgewogICAgICAgICAgICAgICAgaWYgKChtYl9zdHJwb3MoJG1vcmVXb3JkLCAkd29yZCkgIT09IGZhbHNlKSAmJiAoJGNvdW50ID09ICRtb3JlQ291bnQpKSB7CiAgICAgICAgICAgICAgICAgICAgdW5zZXQoJHdvcmRzWyR3b3JkXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkc2V2ZXJhbFdvcmRzID0gZXhwbG9kZSgnICcsICRtb3JlV29yZCk7CiAgICAgICAgICAgICAgICAkb25lV29yZCA9IGFycmF5KCR3b3JkKTsKICAgICAgICAgICAgICAgICRtYXRjaGVzID0gYXJyYXlfaW50ZXJzZWN0KCRvbmVXb3JkLCAkc2V2ZXJhbFdvcmRzKTsKICAgICAgICAgICAgICAgIGlmICgoY291bnQoJG1hdGNoZXMpICE9IDApICYmICgkbW9yZUNvdW50ID09ICRjb3VudCkpIHsKICAgICAgICAgICAgICAgICAgICB1bnNldCgkd29yZHNbJHdvcmRdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAkd29yZHM7Cn0KCi8v0KPQtNCw0LvRj9C10Lwg0LvQuNGI0L3QtdC1INC4INGA0LDQt9Cx0LjQstCw0LXQvCDRgtC10LrRgdGCINC90LAg0YHQu9C+0LLQsCDQuCDQt9C90LDQutC4INC/0YDQtdC/0LjQvdCw0L3QuNGPCiRpbnB1dCA9IG1iX3N0cnRvbG93ZXIoJGlucHV0KTsKJGlucHV0ID0gcHJlZ19yZXBsYWNlKCcvW1xcclxcbl0vJywgJyAnLCAkaW5wdXQpOwokaW5wdXQgPSBwcmVnX3JlcGxhY2UoJy9bLixdLycsICcgJDAnLCAkaW5wdXQpOwokd29yZHMgPSBwcmVnX3NwbGl0KCcvIC8nLCAkaW5wdXQsIDAsIFBSRUdfU1BMSVRfTk9fRU1QVFkpOwoKLy/QpNC+0YDQvNC40YDRg9C10Lwg0YHQu9C+0LLQvtGB0L7Rh9C10YLQsNC90LjRjwpmb3JlYWNoICgkd29yZHMgYXMgJGtleSA9PiAkd29yZCkgewogICAgLy/Qn9GA0LXRgNGL0LLQsNC10Lwg0YbQuNC60Lsg0L3QsCDQv9C+0YHQu9C10LTQvdC10Lwg0YHQu9C+0LLQtS4KICAgIGlmICgka2V5ID09IChjb3VudCgkd29yZHMpIC0gMSkpIHsKICAgICAgICBicmVhazsKICAgIH0KICAgIC8v0JXRgdC70Lgg0YLQtdC60YPRidC10LUg0YHQu9C+0LLQviDQuNC3INGB0L/QuNGB0LrQsCDRgdGC0L7QvyDRgdC70L7QsiDQv9C10YDQtdGF0L7QtNC40Lwg0Log0YHQu9C10LTRg9C10YnQtdC80YMKICAgIGlmIChpbl9hcnJheSgkd29yZCwgJHN0b3BXb3JkcykpIHsKICAgICAgICBjb250aW51ZTsKICAgIH0KICAgICRuZXh0S2V5ID0gJGtleSArIDE7CiAgICAvL9CV0YHQu9C4INGB0LvQtdC00YPRjtGJ0LXQtSDRgdC70L7QstC+INC40Lcg0YHRgtC+0L8g0YHQu9C+0LIg0L/QtdGA0LXRhdC+0LTQuNC8INC6INGB0LvQtdC00YPRjtGJ0LXQvNGDINGB0LvQvtCy0YMo0L/QviDRhdC+0YDQvtGI0LXQvNGDINGC0YPRgiDQvdCw0LTQviDQv9C10YDQtdGB0LrQsNC60LjQstCw0YLRjCDRh9C10YDQtdC3IDEKICAgIC8v0L3QviDRjyDRhdC3INC60LDQuikKICAgIGlmIChpbl9hcnJheSgkd29yZHNbJG5leHRLZXldLCAkc3RvcFdvcmRzKSkgewogICAgICAgIGNvbnRpbnVlOwogICAgfQogICAgLy/QldGB0LvQuCDQttC1INGC0LXQutGD0YnQtdC1INC4INGB0LvQtdC00YPRjtGJ0LXQtSDRgdC70L7QstC+INCyINC/0L7RgNGP0LTQutC1INGB0L7RgdGC0LDQstC70Y/QtdC8INGB0LvQvtCy0L7RgdC+0YfQtdGC0LDQvdC40LUg0LjQtyAyLdGFINGB0LvQvtCyCiAgICAkdHdvV29yZHNbXSA9ICR3b3JkIC4gJyAnIC4gJHdvcmRzWyRuZXh0S2V5XTsKICAgIC8v0KLQsNC6INC20LUg0L/RgNC+0LLQtdGA0Y/QtdC8INC/0YDQtdC00YvQtNGD0YnQtdC1INGB0LvQvtCy0L4sINC10YHQu9C4INC+0L3QviDRgdGD0YnQtdGB0YLQstGD0LXRgiDQuCDQvdC1INC90LDRhdC+0LTQuNGC0YHRjyDQsiDRgdGC0L7QvyDRgdC/0LjRgdC60LUKICAgIC8v0LTQtdC70LDQtdC8INGB0LvQvtCy0L7RgdC+0YfQtdGC0LDQvdC40LUg0LjQtyAzLdGFINGB0LvQvtCyCiAgICAkcHJldktleSA9ICRrZXkgLSAxOwogICAgaWYgKCRwcmV2S2V5IDwgMCkgewogICAgICAgIGNvbnRpbnVlOwogICAgfSBlbHNlaWYgKGluX2FycmF5KCR3b3Jkc1skcHJldktleV0sICRzdG9wV29yZHMpKSB7CiAgICAgICAgY29udGludWU7CiAgICB9CiAgICAkdGhyZWVXb3Jkc1tdID0gJHdvcmRzWyRwcmV2S2V5XSAuICcgJyAuICR3b3JkIC4gJyAnIC4gJHdvcmRzWyRuZXh0S2V5XTsKfQoKLy/Qo9C00LDQu9GP0LXQvCDQuNC3INC80LDRgdGB0LjQstCwINGB0L4g0YHQu9C+0LLQsNC80Lgg0LLRgdC1INGH0YLQviDQtdGB0YLRjCDQsiDRgdGC0L7QvyDRgdC/0LjRgdC60LUKZm9yZWFjaCAoJHdvcmRzIGFzICRrZXkgPT4gJHdvcmQpIHsKICAgIGlmIChpbl9hcnJheSgkd29yZCwgJHN0b3BXb3JkcykpIHsKICAgICAgICB1bnNldCgkd29yZHNbJGtleV0pOwogICAgfQp9CgovL9Ch0YfQuNGC0LDQtdC8LCDRg9C00LDQu9GP0LXQvCDQstGB0LUg0YfRgtC+INCx0YvQu9C+INC90LDQudC00LXQvdC+IDEg0YDQsNC3INC4INGB0L7RgNGC0LjRgNGD0LXQvAokY291bnRXb3JkcyA9IGFycmF5X2RpZmYoYXJyYXlfY291bnRfdmFsdWVzKCR3b3JkcyksIGFycmF5KDEpKTsKJGNvdW50VHdvV29yZHMgPSBhcnJheV9kaWZmKGFycmF5X2NvdW50X3ZhbHVlcygkdHdvV29yZHMpLCBhcnJheSgxKSk7CiRjb3VudFRocmVlV29yZHMgPSBhcnJheV9kaWZmKGFycmF5X2NvdW50X3ZhbHVlcygkdGhyZWVXb3JkcyksIGFycmF5KDEpKTsKYXJzb3J0KCRjb3VudFdvcmRzLCBTT1JUX05VTUVSSUMpOwphcnNvcnQoJGNvdW50VHdvV29yZHMsIFNPUlRfTlVNRVJJQyk7CmFyc29ydCgkY291bnRUaHJlZVdvcmRzLCBTT1JUX05VTUVSSUMpOwoKLy/Qo9C00LDQu9GP0LXQvCDRgdC70L7QstCwINC4INGB0LvQvtCy0L7RgdC+0YfQtdCw0L3QuNGPINGP0LLQu9GP0Y7RidC40LXRgdGPINGH0LDRgdGC0Ywg0LTRgNGD0LPQuNGFCiRjb3VudFdvcmRzID0gcmVtb3ZlUmVwZXRpdGlvbigkY291bnRUaHJlZVdvcmRzLCAkY291bnRXb3Jkcyk7CiRjb3VudFdvcmRzID0gcmVtb3ZlUmVwZXRpdGlvbigkY291bnRUd29Xb3JkcywgJGNvdW50V29yZHMpOwokY291bnRUd29Xb3JkcyA9IHJlbW92ZVJlcGV0aXRpb24oJGNvdW50VGhyZWVXb3JkcywgJGNvdW50VHdvV29yZHMpOwoKJHRvcCA9IGFycmF5X21lcmdlKCRjb3VudFdvcmRzLCAkY291bnRUd29Xb3JkcywgJGNvdW50VGhyZWVXb3Jkcyk7CgovL9CS0YvQstC+0LTQuNC8INGA0LXQt9GD0LvRjNGC0LDRgiDQvdCw0YjQtdC5INC80LDQs9C40LgKaWYgKCR0b3AgPT0gJycpIHsKICAgIGVjaG8gJ9Cj0LLRiywg0L3QviDQsiDQtNCw0L3QvdC+0Lwg0YLQtdC60YHRgtC1INC90LXRgiDRh9Cw0YHRgtGL0YUg0YHQu9C+0LIg0LjQu9C4INGB0LvQvtCy0L7RgdC+0YfQtdGC0LDQvdC40Lkg0LLRgdGC0YDQtdGH0LDRjtGJ0LjRhdGB0Y8g0LHQvtC70YzRiNC1INC+0LTQvdC+0LPQviDRgNCw0LfQsCA6KCc7Cn0gZWxzZWlmIChjb3VudCgkdG9wKSA9PSAxKSB7CiAgICBmb3JlYWNoICgkdG9wIGFzICR3b3JkcyA9PiAkY291bnQpIHsKICAgICAgICBlY2hvICfQodCw0LzQvtC1INGH0LDRgdGC0L7QtSDRgdC70L7QstC+L9GB0LvQvtCy0L7RgdC+0YfQtdGC0LDQvdC40LU6ICInIC4gJHdvcmRzIC4gJyIsINC+0L3QviDQstGB0YLRgNC10YfQsNC10YLRgdGPIC0gJyAuICRjb3VudCAuCiAgICAgICAgICAgICcg0YDQsNC3Lic7CiAgICB9Cn0gZWxzZSB7CiAgICBhcnNvcnQoJHRvcCk7CiAgICBlY2hvICLQodCw0LzRi9C1INGH0LDRgdGC0YvQtSDRgdC70L7QstCwL9GB0LvQvtCy0L7RgdC+0YfQtdGC0LDQvdC40Y86XG4iOwogICAgZm9yZWFjaCAoJHRvcCBhcyAkd29yZHMgPT4gJGNvdW50KSB7CiAgICAgICAgZWNobyAkd29yZHMgLiAiIC0g0LLRgdGC0YDQtdGH0LDQtdGC0YHRjyAiIC4gJGNvdW50IC4gIiDRgNCw0LcuXG4iOwogICAgfQp9