<?php
//Топ N самых часто встречающихся слов и словосочетаний в тексте(из 2-3-х слов)
$stopWords = array('и', 'у', 'к', 'с', 'о', 'от', 'в', 'же', 'из', 'на', '.', ','); $input = 'Эта функция сортирует массив в обратном порядке таким образом, что
сохраняются отношения между ключами и значениями. Сохраняются отношения и
сохраняются отношения и еще сохраняются отношения и опять сохраняются отношения.';
//Удаляем лишнее и разбиваем текст на слова и знаки препинания
$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
//но я хз как)
continue;
}
//Если же текущее и следующее слово в порядке составляем словосочетание из 2-х слов
$twoWords[] = $word . ' ' . $words[$nextKey];
//Так же проверяем предыдущее слово, если оно существует и не находится в стоп списке
//делаем словосочетание из 3-х слов
$prevKey = $key - 1;
if ($prevKey < 0) {
continue;
} elseif (array_search($words[$prevKey], $stopWords) !== false) { 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
);
//Проверка наличия словосочетаний из 2-х слов и слов в словосочетаниях из 3-х
if (!empty($countThreeWords)) { foreach ($countThreeWords as $words3 => $count3) {
foreach ($countTwoWords as $words2 => $count2) {
if ((mb_strpos($words3, $words2) !== false) && ($count2 == $count3)) { unset($countTwoWords[$words2]); }
}
foreach ($countWords as $word => $count) {
if ((mb_strpos($words2, $word) !== false) && ($count == $count3)) { unset($countWords[$word]); }
$top[$words3] = $count3;
}
}
}
//Проверка наличия слов в словосочитаниях из 2-х слов
if (!empty($countTwoWords)) { foreach ($countTwoWords as $words2 => $count2) {
foreach ($countWords as $word => $count) {
if ((mb_strpos($words2, $word) !== false) && ($count2 == $count)) { unset($countWords[$word]); }
}
$top[$words2] = $count2;
}
}
//Ну и если что то осталось загоняем в топ
if (!empty($countWords)) { foreach ($countWords as $word => $count) {
$top[$word] = $count;
}
}
//Выводим результат нашей магии
echo 'Увы, но в данном тексте нет частых слов или словосочетаний встречающихся больше одного раза :(';
} elseif (count($top) == 1) { foreach ($top as $word => $count) {
echo 'Самое частое слово/словосочетание: "' . $word . '". Оно встречается - ' . $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/RjtGC0YHRjyDQvtGC0L3QvtGI0LXQvdC40Y8uJzsKCi8v0KPQtNCw0LvRj9C10Lwg0LvQuNGI0L3QtdC1INC4INGA0LDQt9Cx0LjQstCw0LXQvCDRgtC10LrRgdGCINC90LAg0YHQu9C+0LLQsCDQuCDQt9C90LDQutC4INC/0YDQtdC/0LjQvdCw0L3QuNGPCiRpbnB1dCA9IG1iX3N0cnRvbG93ZXIoJGlucHV0KTsKJGlucHV0ID0gcHJlZ19yZXBsYWNlKCcvW1xcclxcbl0vJywgJyAnLCAkaW5wdXQpOwokaW5wdXQgPSBwcmVnX3JlcGxhY2UoJy9bLixdLycsICcgJDAnLCAkaW5wdXQpOwokd29yZHMgPSBwcmVnX3NwbGl0KCcvIC8nLCAkaW5wdXQsIDAsIFBSRUdfU1BMSVRfTk9fRU1QVFkpOwoKLy/QpNC+0YDQvNC40YDRg9C10Lwg0YHQu9C+0LLQvtGB0L7Rh9C10YLQsNC90LjRjwpmb3JlYWNoICgkd29yZHMgYXMgJGtleSA9PiAkd29yZCkgewogICAgLy/Qn9GA0LXRgNGL0LLQsNC10Lwg0YbQuNC60Lsg0L3QsCDQv9C+0YHQu9C10LTQvdC10Lwg0YHQu9C+0LLQtS4KICAgIGlmICgka2V5ID09IChjb3VudCgkd29yZHMpIC0gMSkpIHsKICAgICAgICBicmVhazsKICAgIH0KICAgIC8v0JXRgdC70Lgg0YLQtdC60YPRidC10LUg0YHQu9C+0LLQviDQuNC3INGB0L/QuNGB0LrQsCDRgdGC0L7QvyDRgdC70L7QsiDQv9C10YDQtdGF0L7QtNC40Lwg0Log0YHQu9C10LTRg9C10YnQtdC80YMKICAgIGlmIChhcnJheV9zZWFyY2goJHdvcmQsICRzdG9wV29yZHMpICE9PSBmYWxzZSkgewogICAgICAgIGNvbnRpbnVlOwogICAgfQogICAgJG5leHRLZXkgPSAka2V5ICsgMTsKICAgIC8v0JXRgdC70Lgg0YHQu9C10LTRg9GO0YnQtdC1INGB0LvQvtCy0L4g0LjQtyDRgdGC0L7QvyDRgdC70L7QsiDQv9C10YDQtdGF0L7QtNC40Lwg0Log0YHQu9C10LTRg9GO0YnQtdC80YMg0YHQu9C+0LLRgyjQv9C+INGF0L7RgNC+0YjQtdC80YMg0YLRg9GCINC90LDQtNC+INC/0LXRgNC10YHQutCw0LrQuNCy0LDRgtGMINGH0LXRgNC10LcgMQogICAgLy/QvdC+INGPINGF0Lcg0LrQsNC6KQogICAgaWYgKGFycmF5X3NlYXJjaCgkd29yZHNbJG5leHRLZXldLCAkc3RvcFdvcmRzKSAhPT0gZmFsc2UpIHsKICAgICAgICBjb250aW51ZTsKICAgIH0KICAgIC8v0JXRgdC70Lgg0LbQtSDRgtC10LrRg9GJ0LXQtSDQuCDRgdC70LXQtNGD0Y7RidC10LUg0YHQu9C+0LLQviDQsiDQv9C+0YDRj9C00LrQtSDRgdC+0YHRgtCw0LLQu9GP0LXQvCDRgdC70L7QstC+0YHQvtGH0LXRgtCw0L3QuNC1INC40LcgMi3RhSDRgdC70L7QsgogICAgJHR3b1dvcmRzW10gPSAkd29yZCAuICcgJyAuICR3b3Jkc1skbmV4dEtleV07CiAgICAvL9Ci0LDQuiDQttC1INC/0YDQvtCy0LXRgNGP0LXQvCDQv9GA0LXQtNGL0LTRg9GJ0LXQtSDRgdC70L7QstC+LCDQtdGB0LvQuCDQvtC90L4g0YHRg9GJ0LXRgdGC0LLRg9C10YIg0Lgg0L3QtSDQvdCw0YXQvtC00LjRgtGB0Y8g0LIg0YHRgtC+0L8g0YHQv9C40YHQutC1CiAgICAvL9C00LXQu9Cw0LXQvCDRgdC70L7QstC+0YHQvtGH0LXRgtCw0L3QuNC1INC40LcgMy3RhSDRgdC70L7QsgogICAgJHByZXZLZXkgPSAka2V5IC0gMTsKICAgIGlmICgkcHJldktleSA8IDApIHsKICAgICAgICBjb250aW51ZTsKICAgIH0gZWxzZWlmIChhcnJheV9zZWFyY2goJHdvcmRzWyRwcmV2S2V5XSwgJHN0b3BXb3JkcykgIT09IGZhbHNlKSB7CiAgICAgICAgY29udGludWU7CiAgICB9CiAgICAkdGhyZWVXb3Jkc1tdID0gJHdvcmRzWyRwcmV2S2V5XSAuICcgJyAuICR3b3JkIC4gJyAnIC4gJHdvcmRzWyRuZXh0S2V5XTsKfQoKLy/Qo9C00LDQu9GP0LXQvCDQuNC3INC80LDRgdGB0LjQstCwINGB0L4g0YHQu9C+0LLQsNC80Lgg0LLRgdC1INGH0YLQviDQtdGB0YLRjCDQsiDRgdGC0L7QvyDRgdC/0LjRgdC60LUKZm9yZWFjaCAoJHdvcmRzIGFzICRrZXkgPT4gJHdvcmQpIHsKICAgIGlmIChhcnJheV9zZWFyY2goJHdvcmQsICRzdG9wV29yZHMpICE9PSBmYWxzZSkgewogICAgICAgIHVuc2V0KCR3b3Jkc1ska2V5XSk7CiAgICB9Cn0KCi8v0KHRh9C40YLQsNC10LwsINGD0LTQsNC70Y/QtdC8INCy0YHQtSDRh9GC0L4g0LHRi9C70L4g0L3QsNC50LTQtdC90L4gMSDRgNCw0Lcg0Lgg0YHQvtGA0YLQuNGA0YPQtdC8CiRjb3VudFdvcmRzID0gYXJyYXlfZGlmZihhcnJheV9jb3VudF92YWx1ZXMoJHdvcmRzKSwgYXJyYXkoMSkpOwokY291bnRUd29Xb3JkcyA9IGFycmF5X2RpZmYoYXJyYXlfY291bnRfdmFsdWVzKCR0d29Xb3JkcyksIGFycmF5KDEpKTsKJGNvdW50VGhyZWVXb3JkcyA9IGFycmF5X2RpZmYoYXJyYXlfY291bnRfdmFsdWVzKCR0aHJlZVdvcmRzKSwgYXJyYXkoMSkpOwphcnNvcnQoJGNvdW50V29yZHMsIFNPUlRfTlVNRVJJQyk7CmFyc29ydCgkY291bnRUd29Xb3JkcywgU09SVF9OVU1FUklDKTsKYXJzb3J0KCRjb3VudFRocmVlV29yZHMsIFNPUlRfTlVNRVJJQyk7CgovL9Cf0YDQvtCy0LXRgNC60LAg0L3QsNC70LjRh9C40Y8g0YHQu9C+0LLQvtGB0L7Rh9C10YLQsNC90LjQuSDQuNC3IDIt0YUg0YHQu9C+0LIg0Lgg0YHQu9C+0LIg0LIg0YHQu9C+0LLQvtGB0L7Rh9C10YLQsNC90LjRj9GFINC40LcgMy3RhQppZiAoIWVtcHR5KCRjb3VudFRocmVlV29yZHMpKSB7CiAgICBmb3JlYWNoICgkY291bnRUaHJlZVdvcmRzIGFzICR3b3JkczMgPT4gJGNvdW50MykgewogICAgICAgIGZvcmVhY2ggKCRjb3VudFR3b1dvcmRzIGFzICR3b3JkczIgPT4gJGNvdW50MikgewogICAgICAgICAgICBpZiAoKG1iX3N0cnBvcygkd29yZHMzLCAkd29yZHMyKSAhPT0gZmFsc2UpICYmICgkY291bnQyID09ICRjb3VudDMpKSB7CiAgICAgICAgICAgICAgICB1bnNldCgkY291bnRUd29Xb3Jkc1skd29yZHMyXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZm9yZWFjaCAoJGNvdW50V29yZHMgYXMgJHdvcmQgPT4gJGNvdW50KSB7CiAgICAgICAgICAgIGlmICgobWJfc3RycG9zKCR3b3JkczIsICR3b3JkKSAhPT0gZmFsc2UpICYmICgkY291bnQgPT0gJGNvdW50MykpIHsKICAgICAgICAgICAgICAgIHVuc2V0KCRjb3VudFdvcmRzWyR3b3JkXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHRvcFskd29yZHMzXSA9ICRjb3VudDM7CiAgICAgICAgfQogICAgfQp9Ci8v0J/RgNC+0LLQtdGA0LrQsCDQvdCw0LvQuNGH0LjRjyDRgdC70L7QsiDQsiDRgdC70L7QstC+0YHQvtGH0LjRgtCw0L3QuNGP0YUg0LjQtyAyLdGFINGB0LvQvtCyCmlmICghZW1wdHkoJGNvdW50VHdvV29yZHMpKSB7CiAgICBmb3JlYWNoICgkY291bnRUd29Xb3JkcyBhcyAkd29yZHMyID0+ICRjb3VudDIpIHsKICAgICAgICBmb3JlYWNoICgkY291bnRXb3JkcyBhcyAkd29yZCA9PiAkY291bnQpIHsKICAgICAgICAgICAgaWYgKChtYl9zdHJwb3MoJHdvcmRzMiwgJHdvcmQpICE9PSBmYWxzZSkgJiYgKCRjb3VudDIgPT0gJGNvdW50KSkgewogICAgICAgICAgICAgICAgdW5zZXQoJGNvdW50V29yZHNbJHdvcmRdKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkdG9wWyR3b3JkczJdID0gJGNvdW50MjsKICAgIH0KfQovL9Cd0YMg0Lgg0LXRgdC70Lgg0YfRgtC+INGC0L4g0L7RgdGC0LDQu9C+0YHRjCDQt9Cw0LPQvtC90Y/QtdC8INCyINGC0L7QvwppZiAoIWVtcHR5KCRjb3VudFdvcmRzKSkgewogICAgZm9yZWFjaCAoJGNvdW50V29yZHMgYXMgJHdvcmQgPT4gJGNvdW50KSB7CiAgICAgICAgJHRvcFskd29yZF0gPSAkY291bnQ7CiAgICB9Cn0KCi8v0JLRi9Cy0L7QtNC40Lwg0YDQtdC30YPQu9GM0YLQsNGCINC90LDRiNC10Lkg0LzQsNCz0LjQuAppZiAoIWlzc2V0KCR0b3ApKSB7CiAgICBlY2hvICfQo9Cy0YssINC90L4g0LIg0LTQsNC90L3QvtC8INGC0LXQutGB0YLQtSDQvdC10YIg0YfQsNGB0YLRi9GFINGB0LvQvtCyINC40LvQuCDRgdC70L7QstC+0YHQvtGH0LXRgtCw0L3QuNC5INCy0YHRgtGA0LXRh9Cw0Y7RidC40YXRgdGPINCx0L7Qu9GM0YjQtSDQvtC00L3QvtCz0L4g0YDQsNC30LAgOignOwp9IGVsc2VpZiAoY291bnQoJHRvcCkgPT0gMSkgewogICAgZm9yZWFjaCAoJHRvcCBhcyAkd29yZCA9PiAkY291bnQpIHsKICAgICAgICBlY2hvICfQodCw0LzQvtC1INGH0LDRgdGC0L7QtSDRgdC70L7QstC+L9GB0LvQvtCy0L7RgdC+0YfQtdGC0LDQvdC40LU6ICInIC4gJHdvcmQgLiAnIi4g0J7QvdC+INCy0YHRgtGA0LXRh9Cw0LXRgtGB0Y8gLSAnIC4gJGNvdW50IC4KICAgICAgICAgICAgJyDRgNCw0LcnOwogICAgfQp9IGVsc2UgewogICAgYXJzb3J0KCR0b3ApOwogICAgZWNobyAi0KHQsNC80YvQtSDRh9Cw0YHRgtGL0LUg0YHQu9C+0LLQsC/RgdC70L7QstC+0YHQvtGH0LXRgtCw0L3QuNGPOlxuIjsKICAgIGZvcmVhY2ggKCR0b3AgYXMgJHdvcmRzID0+ICRjb3VudCkgewogICAgICAgIGVjaG8gJHdvcmRzIC4gIiAtINCy0YHRgtGA0LXRh9Cw0LXRgtGB0Y8gIiAuICRjb3VudCAuICIg0YDQsNC3LlxuIjsKICAgIH0KfQo=