Подтвердить что ты не робот

Измерять произносимость слова?

Я занимаюсь поиском имени домена и хочу поддержать слова, которые легко произнести.

Пример: nameoic.com(плохо) по сравнению с именемlet.com.com(хорошо).

Думал, что что-то делать с soundex может быть уместным, но не похоже, что я могу использовать их для создания своего рода сравнительного балла.

PHP-код для победы.

4b9b3361

Ответ 1

Вот функция, которая должна работать с наиболее распространенными словами... Она должна дать хороший результат между 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('/[^a-z]/i', '', $word);
    $word = strtolower($word);

    // Special case
    if ($word == 'a') return 1;

    $len = strlen($word);

    // Let 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;
}

Ответ 2

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

Например: "умение" фонетически "/s/k/i/l/". "/s/k/", "/k/i/", "/i/l/" должны иметь высокий балл с возможностью произносимости, поэтому слово должно высоко оценивать.

"skpit" фонетически "/s/k/p/i/t/". "/k/p/" должен иметь низкий показатель проницаемости, поэтому слово должно забивать низкое.

Ответ 3

Используйте марковскую модель (конечно, буквы, а не слова). Вероятность слова - довольно хороший прокси для простоты произношения. Вам придется нормализовать длину, поскольку более длинные слова по своей сути менее вероятны.