2009-07-27 2 views
30

Je bricoler avec un finder de nom de domaine et je veux favoriser ces mots qui sont faciles à prononcer.Mesurer la prononçabilité d'un mot?

Exemple: nomoic.com (mauvais) par rapport à namelet.com (bon).

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

Code PHP pour la victoire.

+0

Quelle est votre vraie question? – Sean

+5

Il veut un algorithme pour déterminer à quel point un mot sonne. – jimyi

+2

J'aime cette question. – MitMaro

Répondre

15

Voici une fonction qui devrait fonctionner avec le plus commun des mots ... Il devrait vous donner un bon résultat entre 1 (prononçabilité parfait selon les règles) à 0.

La fonction suivante loin d'être parfait (Il n'aime pas vraiment les mots comme Tsunami [0.857]). Mais il devrait être assez facile à modifier pour 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; 
} 
+0

ouais ça sorta fonctionne. Je remarque 'wptmimi' = 'au revoir' (les deux .57). Je vais l'utiliser et dire n'importe quoi moins de 0,5 n'est pas prononçable. –

8

Je pense que le problème pourrait se résumer à l'analyse du mot dans un ensemble candidat de phonemes, puis en utilisant une liste prédéterminée de paires de phonèmes pour déterminer la façon dont le mot est prononçable. Par exemple: "skill" phonétiquement est "/ s/k/i/l /". "/ s/k /", "/ k/i /", "/ i/l /" devraient tous avoir des scores élevés de pronon- cabilité, donc le mot devrait avoir un score élevé. "Skpit" phonétiquement est "/ s/k/p/i/t /". "/ k/p /" devrait avoir un faible score de pronon- cabilité, donc le mot devrait avoir un score faible.

6

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

+1

conscient de toutes les bibliothèques JavaScript qui accomplissent cela? – Crashalot

+0

pendant ce temps est apparu: https://github.com/mrsharpoblunto/foswig.js – litechip

Questions connexes