<?php
// Топ N самых часто встречающихся слов и словосочетаний в тексте(из 2-3-х слов)
$stopWords = array('и', 'у', 'к', 'с', 'о', 'от', 'в', 'же', 'из', 'на', 'не', 'вы', 'как', 'но', 'чтобы', 'что');
$input = 'Эта функция сортирует массив в обратном порядке таким образом, что
сохраняются отношения между ключами и значениями. Сохраняются отношения и
сохраняются отношения и еще сохраняются отношения и опять сохраняются отношения.';
// Функция удаляющая слова и словосочетания являющиеся частью больших словосочений
function removeRepetition($moreWords, $words)
{
// Создаем индекс слов из больших словосочетаний
foreach ($bigPhrases as $moreKey => $moreWord) {
foreach ($temp as $value) {
$index[$value][] = $moreKey;
}
}
return $words;
}
// Если во втором массиве словосочетания, иначе слова
foreach ($words as $key => $value) {
$word1Keys = $index[$tempWords[0]];
$word2Keys = $index[$tempWords[1]];
}
} else {
if (isset($index[$key])) { }
}
}
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 раз и сортируем
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);
// Выводим результат нашей магии
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+0YHQvtGH0LXRgtCw0L3QuNC5CiAgICAkYmlnUGhyYXNlcyA9IGFycmF5X2tleXMoJG1vcmVXb3Jkcyk7CiAgICBmb3JlYWNoICgkYmlnUGhyYXNlcyBhcyAkbW9yZUtleSA9PiAkbW9yZVdvcmQpIHsKICAgICAgICAkdGVtcCA9IGV4cGxvZGUoJyAnLCAkbW9yZVdvcmQpOwogICAgICAgIGZvcmVhY2ggKCR0ZW1wIGFzICR2YWx1ZSkgewogICAgICAgICAgICAkaW5kZXhbJHZhbHVlXVtdID0gJG1vcmVLZXk7CiAgICAgICAgfQogICAgfQogICAgaWYgKCFpc3NldCgkaW5kZXgpKSB7CiAgICAgICAgcmV0dXJuICR3b3JkczsKICAgIH0KICAgIC8vINCV0YHQu9C4INCy0L4g0LLRgtC+0YDQvtC8INC80LDRgdGB0LjQstC1INGB0LvQvtCy0L7RgdC+0YfQtdGC0LDQvdC40Y8sINC40L3QsNGH0LUg0YHQu9C+0LLQsAogICAgZm9yZWFjaCAoJHdvcmRzIGFzICRrZXkgPT4gJHZhbHVlKSB7CiAgICAgICAgaWYgKHByZWdfbWF0Y2goJy9cdysgXHcrL3UnLCAka2V5KSkgewogICAgICAgICAgICAkdGVtcFdvcmRzID0gZXhwbG9kZSgnICcsICRrZXkpOwogICAgICAgICAgICAkd29yZDFLZXlzID0gJGluZGV4WyR0ZW1wV29yZHNbMF1dOwogICAgICAgICAgICAkd29yZDJLZXlzID0gJGluZGV4WyR0ZW1wV29yZHNbMV1dOwogICAgICAgICAgICAkcmVzdWx0ID0gYXJyYXlfaW50ZXJzZWN0KCR3b3JkMUtleXMsICR3b3JkMktleXMpOwogICAgICAgICAgICBpZiAoICFlbXB0eSgkcmVzdWx0KSApIHsKICAgICAgICAgICAgICAgIHVuc2V0KCR3b3Jkc1ska2V5XSk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAoaXNzZXQoJGluZGV4WyRrZXldKSkgewogICAgICAgICAgICAgICAgdW5zZXQoJHdvcmRzWyRrZXldKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAkd29yZHM7Cn0KCi8vINCg0LDQt9Cx0LjQstCw0LXQvCDRgtC10LrRgdGCINC90LAg0L/RgNC10LTQu9C+0LbQtdC90LjRjwokaW5wdXQgPSBtYl9zdHJ0b2xvd2VyKCRpbnB1dCk7CiRpbnB1dCA9IHByZWdfcmVwbGFjZSgnL1xzKy91JywgJyAnLCAkaW5wdXQpOwokaW5wdXQgPSBwcmVnX3JlcGxhY2UoJy9bXlx3LiE/XHNdL3UnLCAnJywgJGlucHV0KTsKJGlucHV0ID0gdHJpbSgkaW5wdXQpOwokc2VudGVuY2VzID0gcHJlZ19zcGxpdCgnL1suIT9dLycsICRpbnB1dCwgMCwgUFJFR19TUExJVF9OT19FTVBUWSk7CgovLyDQpNC+0YDQvNC40YDRg9C10Lwg0YHQu9C+0LLQvtGB0L7Rh9C10YLQsNC90LjRjwpmb3JlYWNoICgkc2VudGVuY2VzIGFzICRzZW50ZW5jZSkgewogICAgJHNlbnRlbmNlID0gdHJpbSgkc2VudGVuY2UpOwogICAgJHdvcmRzID0gcHJlZ19zcGxpdCgnLyAvJywgJHNlbnRlbmNlLCAwLCBQUkVHX1NQTElUX05PX0VNUFRZKTsKICAgICR3b3JkcyA9IGFycmF5X3ZhbHVlcyhhcnJheV9kaWZmKCR3b3JkcywgJHN0b3BXb3JkcykpOwogICAgZm9yICgkaSA9IDA7ICRpIDwgKGNvdW50KCR3b3JkcykgLSAxKTsgKyskaSkgewogICAgICAgICRvbmVXb3Jkc1tdID0gJHdvcmRzWyRpXTsKICAgICAgICAkdHdvV29yZHNbXSA9ICR3b3Jkc1skaV0gLiAnICcgLiAkd29yZHNbJGkgKyAxXTsKICAgICAgICBpZiAoJGkgIT09IDApIHsKICAgICAgICAgICAgJHRocmVlV29yZHNbXSA9ICR3b3Jkc1skaSAtIDFdIC4gJyAnIC4gJHdvcmRzWyRpXSAuICcgJyAuICR3b3Jkc1skaSArIDFdOwogICAgICAgIH0KICAgIH0KICAgICRvbmVXb3Jkc1tdID0gJHdvcmRzWyRpXTsKfQoKLy8g0KHRh9C40YLQsNC10LwsINGD0LTQsNC70Y/QtdC8INCy0YHQtSDRh9GC0L4g0LHRi9C70L4g0L3QsNC50LTQtdC90L4gMSDRgNCw0Lcg0Lgg0YHQvtGA0YLQuNGA0YPQtdC8CiRjb3VudFdvcmRzID0gYXJyYXlfZGlmZihhcnJheV9jb3VudF92YWx1ZXMoJG9uZVdvcmRzKSwgYXJyYXkoMSkpOwokY291bnRUd29Xb3JkcyA9IGFycmF5X2RpZmYoYXJyYXlfY291bnRfdmFsdWVzKCR0d29Xb3JkcyksIGFycmF5KDEpKTsKJGNvdW50VGhyZWVXb3JkcyA9IGFycmF5X2RpZmYoYXJyYXlfY291bnRfdmFsdWVzKCR0aHJlZVdvcmRzKSwgYXJyYXkoMSkpOwphcnNvcnQoJGNvdW50V29yZHMsIFNPUlRfTlVNRVJJQyk7CmFyc29ydCgkY291bnRUd29Xb3JkcywgU09SVF9OVU1FUklDKTsKYXJzb3J0KCRjb3VudFRocmVlV29yZHMsIFNPUlRfTlVNRVJJQyk7CgovLyDQo9C00LDQu9GP0LXQvCDRgdC70L7QstCwINC4INGB0LvQvtCy0L7RgdC+0YfQtdCw0L3QuNGPINGP0LLQu9GP0Y7RidC40LXRgdGPINGH0LDRgdGC0Ywg0LTRgNGD0LPQuNGFCiRjb3VudFdvcmRzID0gcmVtb3ZlUmVwZXRpdGlvbigkY291bnRUaHJlZVdvcmRzLCAkY291bnRXb3Jkcyk7CiRjb3VudFdvcmRzID0gcmVtb3ZlUmVwZXRpdGlvbigkY291bnRUd29Xb3JkcywgJGNvdW50V29yZHMpOwokY291bnRUd29Xb3JkcyA9IHJlbW92ZVJlcGV0aXRpb24oJGNvdW50VGhyZWVXb3JkcywgJGNvdW50VHdvV29yZHMpOwoKJHRvcCA9IGFycmF5X21lcmdlKCRjb3VudFdvcmRzLCAkY291bnRUd29Xb3JkcywgJGNvdW50VGhyZWVXb3Jkcyk7CgovLyDQktGL0LLQvtC00LjQvCDRgNC10LfRg9C70YzRgtCw0YIg0L3QsNGI0LXQuSDQvNCw0LPQuNC4CmlmICghY291bnQoJHRvcCkpIHsKICAgIGVjaG8gJ9Cj0LLRiywg0L3QviDQsiDQtNCw0L3QvdC+0Lwg0YLQtdC60YHRgtC1INC90LXRgiDRh9Cw0YHRgtGL0YUg0YHQu9C+0LIg0LjQu9C4INGB0LvQvtCy0L7RgdC+0YfQtdGC0LDQvdC40Lkg0LLRgdGC0YDQtdGH0LDRjtGJ0LjRhdGB0Y8g0LHQvtC70YzRiNC1INC+0LTQvdC+0LPQviDRgNCw0LfQsCA6KCc7Cn0gZWxzZWlmIChjb3VudCgkdG9wKSA9PSAxKSB7CiAgICBmb3JlYWNoICgkdG9wIGFzICR3b3JkcyA9PiAkY291bnQpIHsKICAgICAgICBlY2hvICfQodCw0LzQvtC1INGH0LDRgdGC0L7QtSDRgdC70L7QstC+L9GB0LvQvtCy0L7RgdC+0YfQtdGC0LDQvdC40LU6ICInIC4gJHdvcmRzIC4gJyIsINC+0L3QviDQstGB0YLRgNC10YfQsNC10YLRgdGPIC0gJyAuICRjb3VudCAuCiAgICAgICAgICAgICcg0YDQsNC3Lic7CiAgICB9Cn0gZWxzZSB7CiAgICBhcnNvcnQoJHRvcCk7CiAgICBlY2hvICLQodCw0LzRi9C1INGH0LDRgdGC0YvQtSDRgdC70L7QstCwL9GB0LvQvtCy0L7RgdC+0YfQtdGC0LDQvdC40Y86XG4iOwogICAgZm9yZWFjaCAoJHRvcCBhcyAkd29yZHMgPT4gJGNvdW50KSB7CiAgICAgICAgZWNobyAkd29yZHMgLiAiIC0g0LLRgdGC0YDQtdGH0LDQtdGC0YHRjyAiIC4gJGNvdW50IC4gIiDRgNCw0LcuXG4iOwogICAgfQp9