2009-07-27 11 views
30

Używam wyszukiwarki nazw domen i chcę faworyzować te słowa, które można łatwo wymówić.Zmierz zdolność wymowy słowa?

Przykład: nameoic.com (bad) versus namelet.com (good).

Myślałem, że coś związanego z soundexem może być odpowiednie, ale wygląda na to, że nie mogę ich użyć do wytworzenia jakiegoś porównywalnego wyniku.

Kod PHP do wygrania.

+0

Jakie jest Twoje aktualne pytanie? – Sean

+5

Chce algorytmu określającego, jak dobrze brzmi słowo. – jimyi

+2

Podoba mi się to pytanie. – MitMaro

Odpowiedz

15

Oto funkcja, która powinna pracować z najczęstszych słów ... Powinna ona daje piękny rezultat pomiędzy 1 (Idealny pronounceability według zasad) do 0.

Poniższa funkcja dalekie od doskonałości (nie podobają mu się słowa takie jak Tsunami [0.857]). Jednak dostosowanie do twoich potrzeb powinno być dość łatwe.

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

tak, sorta działa. Zauważam "wptmimi" = "do widzenia" (oba .57). Zamierzam go użyć i powiedzieć, że cokolwiek mniej niż .5 nie jest do wymówienia. –

8

Sądzę, że problem można sprowadzić do przeanalizowania słowa w zestawie kandydatów o wartości phonemes, a następnie za pomocą z góry ustalonej listy par fonemów, aby określić, jak wymawia się to słowo.

Na przykład: "umiejętność" fonetycznie to "/ s/k/i/l /". "/ s/k /", "/ k/i /", "/ i/l /" powinny wszystkie mieć wysoką ocenę wymowy, więc słowo powinno mieć wysoki wynik.

"Skpit" fonetycznie to "/ s/k/p/i/t /". "/ k/p /" powinno mieć niską ocenę wymowy, więc słowo powinno uzyskać niski wynik.

6

Użyj modelu Markowa (na literach, nie słowach, oczywiście). Prawdopodobieństwo słowa jest całkiem dobrym pośrednikiem dla łatwości wymowy. Będziesz musiał znormalizować dla długości, ponieważ dłuższe słowa są z natury mniej prawdopodobne.

+1

świadomy jakichkolwiek bibliotek JavaScript, które to wykonują? – Crashalot

+0

tymczasem to się pojawiło: https://github.com/mrsharpoblunto/foswig.js – litechip

Powiązane problemy