Посмотрите здесь
Текущая реализация сохраняет массив целых объектов для всех целых чисел от -5 до 256, когда вы создаете int в этом диапазоне вы фактически просто возвращаете ссылку на существующий объект.
blockquote>
Вот функция, которая должна работать с наиболее распространенными словами ... Она должна дать вам хороший результат от 1 (отличная произносимость согласно правилам) до 0.
следующая функция далека от совершенства (не совсем любит слова типа Цунами [0.857]). Но это должно быть довольно легко настроить для ваших нужд.
<?php
// Score: 1
echo pronounceability('namelet') . "\n";
// Score: 0.71428571428571
echo pronounceability('nameoic') . "\n";
function pronounceability($word) {
static $vowels = array
(
'a',
'e',
'i',
'o',
'u',
'y'
);
static $composites = array
(
'mm',
'll',
'th',
'ing'
);
if (!is_string($word)) return false;
// Remove non letters and put in lowercase
$word = preg_replace('/[^a-z]/i', '', $word);
$word = strtolower($word);
// Special case
if ($word == 'a') return 1;
$len = strlen($word);
// Let's not parse an empty string
if ($len == 0) return 0;
$score = 0;
$pos = 0;
while ($pos < $len) {
// Check if is allowed composites
foreach ($composites as $comp) {
$complen = strlen($comp);
if (($pos + $complen) < $len) {
$check = substr($word, $pos, $complen);
if ($check == $comp) {
$score += $complen;
$pos += $complen;
continue 2;
}
}
}
// Is it a vowel? If so, check if previous wasn't a vowel too.
if (in_array($word[$pos], $vowels)) {
if (($pos - 1) >= 0 && !in_array($word[$pos - 1], $vowels)) {
$score += 1;
$pos += 1;
continue;
}
} else { // Not a vowel, check if next one is, or if is end of word
if (($pos + 1) < $len && in_array($word[$pos + 1], $vowels)) {
$score += 2;
$pos += 2;
continue;
} elseif (($pos + 1) == $len) {
$score += 1;
break;
}
}
$pos += 1;
}
return $score / $len;
}
Я думаю, что проблема может быть сведена к синтаксическому анализу слова на набор кандидатов из фонем , а затем с использованием заранее определенного списка пар фонем, чтобы определить, насколько произносимо слово.
Ибо пример: «умение» фонетически означает «/ s / k / i / l /». «/ s / k /», «/ k / i /», «/ i / l /» все должны иметь высокий балл по произношению, поэтому слово должно иметь высокий балл.
«skpit» фонетически означает «/ s /» к / п / я / т / ". «/ k / p /» должно иметь низкий балл произносимости, поэтому слово должно иметь низкий балл.
Используйте марковскую модель (конечно, для букв, а не для слов). Вероятность слова - довольно хороший показатель простоты произношения. Вам придется нормализовать длину, поскольку более длинные слова по своей природе менее вероятны.