2009-07-27 18 views
30

मैं एक डोमेन नाम खोजक के साथ झुका रहा हूं और उन शब्दों का पक्ष लेना चाहता हूं जो उच्चारण करना आसान है।एक शब्द की घोषणा को मापें?

उदाहरण: nameoic.com (खराब) बनाम namelet.com (अच्छा)।

ध्वनि के साथ कुछ करने के लिए सोच रहा था उचित हो सकता है लेकिन ऐसा लगता है कि मैं उन्हें तुलनात्मक स्कोर के कुछ प्रकार के उत्पादन के लिए उपयोग कर सकता हूं।

जीत के लिए PHP कोड।

+0

आपका वास्तविक प्रश्न क्या है? – Sean

+5

वह यह निर्धारित करने के लिए एक एल्गोरिदम चाहता है कि कोई शब्द कितना अच्छा लगता है। – jimyi

+2

मुझे यह प्रश्न पसंद है। – MitMaro

उत्तर

15

यहाँ एक समारोह जो शब्दों का सबसे आम के साथ काम करना चाहिए है ... यह आप एक अच्छे (नियमों के अनुसार सही pronounceability) 0.

निम्नलिखित कार्य करने के लिए 1 के बीच परिणाम अब तक सही से देना चाहिए (यह सुनामी [0.857] जैसे शब्दों की तरह नहीं है)। लेकिन यह आपकी जरूरतों के लिए ट्विक करना काफी आसान होना चाहिए।

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

हाँ यह sorta काम करता है। मैं 'wptmimi' = 'अलविदा' (दोनों .57) नोटिस। मैं इसका उपयोग करने जा रहा हूं और 5 से कम कुछ भी कह सकता हूं। –

8

मुझे लगता है कि phonemes के उम्मीदवार सेट में शब्द को पार्स करने के लिए समस्या को उबाला जा सकता है, फिर यह निर्धारित करने के लिए कि फोनेम जोड़े की पूर्व निर्धारित सूची का उपयोग करके यह शब्द निर्धारित किया जा सकता है।

उदाहरण के लिए: "कौशल" ध्वन्यात्मक रूप से "/ s/k/i/l /" है। "/ s/k /", "/ k/i /", "/ i/l /" सभी में सर्वनाम की उच्च संख्या होनी चाहिए, इसलिए शब्द को अत्यधिक स्कोर करना चाहिए।

"skpit" ध्वन्यात्मक रूप से "/ s/k/p/i/t /" है। "/ k/p /" में कम pronouncibility स्कोर होना चाहिए, इसलिए शब्द कम स्कोर करना चाहिए।

6

मार्कोव मॉडल का उपयोग करें (अक्षरों पर, शब्द नहीं, बिल्कुल)। उच्चारण की आसानी के लिए एक शब्द की संभावना एक बहुत अच्छी प्रॉक्सी है। आपको लंबाई के लिए सामान्य बनाना होगा, क्योंकि लंबे शब्द स्वाभाविक रूप से कम संभव हैं।

+1

इसे पूरा करने वाले किसी भी जावास्क्रिप्ट पुस्तकालयों से अवगत है? – Crashalot

+0

इस बीच यह दिखाई दिया: https://github.com/mrsharpoblunto/foswig.js – litechip

संबंधित मुद्दे