#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 ну, наконец-то я изменил решение. Я надеюсь, что это то, что вам нужно.