28 votes

Mesurer la prononçabilité d'un mot?

Je bricoler avec un chercheur de nom de domaine et je veux privilégier les mots qui sont faciles à prononcer.

Exemple: nameoic.com (mauvais) contre namelet.com (bon).

Penser que quelque chose à voir avec soundex peut être approprié, mais il ne semble pas que je puisse les utiliser pour produire une sorte de partition comparative.

Code PHP pour la victoire.

15voto

Andrew Moore Points 49765

Voici une fonction qui devrait fonctionner avec les mots les plus courants ... Elle devrait vous donner un bon résultat entre 1 (prononçabilité parfaite selon les règles) à 0.

La fonction suivante loin d'être parfaite (elle ne ressemble pas tout à fait à des mots comme Tsunami [0.857]). Mais il devrait être assez facile de modifier vos besoins.

 <?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;
}
 

7voto

Jeffrey Kemp Points 26050

Je pense que le problème pourrait être réduite à l'analyse de la parole dans un ensemble candidat de phonèmes, puis à l'aide d'une liste prédéterminée de phonème paires de déterminer comment pronouncible le mot est.

Par exemple: "compétence" est phonétiquement "/s/k/i/l/". "/s/k/", "/k/i/", "/i/l/" devraient tous avoir des scores élevés de pronouncibility, de sorte que le mot devrait marquer beaucoup de points.

"skpit" est phonétiquement "/s/k/p/i/t/". "/k/p/" devrait avoir un faible pronouncibility score, de sorte que le mot devrait score faible.

4voto

Kevin Peterson Points 4456

Utilisez un modèle de Markov (sur les lettres, pas sur les mots, bien sûr). La probabilité d'un mot est un assez bon proxy pour faciliter la prononciation. Vous devrez normaliser la longueur, car les mots plus longs sont intrinsèquement moins probables.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X