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
Форумы портала PHP.SU :: Версия для печати :: Подсчет слов в тексте
Форумы портала PHP.SU » » Вопросы новичков » Подсчет слов в тексте

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

1. massqwest - 09 Августа, 2011 - 22:58:55 - перейти к сообщению
Есть какой либо текст нужно найти 5 наиболее часто встречающихся слов в тексте.
На ум только приходит забивать его в массив и потом уже каждое слово искать в тексте.Но мне кажется это будет довольно ресурсоемко.
вот пример как нужно сделать http://tekto.biz/sick/ns.php.
Готовое решение не нужно (хотя если есть не откажусь), хотя бы укажите в какую сторону копать.
2. White - 09 Августа, 2011 - 23:35:02 - перейти к сообщению
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. }
3. DeepVarvar - 10 Августа, 2011 - 03:12:27 - перейти к сообщению
4. massqwest - 10 Августа, 2011 - 07:55:30 - перейти к сообщению
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 это выполнить не получилось бы ведь он посчитал бы и кирпич и кирпичный хотя два разных слова.
5. White - 10 Августа, 2011 - 08:15:32 - перейти к сообщению
massqwest только это не готовая функция. советую сначала заменить все спецсимволы на пробелы оставив только буквы, цифры и знак "-", и если это не критично привести к единому регистру.
massqwest пишет:
кирпич и кирпичный
если необходимо строить облако тегов, я бы предпочел, чтобы они воспринимались как одно слово.
6. Petro - 10 Августа, 2011 - 10:53:13 - перейти к сообщению
Возник вопрос почему количество букв не соответствует количеству букв в слове?
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
7. White - 10 Августа, 2011 - 11:02:45 - перейти к сообщению
Petro строковые функции как правило работают с ANSI а не мультиязычными кодировками, а в ANSI одному символу соответствует один байт, вот strlen и считает байты.
8. DeepVarvar - 10 Августа, 2011 - 11:20:15 - перейти к сообщению
White пишет:
вот strlen и считает байты

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

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

угу, угу даже по телевизору недавно говорили про количество букв в русском смс Ха-ха
10. Petro - 10 Августа, 2011 - 11:52:14 - перейти к сообщению
Точно, давно я не писал транслитом Ха-ха
Значит делить на 2 и округлять в меньшую сторону.
floor(strlen($index)/2)
Cпасибо огромное!
11. massqwest - 10 Августа, 2011 - 12:37:42 - перейти к сообщению
White пишет:
massqwest только это не готовая функция. советую сначала заменить все спецсимволы на пробелы оставив только буквы, цифры и знак "-", и если это не критично привести к единому регистру.
massqwest пишет:
кирпич и кирпичный
если необходимо строить облако тегов, я бы предпочел, чтобы они воспринимались как одно слово.

Да уже вот занимаюсь Радость , мне именно и надо было чтобы выбирало точно.
12. DeepVarvar - 10 Августа, 2011 - 13:34:59 - перейти к сообщению
Petro пишет:
Значит делить на 2 и округлять в меньшую сторону.

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

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

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

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

Т.е. работает это правильно:
для substr и strlen - когда только однобайтные.
для mb_substr и mb_strlen - когда только многобайтные без цифр и знаков препинания.

 

Powered by ExBB FM 1.0 RC1