Вычислите среднее количество слов в предложении

#php

Вопрос:

В своем PHP-проекте я пытаюсь рассчитать среднее количество слов в предложении.

Когда я ввожу несколько предложений, все работает так, как должно.

Предложение:

 "content": "Cassieres Werk zur der verbindet die des mit an."
 

Результат:

 "wordsPerSentences": "9.0"
 

НО когда я ввожу только одно предложение и без полной остановки, среднее значение равно «0».

Содержание:

 "content": "Cassieres Werk zur der verbindet die des mit an"
 

Результат:

 "wordsPerSentences": "0.0"
 

Кроме того, проблема в том, что, когда я ввожу «полная остановка» и пробел, это добавляет к счету или запятой и пробелу после слова?

Содержание:

 "content": "Cassieres Werk zur der, verbindet die des mit an. "
 

Результат:

 "wordsPerSentences": "10.0"
 

Как я могу охватить это условие среди прочих?

РЕДАКТИРОВАТЬ: Это условие решается, за исключением того, где между двумя словами в предложении есть «запятая», оно возвращает «1» и должно быть «2».

Мой код:

 $tokens    = ',.;';


$sentences = [];
  $chunk     = strtok(trim($text), $tokens);

  // Handle empty $text
  if (!is_string($chunk)) {
    return 0;
  }

  do {
    $sentences[] = $chunk;
  } while ($chunk = strtok($tokens));

  $countWords = function (int $carry, string $item) {
    return $carry   count(array_filter(explode(' ', $item)));
  };

  $totalWords = array_reduce($sentences, $countWords, 0);

  return $totalWords / count($sentences);
 

Ответ №1:

Вы можете использовать str_word_count:

 echo str_word_count('Cassieres Werk zur der verbindet die des mit an.'); //9
echo str_word_count('Cassieres Werk zur der verbindet die des mit an.   '); //9
echo str_word_count('    Cassieres Werk zur der verbindet die des mit an.   '); //9
echo str_word_count('    Cassieres Werk zur der verbindet     
die    des    mit an.   '); //9
echo str_word_count('  Cassieres Werk zur der verbindet die des mit an   ');
 

Он будет считать все слова и игнорировать пробелы/пробелы.

Ответ №2:

Вы можете использовать str_word_count.

 echo str_word_count('Cassieres Werk zur der verbindet die des mit an.');
 

Ответ №3:

следующая функция вернет среднее количество слов в предложении. Я надеюсь, что это решит вашу проблему.

 <?php

/**
 * Average words per sentence
 *
 * Assumptions:
 * - Only space character is used to separate words.
 * - Only '?' and '.' are used to separate sentences.
 * - Special characters ',', ';', '-' are removed from text.
 *
 * @author  Jawira Portugal
 * @license do whatever you want
 */
function str_average(string $text)
{
  // Removing "not word" characters in $text
  $special = [',', ';', '-'];
  $text    = str_replace($special, ' ', $text);

  $tokens = '.?';
  $chunk  = strtok(trim($text), $tokens);

  // Handle empty $text
  if (!is_string($chunk)) {
    return 0;
  }

  $sentences = [];
  do {
    $sentences[] = $chunk;
  } while ($chunk = strtok($tokens));

  $countWords = function (int $carry, string $item) {
    return $carry   count(array_filter(explode(' ', $item)));
  };

  $totalWords = array_reduce($sentences, $countWords, 0);

  return $totalWords / count($sentences);
}

echo str_average(''), PHP_EOL; // 0
echo str_average('  ,   '), PHP_EOL; // 0
echo str_average("Hello world, this is a test..."), PHP_EOL; // 6
echo str_average("Hello world? this is a test..."), PHP_EOL; // 3
echo str_average("Cassieres Werk zur der verbindet die des mit an."), PHP_EOL; // 9
echo str_average("Cassieres Werk zur der verbindet die des mit an"), PHP_EOL; // 9
echo str_average("Cassieres Werk zur der, verbindet die des mit an. "), PHP_EOL; // 9
echo str_average("...Hello world. foo bar baz? One two three four. "), PHP_EOL; // 3
 

ИЗМЕНИТЬ Я переписал функцию, чтобы разделить предложения на «.» и «?».

Комментарии:

1. Извините, на самом деле, два слова в предложении с запятой возвращают «1». Это должно быть «2», верно? @джавира

2. А добавлено ? в середине двух слов стоит «2», и это должно быть «1», верно? @джавира

3. @pohofo ну, эта функция дает среднее количество слов в каждом предложении. Поскольку», » находится внутри переменной $tokens, она используется для разделения строки на два предложения. Например, «привет, мир» считается двумя предложениями, поэтому «2 слова/2 предложения=1»

4. @pohofo Если вы хотите разделить предложения только с помощью точки ( . ), затем измените $tokens = '.'; , переменные $tokens используются для разделения предложений.

5. @pohofo ну, наконец-то я изменил решение. Я надеюсь, что это то, что вам нужно.