2009-07-27 9 views
30

Sto armeggiando con un cercatore di nomi di dominio e voglio favorire quelle parole che sono facili da pronunciare.Misurare la pronuncabilità di una parola?

Esempio: nameoic.com (cattivo) contro namelet.com (buono).

Pensavo che qualcosa da fare con soundex fosse appropriato, ma non sembra che io possa usarli per produrre una sorta di punteggio comparativo.

codice PHP per la vittoria.

+0

Qual è la tua domanda attuale? – Sean

+5

Vuole un algoritmo per determinare quanto suona bene una parola. – jimyi

+2

Mi piace questa domanda. – MitMaro

risposta

15

Ecco una funzione che dovrebbe funzionare con la più comune delle parole ... dovrebbe dare un bel risultato compreso tra 1 (pronunciabilità perfetta secondo le regole) a 0.

La seguente funzione ben lungi dall'essere perfetto (non piace parole come Tsunami [0.857]). Ma dovrebbe essere abbastanza facile da modificare per le tue esigenze.

<?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ì, funziona in qualche modo. Noto 'wptmimi' = 'addio' (entrambi .57). Lo userò e dirò qualcosa di meno di .5 non è pronunciabile. –

8

Penso che il problema potrebbe essere ridotto all'analisi della parola in una serie di candidati di phonemes, quindi utilizzando un elenco predeterminato di coppie di fonemi per determinare quanto sia pronunciata la parola.

Ad esempio: "skill" foneticamente è "/ s/k/i/l /". "/ s/k /", "/ k/i /", "/ i/l /" dovrebbero avere tutti punteggi più alti di pronuncia, quindi la parola dovrebbe segnare molto.

"skpit" foneticamente è "/ s/k/p/i/t /". "/ k/p /" dovrebbe avere un basso punteggio di pronuncia, quindi la parola dovrebbe segnare un punteggio basso.

6

Utilizzare un modello Markov (su lettere, non parole, ovviamente). La probabilità di una parola è un proxy piuttosto buono per la facilità di pronuncia. Dovrai normalizzare per la lunghezza, dal momento che le parole più lunghe sono intrinsecamente meno probabili.

+1

consapevole di eventuali librerie JavaScript che lo compiono? – Crashalot

+0

nel frattempo questo è apparso: https://github.com/mrsharpoblunto/foswig.js – litechip

Problemi correlati