Pregunta

he escrito el código PHP para poner en práctica la puntuación de Flesch-Kincaid legibilidad como una función:

function readability($text) {
    $total_sentences = 1; // one full stop = two sentences => start with 1
    $punctuation_marks = array('.', '?', '!', ':');
    foreach ($punctuation_marks as $punctuation_mark) {
        $total_sentences += substr_count($text, $punctuation_mark);
    }
    $total_words = str_word_count($text);
    $total_syllable = 3; // assuming this value since I don't know how to count them
    $score = 206.835-(1.015*$total_words/$total_sentences)-(84.6*$total_syllables/$total_words);
    return $score;
}

¿Tiene sugerencias de cómo mejorar el código? ¿Es correcto? ¿Funcionará?

Espero que me puedan ayudar. Gracias de antemano!

¿Fue útil?

Solución

El código se ve bien en lo que va de una heurística. Aquí están algunos puntos a considerar que hacen que los elementos que necesita para calcular considerablemente difícil para una máquina:

  1. ¿Qué es una oración?

    En serio, lo que es una sentencia? Tenemos períodos, pero también se puede utilizar para doctorado, por ejemplo, es decir, Y.M.C.A., y otros fines no de final de oración. Si tenemos en cuenta los signos de exclamación, signos de interrogación y elipses, en realidad está haciendo un flaco favor al asumir un período va a hacer el truco. He mirado en este problema antes, y si realmente quiere un recuento más fiable de frases en el texto real que necesita para analizar el texto. Esto puede ser computacionalmente, consumen mucho tiempo intensivo, y es difícil encontrar recursos libres para. Al final, usted todavía tiene que preocuparse acerca de la tasa de error de la aplicación del analizador en particular. Sin embargo, sólo el análisis completo le dirá lo que es una frase y lo que acaba de otros muchos usos de un período. Por otra parte, si usted está utilizando texto 'en la naturaleza' - como, por ejemplo, HTML - usted va a tener que preocuparse también frases que terminan no con puntuacion pero con terminaciones de etiquetas. Por ejemplo, muchos sitios no añaden puntuacion de H1 y H2 etiquetas, pero son claramente diferentes oraciones o frases.

  2. Las sílabas no son algo que deberíamos estar aproximando

    Esta es una característica importante de esta heurística facilitar la lectura, y es uno que hace que sea más difícil de implementar. análisis computacional de recuento sílaba en una obra requiere el supuesto de que el lector de habla asumido en el mismo dialecto sea cual sea su recuento generador de sílaba está siendo entrenado en. ¿Cómo suena caída en torno a una sílaba es efectiva en una parte importante de lo que hace acentos acentos. Si no me cree, trate de visitar Jamaica en algún momento. Lo que esto significa es que incluso si un humano fuera a hacer los cálculos para esto a mano, todavía sería una puntuación-dialecto específico.

  3. ¿Qué es una palabra?

    No a la cera psycholingusitic en lo más mínimo, pero se puede encontrar que las palabras separadas por espacio y lo que se conceptualizan como las palabras de un altavoz son muy diferentes. Esto hará que el concepto de una puntuación de legibilidad computable algo cuestionable.

Así que al final, no puedo responder a su pregunta de '¿funcionará'. Si usted está mirando para tomar un trozo de texto y mostrar esta puntuación de legibilidad entre otras métricas para ofrecer algún tipo de valor añadido concebible, el usuario exigente no se abre a todas estas preguntas. Si usted está tratando de hacer algo científico, o incluso algo pedagógica (como esta partitura y los afines tenían como último), no estaría muy molesta. De hecho, si usted va a utilizar esto para hacer cualquier tipo de sugerencias a un usuario sobre el contenido que han generado, estaría muy vacilante.

Una mejor manera de medir la dificultad para la lectura de un texto sería más probable es que sea algo que tiene que ver con la relación de las palabras de baja frecuencia a las palabras de alta frecuencia junto con el número de hapax hapax en el texto. Pero yo no persigo en realidad viene con una heurística de este tipo, ya que sería muy difícil de probar empíricamente nada igual.

Otros consejos

Tome un vistazo a la PHP texto Estadísticas clase en GitHub.

Por favor, eche un vistazo a raíz de dos clases y su información de uso. Es sin duda le ayudará.

La legibilidad sílaba Conde patrón de biblioteca de clases:

