Плотность длины слова PHP/счетчик для строки

Учитывая текст, как я могу подсчитать плотность/количество длин слов, чтобы получить такой вывод

  • Слова из 1 буквы: 52 / 1%
  • Слова из 2 букв: 34 / 0,5%
  • Слова из 3 букв: 67 / 2%

Нашел это, но для python


person giorgio79    schedule 18.07.2011    source источник


Ответы (3)


Вы можете начать с разделения текста на слова, используя либо explode() (как очень/слишком простое решение) или preg_split() < em>(позволяет использовать более мощные вещи) :

$text = "this is some kind of text with several words";
$words = explode(' ', $text);


Затем переберите слова, получив для каждого из них его длину, используя strlen()< /сильный> ; и помещая эти длины в массив:

$results = array();
foreach ($words as $word) {
    $length = strlen($word);
    if (isset($results[$length])) {
        $results[$length]++;
    }
    else {
        $results[$length] = 1;
    }

}

Если вы работаете с UTF-8, см. раздел mb_strlen().


В конце этого цикла $results будет выглядеть так:

array
  4 => int 5
  2 => int 2
  7 => int 1
  5 => int 1


Общее количество слов, необходимое для расчета процента, можно найти либо:

  • Увеличивая счетчик внутри цикла foreach,
  • или вызвав array_sum() на $results после завершения цикла.

И для расчета процентов это немного математики - я не буду так полезен, об этом ^^

person Pascal MARTIN    schedule 18.07.2011
comment
слишком быстро :( - чтобы добавить к этому, прежде чем взорвать текст, было бы лучше str_заменить все знаки препинания ничем, потому что если у вас есть что-то вроде: Java - это хорошо, но PHP лучше всего. - best = 5 символов, когда на самом деле это 4 :) - person hex4; 18.07.2011
comment
@hex4 правда ; или он может отфильтровать слова (и символы) в начале цикла foreach до получения длины слова. - person Pascal MARTIN; 18.07.2011

Вы можете разбить текст на пробелы, а затем для каждого полученного слова подсчитать количество букв. Если есть знаки препинания или любой другой разделитель слов, вы должны это учитывать.

$lettercount = array();
$text = "lorem ipsum dolor sit amet";
foreach (explode(' ', $text) as $word)
{
  @$lettercount[strlen($word)]++; // @ for avoiding E_NOTICE on first addition
}

foreach ($lettercount as $numletters => $numwords)
{
  echo "$numletters letters: $numwords<br />\n";
}

ps: я не доказал это, но должно работать

person Carlos Campderrós    schedule 18.07.2011

Вы можете быть умнее в удалении знаков препинания, используя preg_replace.

$txt = "Sean Hoare, who was first named News of the World journalist to make hacking allegations, found dead at Watford home. His death is not being treated as suspiciou";

$txt = str_replace( "  ", " ", $txt );
$txt = str_replace( ".", "", $txt );
$txt = str_replace( ",", "", $txt );

$a = explode( " ", $txt );

$cnt = array();
foreach ( $a as $b )
{
  if ( isset( $cnt[strlen($b)] ) )
    $cnt[strlen($b)] += 1;
  else
    $cnt[strlen($b)] = 1;
}

foreach ( $cnt as $k => $v )
{
  echo $k . " letter words: " . $v . " " . round( ( $v * 100 ) / count( $a ) ) . "%\n";
}
person Steve Claridge    schedule 18.07.2011