【问题标题】:Measure the pronounceability of a word?测量一个单词的发音?
【发布时间】:2010-11-14 05:54:54
【问题描述】:

我正在修改一个域名查找器,并希望偏爱那些易于发音的单词。

示例:nameoic.com(差)与 namelet.com(好)。

正在考虑与 soundex 相关的一些事情可能是合适的,但看起来我不能用它们来产生某种比较分数。

胜利的 PHP 代码。

【问题讨论】:

  • 他想要一个算法来确定一个单词的发音。
  • nameoic 对我来说听起来不错

标签: php domain-name


【解决方案1】:

这是一个适用于最常见单词的函数......它应该会给你一个介于 1(根据规则的完美发音)到 0 之间的良好结果。

以下函数远非完美(它不太喜欢 Tsunami [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;
}

【讨论】:

  • 是的,它有点工作。我注意到'wptmimi' = 'goodbye'(都是 0.57)。我将使用它并说小于 0.5 的任何内容都无法发音。
【解决方案2】:

我认为问题可以归结为将单词解析为 phonemes 的候选集,然后使用预定的音素对列表来确定单词的发音程度。

例如:“技能”的拼音是“/s/k/i/l/”。 “/s/k/”、“/k/i/”、“/i/l/”都应该有高分的发音,所以这个词应该高分。

“skpit”在语音上是“/s/k/p/i/t/”。 “/k/p/”应该有一个低发音分数,所以这个词应该低分。

【讨论】:

    【解决方案3】:

    使用马尔可夫模型(当然是关于字母,而不是单词)。单词的概率是发音容易程度的一个很好的代表。您必须对长度进行规范化,因为较长的单词本质上不太可能。

    【讨论】:

    • 知道有什么 JavaScript 库可以做到这一点吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多