Как на PHP посчитать слова и выбрать самые часто встречающиеся?

Z0
На сайте с 06.06.2007
Offline
17
4279

Как на PHP посчитать слова в тексте и выбрать самые часто встречающиеся?

Надо сделать подсчет как на этом сайте:

http://site-emulator.info/oddities/news_2007-05-31-22-52-32-434.html

По какому алгоритму идти... Весь инет прошерстил...

Подскажите пожалуйста...

TomCAt.nl
На сайте с 16.04.2007
Offline
12
#1

Вообще ты не по адресу пришел, но раз пришел:)

<?php
// Извлекаем содержимое из файла site.ru/index.htm
$content = file_get_contents("www.site.ru");

// Массив регулярных выражений
$search = array ("'<script[^>]*?>.*?</script>'si",
"'<[\/\!]*?[^<>]*?>'si",
"'([\r\n])[\s]+'",
"'&(quot|#34);'i",
"'&(amp|#38);'i",
"'&(lt|#60);'i",
"'&(gt|#62);'i",
"'&(nbsp|#160);'i",
"'&(iexcl|#161);'i",
"'&(cent|#162);'i",
"'&(pound|#163);'i",
"'&(copy|#169);'i",
"'&#(\d+);'e");
// Массив замены
$replace = array ("",
"",
"\\1",
"\"",
"&",
"<",
">",
" ",
chr(161),
chr(162),
chr(163),
chr(169),
"chr(\\1)");

// Осуществляем удаление тэгов и вывод текста в окно браузера
$content = preg_replace($search, $replace, $content);

//Разбиваем текст на слова не менее 3 букв длинной и заносим в массив $out
preg_match_all("|\b[\w]{3,}\b|s", $content, $out, PREG_PATTERN_ORDER);


//Ищем самое часто встречаемое слово и заносим в массив $result
$count=count($out[0]);

$counter=0;
for($i=0; $i<$count; $i++)
{
for($j=1; $j<$count; $j++)
{
if(strtolower($out[0][$i])==strtolower($out[0][$j]))
{
$counter++;
$result[$i]=$counter;
}
}

//ищем максимум в массиве $result
$counter=0;
}

$max_num=0;
for ($i=0; $i<count($result); $i++)
{
if($result[$i]>$max_num)
{
$max_num=$result[$i];
$index=$i;
}
}

//выводим результат
echo "Слово <b>".$out[0][$index]."</b> самое часто встречаемое - <b>".$result[$index]."</b> раз";

?>

Код малость сыроват, сварганил за час:) но рабочий, у меня по крайне мере

А вообще по вопросам PHP иди сюда

Надеюсь поможет

Y
На сайте с 02.01.2006
Offline
138
#2
TomCAt.nl:
А вообще по вопросам PHP иди сюда
Надеюсь поможет

не поможет! мужчина, не давайте людям вредных советов!!!

http://phpclub.ru/talk/ — наверное, пока что единственный форум, где дают нормальные советы реальные профессиональные программисты.

Updated:

про код молчу, работать будет, но написан полубред.

Z0
На сайте с 06.06.2007
Offline
17
#3

Ребята, спасибо огромное. Прохлады вам в жарком лете и тепла в морозы...

Y
На сайте с 02.01.2006
Offline
138
#4
на phpclub давно уже нет нормальных советов, там тусуется несколько нормальных программистов и показывает всем новичкам какие они там все крутые. форум как форум где можно получить совет умер давно.

получил это анонимное блеяние в коментариях.

Рассказываю по пунктам!

- на любом большом форуме новички ноют, что их унижают, но если тычут носом те, кто уже видал виды, значит, не просто так тычет;

- про любой большой форум можно сказать, что на нем осталось 2-3 дедушки, которые чего-то там о себе возомнили и не дают никому дышать, это можно сказать про СЕ, про ИКСБТ, пхпклуб и др. большие форумы.

в то же время на этом форуме и на пхпклубе толчется толпа ньюбов и чего-то пытается читать между строк у зубров, которые их унижают и гнобят. Мазохисты что ли? Спрашивается: какого черта вы там толчетесь? Форум же хреновый!!! идите на другой форум, например, на софттайм! вам там помогут... написать совершенно идиотский код.

TomCAt.nl, если он один раз в коде сделал так:

$count=count($out[0]);

#а потом использует перменную $count
$counter=0;
for($i=0; $i<$count; $i++)

то в следующий раз в коде надо сделать было точно так же, а не так:

$max_num=0;
for ($i=0; $i<count($result); $i++)
{

потому что на каждой итерации цикла вызывается функция и придется только уповать на то, что интерпретатор каким-то чудесным образом вместо того, чтобы вызывать функцию, где-то закеширует то, что она возвращает. И с массивами надо разобраться, подумать, можно ли обойтись без второго вложенного цикла либо без циклов вообще, навскидку, думаю, что можно.

СКОРПИОН
На сайте с 05.01.2006
Offline
120
#5
TomCAt.nl:
Код малость сыроват, сварганил за час:)

TomCAt.nl - курить мануалы. До посинения...

Такой код пишется вместе с отладкой минут за 5-7 несколькими функциями:

Эта удаляет теги - strip_tags:

http://phpclub.ru/manrus/f/strip-tags.html

Эта разрезает - explode:

http://phpclub.ru/manrus/f/explode.html

Эта считает - array_count_values:

http://phpclub.ru/manrus/f/array-count-values.html

Перед разрезанием все спецсимволы заменить на пробелы, затем все включения, где больше одного пробела или стоит перевод каретки заменить на один пробел. Потом по пробелу разделить на слова.

• Контекстные ссылки с внутренних страниц навсегда (/ru/forum/370882) • Качественные сайты для заработка на контекстной рекламе и ссылках
Y
На сайте с 02.01.2006
Offline
138
#6

А СКОРПИОН не удержался и все же без намеков привел ссылки на ман :)

TomCAt.nl
На сайте с 16.04.2007
Offline
12
#7
Yukko:
про код молчу, работать будет, но написан полубред.

Согласен всецело, код мне еще вчера не сильно понравился:), но очень уж хотелось помочь человеку.

За здоровую критику, спасибо, не обижаюсь, сам все знаю:)

Вот попытался исправить, благодаря советам Скорпиона, пишем после регулярки:


//Ищем самое часто встречаемое слово и заносим в массив $result

$result=array_count_values($out[0]);

//ищем максимум в массиве $result
$max_num=0;
$word="";
foreach($result as $key=>$value)
{
if($value>$max_num)
{
$max_num=$value;
$word=$key;
}
}
echo "Слово <b>".$word."</b> встретилос чаще всех <b>".$max_num."</b> раз";

Вопрос к Скорпиону: чем плоха регулярка? Она конечно, нагружает сервак, но зато можно более просто проконтролировать длину слова, а то он будет считать любой предлог словом

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий