Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Подсчет слов в тексте

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
massqwest
Отправлено: 09 Августа, 2011 - 22:58:55
Post Id



Новичок


Покинул форум
Сообщений всего: 3
Дата рег-ции: Авг. 2011  


Помог: 0 раз(а)




Есть какой либо текст нужно найти 5 наиболее часто встречающихся слов в тексте.
На ум только приходит забивать его в массив и потом уже каждое слово искать в тексте.Но мне кажется это будет довольно ресурсоемко.
вот пример как нужно сделать http://tekto.biz/sick/ns.php.
Готовое решение не нужно (хотя если есть не откажусь), хотя бы укажите в какую сторону копать.
 
 Top
White
Отправлено: 09 Августа, 2011 - 23:35:02
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 830
Дата рег-ции: Июнь 2011  
Откуда: Днепропетровск


Помог: 28 раз(а)




PHP:
скопировать код в буфер обмена
  1. function form_tags($text) {
  2.   $text=trim(str_replace("\n", "", $text));
  3.   $word=explode(' ', $text);
  4.   $tags = array_count_values($word);
  5.   arsort($tags);
  6.   $i=0;
  7.   foreach($tags as $index=>$value) {
  8.           if(strlen($index)>1) {
  9.                   echo $index."<br />";
  10.                   ++$i;
  11.       }
  12.       if($i==5) break;
  13.   }
  14.  
  15. }


-----
if(time()>1356048000) die();
 
 Top
DeepVarvar Супермодератор
Отправлено: 10 Августа, 2011 - 03:12:27
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




 
 Top
massqwest
Отправлено: 10 Августа, 2011 - 07:55:30
Post Id



Новичок


Покинул форум
Сообщений всего: 3
Дата рег-ции: Авг. 2011  


Помог: 0 раз(а)




White пишет:
PHP:
скопировать код в буфер обмена
  1. function form_tags($text) {
  2.   $text=trim(str_replace("\n", "", $text));
  3.   $word=explode(' ', $text);
  4.   $tags = array_count_values($word);
  5.   arsort($tags);
  6.   $i=0;
  7.   foreach($tags as $index=>$value) {
  8.           if(strlen($index)>1) {
  9.                   echo $index."<br />";
  10.                   ++$i;
  11.       }
  12.       if($i==5) break;
  13.   }
  14.  
  15. }

Спасибо именно то что и требовалось!

DeepVarvar Вы немного не поняли суть вопроса, тем более substr-count это выполнить не получилось бы ведь он посчитал бы и кирпич и кирпичный хотя два разных слова.

(Отредактировано автором: 10 Августа, 2011 - 07:56:22)

 
 Top
White
Отправлено: 10 Августа, 2011 - 08:15:32
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 830
Дата рег-ции: Июнь 2011  
Откуда: Днепропетровск


Помог: 28 раз(а)




massqwest только это не готовая функция. советую сначала заменить все спецсимволы на пробелы оставив только буквы, цифры и знак "-", и если это не критично привести к единому регистру.
massqwest пишет:
кирпич и кирпичный
если необходимо строить облако тегов, я бы предпочел, чтобы они воспринимались как одно слово.


-----
if(time()>1356048000) die();
 
 Top
Petro
Отправлено: 10 Августа, 2011 - 10:53:13
Post Id



Гость


Покинул форум
Сообщений всего: 126
Дата рег-ции: Март 2010  


Помог: 2 раз(а)




Возник вопрос почему количество букв не соответствует количеству букв в слове?
CODE (htmlphp):
скопировать код в буфер обмена
  1. <?php
  2. setlocale (LC_ALL, 'UTF8');
  3. $text="Поезія Поезія Поезія Поезія Поезія Поезія А. Малишка в уяві кожного українця асоціюється з піснею, адже він писав пісні — жанр, який мав чимало прихильників, особливо якщо це ліричні пісні. Мудрі, ніжні, мелодійні вірші зворушують серце й уяву.
  4. Таємницю зачарованих мелодій-віршів А. Малишка Олесь Гончар пояснював так: Народнопісенна основа в його творчості не стилізація, то його власне поетичне мислення, органічна поетова образність, що зливається з художнім розливом образності народної.
  5. Ця народнопісенна основа зумовила особливе ставлення поета до природи. Природа не стільки фон почуттів ліричного героя, скільки могутня стихія, гармонійною частиною якої є людина. Природа одному мати, другому — мачуха, — стверджує народна мудрість. Для А. Малишка природа була, безперечно, рідною матір'ю матір'ю матір'ю матір'ю матір'ю матір'ю. У гармонійній красі природи він знаходив невичерпне джерело натхнення: і тоді з'являлися на білий світ слова, що найповніше, найточніше відображали найтонші нюанси почуттів.
  6. ";
  7. $text=trim(str_replace(array('.', '—', ',', ':'), "", $text));
  8. $text=trim(str_replace(array('  ', '   '), " ", $text));
  9.  $word=explode(' ', $text);
  10.  $tags = array_count_values($word);
  11.  arsort($tags);
  12.  $i=0;
  13.  foreach($tags as $index=>$value) {
  14. echo 'index=', $index, '--количество букв-->', strlen(trim($index)), "<br> value=",$value.'<br>';
  15.          if(strlen($index)>1) {
  16.                  ++$i;
  17.      }
  18.      if($i==5) break;
  19.  }

