Bir kelimenin pronounceability ölçün?

3 Cevap php

Ben bir alan adı bulucu ile müdahalesi ve kolay telaffuz olan bu kelimeleri lehine istiyor değilim.

Örnek: nameoic.com (kötü) namelet.com karşı (iyi).

Soundex ilgisi düşünüyordum uygun olabilir ama ben karşılaştırmalı skoru çeşit üretmek için kullanabilirsiniz gibi görünmüyor.

Kazanmak için PHP kodu.

3 Cevap

Burada kelimelerin en yaygın ile çalışması gerektiğini bir fonksiyon ... Bu 0'a (kurallara göre mükemmel pronounceability) size 1 arasında güzel bir sonuç vermelidir.

Mükemmellikten uzak Aşağıdaki fonksiyonu (değil oldukça Tsunami [0.857] gibi kelimeler gibi yapar). Ama bu ihtiyaçlarınız için oynamak oldukça kolay olmalıdır.

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

Ben sorunun kelime nasıl pronouncible belirlemek için fonem çiftleri önceden belirlenmiş bir listesini kullanarak sonra, phonemes bir aday kümesi içine sözcüğü ayrıştırma aşağı haşlanmış olabileceğini düşünüyorum.

Örneğin: "beceri" fonetik "/ s / k / i / l /" dir. "/ S / k /", "/ k / i /", "/ i / l /" Tüm pronouncibility yüksek puanları olmalıdır, yani kelime yüksek puan olmalıdır.

"Skpit" fonetik olduğu "/ s / k / p / i / t /". "/ K / p /" düşük pronouncibility puan olması gerekir, bu yüzden kelime düşük puan gerekir.

(Tabii harfler, kelimeler üzerinde değil,) bir Markov modeli kullanın. Bir kelimenin olasılığı telaffuz kolaylığı için oldukça iyi bir proxy. Daha uzun kelimeler doğal olarak daha az muhtemel olduğundan, uzunluk için normalize etmek gerekir.