Я занимаюсь поиском доменных имен и хочу поддержать слова, которые легко произнести.
Пример: nameoic.com (плохо) по сравнению с namelet.com (хорошо).
Думал, что что-то делать с soundex может быть уместным, но не похоже, что я могу использовать их для создания своего рода сравнительного балла.
PHP-код для победы.
Вот функция, которая должна работать с наиболее распространенными словами … Она должна дать хороший результат между 1 (совершенная выражаемость в соответствии с правилами) до 0.
Следующая функция далека от совершенства (это не совсем похоже на такие слова, как Tsunami [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('/[^az]/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 / i / t /». «/ k / p /» должен иметь низкий показатель произносимости, поэтому слово должно забивать на низком уровне.
Используйте марковскую модель (конечно, буквы, а не слова). Вероятность слова – довольно хороший прокси для простоты произношения. Вам придется нормализовать длину, поскольку более длинные слова по своей сути менее вероятны.