<?php
// Топ N самых часто встречающихся слов и словосочетаний в тексте(из 2-3-х слов)
$stopWords = array('и', 'у', 'к', 'с', 'о', 'от', 'в', 'же', 'из', 'на', 'не', 'вы', 'как', 'но', 'чтобы', 'что');
$input = 'Эта функция сортирует массив в обратном порядке таким образом, что
сохраняются отношения между ключами и значениями. Сохраняются отношения и
сохраняются отношения и еще сохраняются отношения и опять сохраняются отношения.';
// Функция удаляющая слова и словосочетания являющиеся частью больших словосочений
function removeRepetition($moreWords, $words)
{
// Создаем индекс слов из больших словосочетаний
foreach ($bigPhrases as $moreKey => $moreWord) {
foreach ($temp as $key) {
$index[$key][] = $moreKey;
}
}
return $words;
}
//массив с информацие о том сколько раз было найдено большое словосочетание
// Если во втором массиве словосочетания, иначе слова
foreach ($words as $phrase => $frequency) {
$tempWords = explode(' ', $phrase); if (!empty($result) && $frequencies[$result[0]] === $frequency) { }
} else {
if (isset($index[$phrase]) && $frequencies[$index[$phrase][0]] === $frequency) { }
}
}
return $words;
}
// Разбиваем текст на предложения
$sentences = preg_split('/[.!?]/', $input, 0, PREG_SPLIT_NO_EMPTY
);
// Формируем словосочетания
foreach ($sentences as $sentence) {
$sentence = trim($sentence); $words = preg_split('/ /', $sentence, 0, PREG_SPLIT_NO_EMPTY
); for ($i = 0; $i < (count($words) - 1); ++$i) { $oneWords[] = $words[$i];
$twoWords[] = $words[$i] . ' ' . $words[$i + 1];
if ($i !== 0) {
$threeWords[] = $words[$i - 1] . ' ' . $words[$i] . ' ' . $words[$i + 1];
}
}
$oneWords[] = $words[$i];
}
// Считаем, удаляем все что было найдено 1 раз и сортируем
// Удаляем слова и словосочеания являющиеся часть других
$countWords = removeRepetition($countThreeWords, $countWords);
$countWords = removeRepetition($countTwoWords, $countWords);
$countTwoWords = removeRepetition($countThreeWords, $countTwoWords);
$top = array_merge($countWords, $countTwoWords, $countThreeWords);
// Выводим результат нашей магии
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";
}
}
PD9waHAKLy8g0KLQvtC/IE4g0YHQsNC80YvRhSDRh9Cw0YHRgtC+INCy0YHRgtGA0LXRh9Cw0Y7RidC40YXRgdGPINGB0LvQvtCyINC4INGB0LvQvtCy0L7RgdC+0YfQtdGC0LDQvdC40Lkg0LIg0YLQtdC60YHRgtC1KNC40LcgMi0zLdGFINGB0LvQvtCyKQptYl9pbnRlcm5hbF9lbmNvZGluZygnVXRmLTgnKTsKCiRzdG9wV29yZHMgPSBhcnJheSgn0LgnLCAn0YMnLCAn0LonLCAn0YEnLCAn0L4nLCAn0L7RgicsICfQsicsICfQttC1JywgJ9C40LcnLCAn0L3QsCcsICfQvdC1JywgJ9Cy0YsnLCAn0LrQsNC6JywKICAgICfQvdC+JywgJ9GH0YLQvtCx0YsnLCAn0YfRgtC+Jyk7CiRpbnB1dCA9ICfQrdGC0LAg0YTRg9C90LrRhtC40Y8g0YHQvtGA0YLQuNGA0YPQtdGCINC80LDRgdGB0LjQsiDQsiDQvtCx0YDQsNGC0L3QvtC8INC/0L7RgNGP0LTQutC1INGC0LDQutC40Lwg0L7QsdGA0LDQt9C+0LwsINGH0YLQvgrRgdC+0YXRgNCw0L3Rj9GO0YLRgdGPINC+0YLQvdC+0YjQtdC90LjRjyDQvNC10LbQtNGDINC60LvRjtGH0LDQvNC4INC4INC30L3QsNGH0LXQvdC40Y/QvNC4LiDQodC+0YXRgNCw0L3Rj9GO0YLRgdGPINC+0YLQvdC+0YjQtdC90LjRjyDQuArRgdC+0YXRgNCw0L3Rj9GO0YLRgdGPINC+0YLQvdC+0YjQtdC90LjRjyDQuCDQtdGJ0LUg0YHQvtGF0YDQsNC90Y/RjtGC0YHRjyDQvtGC0L3QvtGI0LXQvdC40Y8g0Lgg0L7Qv9GP0YLRjCDRgdC+0YXRgNCw0L3Rj9GO0YLRgdGPINC+0YLQvdC+0YjQtdC90LjRjy4nOwoKLy8g0KTRg9C90LrRhtC40Y8g0YPQtNCw0LvRj9GO0YnQsNGPINGB0LvQvtCy0LAg0Lgg0YHQu9C+0LLQvtGB0L7Rh9C10YLQsNC90LjRjyDRj9Cy0LvRj9GO0YnQuNC10YHRjyDRh9Cw0YHRgtGM0Y4g0LHQvtC70YzRiNC40YUg0YHQu9C+0LLQvtGB0L7Rh9C10L3QuNC5CmZ1bmN0aW9uIHJlbW92ZVJlcGV0aXRpb24oJG1vcmVXb3JkcywgJHdvcmRzKQp7CiAgICAvLyDQodC+0LfQtNCw0LXQvCDQuNC90LTQtdC60YEg0YHQu9C+0LIg0LjQtyDQsdC+0LvRjNGI0LjRhSDRgdC70L7QstC+0YHQvtGH0LXRgtCw0L3QuNC5CiAgICAkYmlnUGhyYXNlcyA9IGFycmF5X2tleXMoJG1vcmVXb3Jkcyk7CiAgICBmb3JlYWNoICgkYmlnUGhyYXNlcyBhcyAkbW9yZUtleSA9PiAkbW9yZVdvcmQpIHsKICAgICAgICAkdGVtcCA9IGV4cGxvZGUoJyAnLCAkbW9yZVdvcmQpOwogICAgICAgIGZvcmVhY2ggKCR0ZW1wIGFzICRrZXkpIHsKICAgICAgICAgICAgJGluZGV4WyRrZXldW10gPSAkbW9yZUtleTsKICAgICAgICB9CiAgICB9CiAgICBpZiAoIWlzc2V0KCRpbmRleCkpIHsKICAgICAgICByZXR1cm4gJHdvcmRzOwogICAgfQoKICAgIC8v0LzQsNGB0YHQuNCyINGBINC40L3RhNC+0YDQvNCw0YbQuNC1INC+INGC0L7QvCDRgdC60L7Qu9GM0LrQviDRgNCw0Lcg0LHRi9C70L4g0L3QsNC50LTQtdC90L4g0LHQvtC70YzRiNC+0LUg0YHQu9C+0LLQvtGB0L7Rh9C10YLQsNC90LjQtQogICAgJGZyZXF1ZW5jaWVzID0gYXJyYXlfdmFsdWVzKCRtb3JlV29yZHMpOwogICAgLy8g0JXRgdC70Lgg0LLQviDQstGC0L7RgNC+0Lwg0LzQsNGB0YHQuNCy0LUg0YHQu9C+0LLQvtGB0L7Rh9C10YLQsNC90LjRjywg0LjQvdCw0YfQtSDRgdC70L7QstCwCiAgICBmb3JlYWNoICgkd29yZHMgYXMgJHBocmFzZSA9PiAkZnJlcXVlbmN5KSB7CiAgICAgICAgaWYgKG1iX3N0cnBvcygkcGhyYXNlLCAnICcpICE9IGZhbHNlKSB7CiAgICAgICAgICAgICR0ZW1wV29yZHMgPSBleHBsb2RlKCcgJywgJHBocmFzZSk7CiAgICAgICAgICAgICRyZXN1bHQgPSBhcnJheV9pbnRlcnNlY3QoJGluZGV4WyR0ZW1wV29yZHNbMF1dLCAkaW5kZXhbJHRlbXBXb3Jkc1sxXV0pOwogICAgICAgICAgICBpZiAoIWVtcHR5KCRyZXN1bHQpICYmICRmcmVxdWVuY2llc1skcmVzdWx0WzBdXSA9PT0gJGZyZXF1ZW5jeSkgewogICAgICAgICAgICAgICAgdW5zZXQoJHdvcmRzWyRwaHJhc2VdKTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmIChpc3NldCgkaW5kZXhbJHBocmFzZV0pICYmICRmcmVxdWVuY2llc1skaW5kZXhbJHBocmFzZV1bMF1dID09PSAkZnJlcXVlbmN5KSB7CiAgICAgICAgICAgICAgICB1bnNldCgkd29yZHNbJHBocmFzZV0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuICR3b3JkczsKfQoKLy8g0KDQsNC30LHQuNCy0LDQtdC8INGC0LXQutGB0YIg0L3QsCDQv9GA0LXQtNC70L7QttC10L3QuNGPCiRpbnB1dCA9IG1iX3N0cnRvbG93ZXIoJGlucHV0KTsKJGlucHV0ID0gcHJlZ19yZXBsYWNlKCcvXHMrL3UnLCAnICcsICRpbnB1dCk7CiRpbnB1dCA9IHByZWdfcmVwbGFjZSgnL1teXHcuIT9cc10vdScsICcnLCAkaW5wdXQpOwokaW5wdXQgPSB0cmltKCRpbnB1dCk7CiRzZW50ZW5jZXMgPSBwcmVnX3NwbGl0KCcvWy4hP10vJywgJGlucHV0LCAwLCBQUkVHX1NQTElUX05PX0VNUFRZKTsKCi8vINCk0L7RgNC80LjRgNGD0LXQvCDRgdC70L7QstC+0YHQvtGH0LXRgtCw0L3QuNGPCmZvcmVhY2ggKCRzZW50ZW5jZXMgYXMgJHNlbnRlbmNlKSB7CiAgICAkc2VudGVuY2UgPSB0cmltKCRzZW50ZW5jZSk7CiAgICAkd29yZHMgPSBwcmVnX3NwbGl0KCcvIC8nLCAkc2VudGVuY2UsIDAsIFBSRUdfU1BMSVRfTk9fRU1QVFkpOwogICAgJHdvcmRzID0gYXJyYXlfdmFsdWVzKGFycmF5X2RpZmYoJHdvcmRzLCAkc3RvcFdvcmRzKSk7CiAgICBmb3IgKCRpID0gMDsgJGkgPCAoY291bnQoJHdvcmRzKSAtIDEpOyArKyRpKSB7CiAgICAgICAgJG9uZVdvcmRzW10gPSAkd29yZHNbJGldOwogICAgICAgICR0d29Xb3Jkc1tdID0gJHdvcmRzWyRpXSAuICcgJyAuICR3b3Jkc1skaSArIDFdOwogICAgICAgIGlmICgkaSAhPT0gMCkgewogICAgICAgICAgICAkdGhyZWVXb3Jkc1tdID0gJHdvcmRzWyRpIC0gMV0gLiAnICcgLiAkd29yZHNbJGldIC4gJyAnIC4gJHdvcmRzWyRpICsgMV07CiAgICAgICAgfQogICAgfQogICAgJG9uZVdvcmRzW10gPSAkd29yZHNbJGldOwp9CgovLyDQodGH0LjRgtCw0LXQvCwg0YPQtNCw0LvRj9C10Lwg0LLRgdC1INGH0YLQviDQsdGL0LvQviDQvdCw0LnQtNC10L3QviAxINGA0LDQtyDQuCDRgdC+0YDRgtC40YDRg9C10LwKJGNvdW50V29yZHMgPSBhcnJheV9kaWZmKGFycmF5X2NvdW50X3ZhbHVlcygkb25lV29yZHMpLCBhcnJheSgxKSk7CiRjb3VudFR3b1dvcmRzID0gYXJyYXlfZGlmZihhcnJheV9jb3VudF92YWx1ZXMoJHR3b1dvcmRzKSwgYXJyYXkoMSkpOwokY291bnRUaHJlZVdvcmRzID0gYXJyYXlfZGlmZihhcnJheV9jb3VudF92YWx1ZXMoJHRocmVlV29yZHMpLCBhcnJheSgxKSk7CgovLyDQo9C00LDQu9GP0LXQvCDRgdC70L7QstCwINC4INGB0LvQvtCy0L7RgdC+0YfQtdCw0L3QuNGPINGP0LLQu9GP0Y7RidC40LXRgdGPINGH0LDRgdGC0Ywg0LTRgNGD0LPQuNGFCiRjb3VudFdvcmRzID0gcmVtb3ZlUmVwZXRpdGlvbigkY291bnRUaHJlZVdvcmRzLCAkY291bnRXb3Jkcyk7CiRjb3VudFdvcmRzID0gcmVtb3ZlUmVwZXRpdGlvbigkY291bnRUd29Xb3JkcywgJGNvdW50V29yZHMpOwokY291bnRUd29Xb3JkcyA9IHJlbW92ZVJlcGV0aXRpb24oJGNvdW50VGhyZWVXb3JkcywgJGNvdW50VHdvV29yZHMpOwoKJHRvcCA9IGFycmF5X21lcmdlKCRjb3VudFdvcmRzLCAkY291bnRUd29Xb3JkcywgJGNvdW50VGhyZWVXb3Jkcyk7CgovLyDQktGL0LLQvtC00LjQvCDRgNC10LfRg9C70YzRgtCw0YIg0L3QsNGI0LXQuSDQvNCw0LPQuNC4CmlmICghY291bnQoJHRvcCkpIHsKICAgIGVjaG8gJ9Cj0LLRiywg0L3QviDQsiDQtNCw0L3QvdC+0Lwg0YLQtdC60YHRgtC1INC90LXRgiDRh9Cw0YHRgtGL0YUg0YHQu9C+0LIg0LjQu9C4INGB0LvQvtCy0L7RgdC+0YfQtdGC0LDQvdC40Lkg0LLRgdGC0YDQtdGH0LDRjtGJ0LjRhdGB0Y8g0LHQvtC70YzRiNC1INC+0LTQvdC+0LPQviDRgNCw0LfQsCA6KCc7Cn0gZWxzZWlmIChjb3VudCgkdG9wKSA9PSAxKSB7CiAgICBmb3JlYWNoICgkdG9wIGFzICR3b3JkcyA9PiAkY291bnQpIHsKICAgICAgICBlY2hvICfQodCw0LzQvtC1INGH0LDRgdGC0L7QtSDRgdC70L7QstC+L9GB0LvQvtCy0L7RgdC+0YfQtdGC0LDQvdC40LU6ICInIC4gJHdvcmRzIC4gJyIsINC+0L3QviDQstGB0YLRgNC10YfQsNC10YLRgdGPIC0gJyAuICRjb3VudCAuCiAgICAgICAgICAgICcg0YDQsNC3Lic7CiAgICB9Cn0gZWxzZSB7CiAgICBhcnNvcnQoJHRvcCk7CiAgICBlY2hvICLQodCw0LzRi9C1INGH0LDRgdGC0YvQtSDRgdC70L7QstCwL9GB0LvQvtCy0L7RgdC+0YfQtdGC0LDQvdC40Y86XG4iOwogICAgZm9yZWFjaCAoJHRvcCBhcyAkd29yZHMgPT4gJGNvdW50KSB7CiAgICAgICAgZWNobyAkd29yZHMgLiAiIC0g0LLRgdGC0YDQtdGH0LDQtdGC0YHRjyAiIC4gJGNvdW50IC4gIiDRgNCw0LcuXG4iOwogICAgfQp9