<?php class ReadabilitySyllableCheckPattern {

public $probWords = [
    'abalone' => 4,
    'abare' => 3,
    'abed' => 2,
    'abruzzese' => 4,
    'abbruzzese' => 4,
    'aborigine' => 5,
    'acreage' => 3,
    'adame' => 3,
    'adieu' => 2,
    'adobe' => 3,
    'anemone' => 4,
    'apache' => 3,
    'aphrodite' => 4,
    'apostrophe' => 4,
    'ariadne' => 4,
    'cafe' => 2,
    'calliope' => 4,
    'catastrophe' => 4,
    'chile' => 2,
    'chloe' => 2,
    'circe' => 2,
    'coyote' => 3,
    'epitome' => 4,
    'forever' => 3,
    'gethsemane' => 4,
    'guacamole' => 4,
    'hyperbole' => 4,
    'jesse' => 2,
    'jukebox' => 2,
    'karate' => 3,
    'machete' => 3,
    'maybe' => 2,
    'people' => 2,
    'recipe' => 3,
    'sesame' => 3,
    'shoreline' => 2,
    'simile' => 3,
    'syncope' => 3,
    'tamale' => 3,
    'yosemite' => 4,
    'daphne' => 2,
    'eurydice' => 4,
    'euterpe' => 3,
    'hermione' => 4,
    'penelope' => 4,
    'persephone' => 4,
    'phoebe' => 2,
    'zoe' => 2
];

public $addSyllablePatterns = [
    "([^s]|^)ia",
    "iu",
    "io",
    "eo($|[b-df-hj-np-tv-z])",
    "ii",
    "[ou]a$",
    "[aeiouym]bl$",
    "[aeiou]{3}",
    "[aeiou]y[aeiou]",
    "^mc",
    "ism$",
    "asm$",
    "thm$",
    "([^aeiouy])\1l$",
    "[^l]lien",
    "^coa[dglx].",
    "[^gq]ua[^auieo]",
    "dnt$",
    "uity$",
    "[^aeiouy]ie(r|st|t)$",
    "eings?$",
    "[aeiouy]sh?e[rsd]$",
    "iell",
    "dea$",
    "real",
    "[^aeiou]y[ae]",
    "gean$",
    "riet",
    "dien",
    "uen"
];

public $prefixSuffixPatterns = [
    "^un",
    "^fore",
    "^ware",
    "^none?",
    "^out",
    "^post",
    "^sub",
    "^pre",
    "^pro",
    "^dis",
    "^side",
    "ly$",
    "less$",
    "some$",
    "ful$",
    "ers?$",
    "ness$",
    "cians?$",
    "ments?$",
    "ettes?$",
    "villes?$",
    "ships?$",
    "sides?$",
    "ports?$",
    "shires?$",
    "tion(ed)?$"
];

public $subSyllablePatterns = [
    "cia(l|$)",
    "tia",
    "cius",
    "cious",
    "[^aeiou]giu",
    "[aeiouy][^aeiouy]ion",
    "iou",
    "sia$",
    "eous$",
    "[oa]gue$",
    ".[^aeiuoycgltdb]{2,}ed$",
    ".ely$",
    "^jua",
    "uai",
    "eau",
    "[aeiouy](b|c|ch|d|dg|f|g|gh|gn|k|l|ll|lv|m|mm|n|nc|ng|nn|p|r|rc|rn|rs|rv|s|sc|sk|sl|squ|ss|st|t|th|v|y|z)e$",
    "[aeiouy](b|c|ch|dg|f|g|gh|gn|k|l|lch|ll|lv|m|mm|n|nc|ng|nch|nn|p|r|rc|rn|rs|rv|s|sc|sk|sl|squ|ss|th|v|y|z)ed$",
    "[aeiouy](b|ch|d|f|gh|gn|k|l|lch|ll|lv|m|mm|n|nch|nn|p|r|rn|rs|rv|s|sc|sk|sl|squ|ss|st|t|th|v|y)es$",
    "^busi$"
]; } ?>

Otra clase que es de clase algoritmo de lectura que tiene dos métodos para calcular la puntuación:

<?php class ReadabilityAlgorithm {
function countSyllable($strWord) {
    $pattern = new ReadabilitySyllableCheckPattern();
    $strWord = trim($strWord);

    // Check for problem words
    if (isset($pattern->{'probWords'}[$strWord])) {
        return $pattern->{'probWords'}[$strWord];
    }

    // Check prefix, suffix
    $strWord = str_replace($pattern->{'prefixSuffixPatterns'}, '', $strWord, $tmpPrefixSuffixCount);

    // Removed non word characters from word
    $arrWordParts = preg_split('`[^aeiouy]+`', $strWord);
    $wordPartCount = 0;
    foreach ($arrWordParts as $strWordPart) {
        if ($strWordPart <> '') {
            $wordPartCount++;
        }
    }
    $intSyllableCount = $wordPartCount + $tmpPrefixSuffixCount;

    // Check syllable patterns 
    foreach ($pattern->{'subSyllablePatterns'} as $strSyllable) {
        $intSyllableCount -= preg_match('`' . $strSyllable . '`', $strWord);
    }

    foreach ($pattern->{'addSyllablePatterns'} as $strSyllable) {
        $intSyllableCount += preg_match('`' . $strSyllable . '`', $strWord);
    }

    $intSyllableCount = ($intSyllableCount == 0) ? 1 : $intSyllableCount;
    return $intSyllableCount;
}

function calculateReadabilityScore($stringText) {
    # Calculate score
    $totalSentences = 1;
    $punctuationMarks = array('.', '!', ':', ';');

    foreach ($punctuationMarks as $punctuationMark) {
        $totalSentences += substr_count($stringText, $punctuationMark);
    }

    // get ASL value
    $totalWords = str_word_count($stringText);
    $ASL = $totalWords / $totalSentences;

    // find syllables value
    $syllableCount = 0;
    $arrWords = explode(' ', $stringText);
    $intWordCount = count($arrWords);
    //$intWordCount = $totalWords;

    for ($i = 0; $i < $intWordCount; $i++) {
        $syllableCount += $this->countSyllable($arrWords[$i]);
    }

    // get ASW value
    $ASW = $syllableCount / $totalWords;

    // Count the readability score
    $score = 206.835 - (1.015 * $ASL) - (84.6 * $ASW);
    return $score;
} } ?>

// Ejemplo: cómo utilizar

<?php // Create object to count readability score
$readObj = new ReadabilityAlgorithm();
echo $readObj->calculateReadabilityScore("Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into: electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently; with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum!");
?>

En realidad no veo ningún problema con ese código. Por supuesto, podría ser optimizado un poco si realmente quería mediante la sustitución de todas las diferentes funciones con un solo bucle de conteo. Sin embargo, yo diría firmemente que no es necesario e incluso francamente mal. Su código actual es muy legible y fácil de entender, y optimizaciones que probablemente empeorará las cosas desde esa perspectiva. Utilizarlo como es, y no tratar de optimizarlo a menos que en realidad resulta ser un cuello de botella.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top