?>
Вот что выводит
index=Поезія--количество букв-->12
value=6
index=матір'ю--[color=red]количество букв-->13
value=6
index=Малишка--количество букв-->14
value=3
index=А--количество букв-->2
value=3
index=пісні--количество букв-->10
value=2


-----
Нет ничего более постоянного, чем временное.
 
 Top
White
Отправлено: 10 Августа, 2011 - 11:02:45
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 830
Дата рег-ции: Июнь 2011  
Откуда: Днепропетровск


Помог: 28 раз(а)




Petro строковые функции как правило работают с ANSI а не мультиязычными кодировками, а в ANSI одному символу соответствует один байт, вот strlen и считает байты.


-----
if(time()>1356048000) die();
 
 Top
DeepVarvar Супермодератор
Отправлено: 10 Августа, 2011 - 11:20:15
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




White пишет:
вот strlen и считает байты

Латиница, цифры и знаки препинания "влезают" в кол-во комбинаций однобайтной строки.
Для остальных языковых символов не хватает места, поэтому каждый символ состоит из двух байт: первый означает принадлежность к языку, второй собственно код символа.

Многие наверное знают что если смс на телефоне писать транслитом - влезает в 2 раза больше букв в один смс-сегмент.
Корни растут оттуда же Закатив глазки
 
 Top
illy
Отправлено: 10 Августа, 2011 - 11:22:27
Post Id



Участник


Покинул форум
Сообщений всего: 1117
Дата рег-ции: Июль 2011  
Откуда: от верблюда)


Помог: 28 раз(а)




DeepVarvar пишет:
если смс на телефоне писать транслитом - влезает в 2 раза больше букв

угу, угу даже по телевизору недавно говорили про количество букв в русском смс Ха-ха


-----
Всё гениальное - просто
И ещё проще, если ты - индиго
 
 Top
Petro
Отправлено: 10 Августа, 2011 - 11:52:14
Post Id



Гость


Покинул форум
Сообщений всего: 126
Дата рег-ции: Март 2010  


Помог: 2 раз(а)




Точно, давно я не писал транслитом Ха-ха
Значит делить на 2 и округлять в меньшую сторону.
floor(strlen($index)/2)
Cпасибо огромное!


-----
Нет ничего более постоянного, чем временное.
 
 Top
massqwest
Отправлено: 10 Августа, 2011 - 12:37:42
Post Id



Новичок


Покинул форум
Сообщений всего: 3
Дата рег-ции: Авг. 2011  


Помог: 0 раз(а)




White пишет:
massqwest только это не готовая функция. советую сначала заменить все спецсимволы на пробелы оставив только буквы, цифры и знак "-", и если это не критично привести к единому регистру.
massqwest пишет:
кирпич и кирпичный
если необходимо строить облако тегов, я бы предпочел, чтобы они воспринимались как одно слово.

Да уже вот занимаюсь Радость , мне именно и надо было чтобы выбирало точно.
 
 Top
DeepVarvar Супермодератор
Отправлено: 10 Августа, 2011 - 13:34:59
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Petro пишет:
Значит делить на 2 и округлять в меньшую сторону.

Зачем? Есть mb_strlen();

Только вот опять проблемка - если мерить mb_strlen("ПУШGQ") - то посчитает тоже неверно, выведет = 8.

Эта проблема в пхп все еще не пофиксена.
Хотя в Python, Java, JS и некоторых др. языках - все с этим в порядке.

К тем же проблеммным ф-циям можно отнести: substr и mb_substr - они же принимают ПОЗИЦИЮ СИМВОЛА в качестве аргумента.
Вот и режут символы пополам - на выходе кракозяблы.

Т.е. работает это правильно:
для substr и strlen - когда только однобайтные.
для mb_substr и mb_strlen - когда только многобайтные без цифр и знаков препинания.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB