Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Тексты > как посчитать количество повторов слов в тексте


Автор: americanets 11.4.2007, 20:11
собрал текст со страницы, убрал HTML теги, как посчитать количество повторов слов в этом тексте а потом все вывести в таблицу
слово | количество повторов

Автор: SelenIT 11.4.2007, 20:35
explode + http://php.net/array_count_values?

Автор: Shur 11.4.2007, 20:39
Попробуйте так:
$content - ваш текст в _строке_.
Код

$words = preg_split('/\s+/s', trim($content));
        $word_statistic = array_count_values($words); // подсчет числа повторений каждого слова
        foreach ($word_statistic as $word => $count) { // пишем в таблицу...



Спасибо большое за код SelenITу.

У меня был похожий вопрос, помогли.

Автор: mishaSL 11.4.2007, 20:40
Вот пример:
Код

<?php
$text = 'много много текста это текст текст';
$word = 'текст';
$arr = array();
print 'слово &laquo;'.$word.'&raquo; встречается: '.preg_match_all('#\b'.preg_quote($word).'\b#is', $text, $arr).' раз(а)';
?>


Также можно воспользоваться функцией http://ru2.php.net/substr_count, но нужно учитывать, что она ищет совтадение подстроки, а не слов.

Автор: americanets 12.4.2007, 11:58
да спасибо разобрался сделал 

Код

preg_match_all('/\w+/s', $content, $words); // разбивка на слова
$word_statistic = array_count_values($words[0]); // подсчет числа повторений каждого слова
print "<table width=\"500\" border=\"1\" cellspacing=\"1\" cellpadding=\"1\">";
foreach ($word_statistic as $word => $count) {
print "  <tr><td>$word</td><td>$count</td></tr>";
//print_r ($word_statistic);

} 
print "</table>";


единственное не знаю как теперь сделать чтоб выше ставились те у которых больше совпадений

Автор: SelenIT 12.4.2007, 12:10
americanets, попробуйте перед выводом массива сделать ему http://www.php.net/manual/en/function.arsort.php.

Автор: americanets 12.4.2007, 17:20
SelenIT, спасибо , то что надо, а как посчитать общее количество слов в тексте , делаю так 

$count=count($words);
print $count; 
результат 1 

Автор: SelenIT 12.4.2007, 17:39
count($words[0]) - массив-то двумерный. Можно при отладке сделать print_r($words) для наглядности...

Автор: americanets 12.4.2007, 20:59
спасибо, заработало, теперь пытаюсь избавиться от мусора который дает заголовок при открытии страницы через fsockopen , а именно 

Код

HTTP/1.1 200 OK
Date: Thu, 12 Apr 2007 18:08:14 GMT
Server: Apache/1.3.33 (Win32) PHP/4.4.4
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html


открыл топик http://forum.vingrad.ru/topic-145789/anchor-entry1096415/0.html , просто вырезать не совсем правильно, данные могут быть различны не поможете как с этим быть ?

Автор: americanets 13.4.2007, 17:16
не работает на сервере, считает только английские слова, 

Автор: mishaSL 13.4.2007, 17:26
americanets, поставьте эту строку в начало скрипта:
Код

setlocale(LC_ALL, "ru_RU.CP1251");

Автор: americanets 13.4.2007, 17:56
спасибо, все заработало, 

уже отыскал где 
Код

preg_match_all('/\w+/s', $content, $words); // разбивка на слова

но по другому пытался сделать 

Автор: mishaSL 13.4.2007, 18:10
Такой вопрос часто возникает. Если пользуетесь регулярными выражениями и в них необходимо работать с русскими символами не забывайте правильно определить локаль, это не будет лишним  smile 

Если вопрос решен, то не забывайте помечать его как решенным smile 

Автор: americanets 16.4.2007, 19:38
спасибо еще раз, все сделал , есть еще аопросы но пока разбираюсь smile 

Автор: CyClon 17.4.2007, 21:23
Использовать регулярные выражения там, где можно обойтись без них - дурной тон. Они вызываю большую нагрузку по сравнению с другими функциями.

Слова можно получить так:

Код
$words = explode(' ', $string);


В итоге задачу можно решить:

Код
$words = explode(' ', $string);
$counts = array_count_values($words);

print_r($counts);

Автор: americanets 29.4.2007, 17:59
setlocale(LC_ALL, "ru_RU.CP1251"); на новом сервере не помогает, как можно еще сменить локаль? 

Автор: SelenIT 29.4.2007, 21:45
americanets, гляньте http://phpclub.ru/talk/showthread.php?threadid=98706, может, один из упомянутых вариантов подойдёт...

Автор: americanets 30.4.2007, 10:15
Код

setlocale(LC_ALL,"ru_RU.CP1251", "ru_RU.cp1251", "ru_RU", "RU","rus_RUS.1251");
работает, правда слова разбило некоторые почему-то, наприер горка теперь 2 слова го ка

Автор: SelenIT 30.4.2007, 10:41
americanets, видимо, опять не совсем та локаль сработала. Попробуйте по очереди каждую из них по отдельности.

Автор: americanets 30.4.2007, 16:51
не стояла локаль, сервер новый, забыли поставить, сейчас все ок 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)