2009-07-27 9 views
30

Estoy retocando con un buscador de nombres de dominio y quiero favorecer esas palabras que son fáciles de pronunciar.¿Mide la pronosticabilidad de una palabra?

Ejemplo: nameoic.com (malo) versus namelet.com (bueno).

Estaba pensando algo que ver con soundex puede ser apropiado, pero no parece que pueda usarlos para producir algún tipo de puntaje comparativo.

Código PHP para la victoria.

+0

¿Cuál es su pregunta real? – Sean

+5

Él quiere un algoritmo para determinar qué tan bien suena una palabra. – jimyi

+2

Me gusta esta pregunta. – MitMaro

Respuesta

15

Aquí es una función que debe funcionar con la más común de las palabras ... debe darle un buen resultado entre 1 (pronunciabilidad perfecto de acuerdo a las normas) a 0.

La siguiente función lejos de ser perfecto (No le gustan las palabras como Tsunami [0,857]). Pero debería ser bastante fácil de ajustar para sus necesidades.

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

sí, todo funciona. Noto 'wptmimi' = 'adiós' (ambos .57). Voy a usarlo y decir algo menos que .5 no es pronunciable. –

8

Creo que el problema podría reducirse a analizar la palabra en un conjunto de candidatos de phonemes, y luego usar una lista predeterminada de pares de fonemas para determinar qué tan pronunciable es la palabra.

Por ejemplo: "habilidad" fonéticamente es "/ s/k/i/l /". "/ s/k /", "/ k/i /", "/ i/l /" deberían tener puntajes altos de pronunciabilidad, por lo que la palabra debería tener un puntaje alto.

"skpit" fonéticamente es "/ s/k/p/i/t /". "/ k/p /" debe tener una puntuación de baja pronunciabilidad, por lo que la palabra debe tener un puntaje bajo.

6

Utilice un modelo de Markov (en letras, no en palabras, por supuesto). La probabilidad de una palabra es un buen proxy para facilitar la pronunciación. Tendrás que normalizar la longitud, ya que las palabras más largas son intrínsecamente menos probables.

+1

consciente de las bibliotecas de JavaScript que logran esto? – Crashalot

+0

Mientras tanto apareció esto: https://github.com/mrsharpoblunto/foswig.js – litechip

Cuestiones relacionadas