Frage

Ich schrieb diesen PHP-Code der Flesch-Kincaid Ablesbarkeit Score als eine Funktion zu implementieren:

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

Haben Sie Vorschläge, wie Sie den Code zu verbessern? Ist es richtig? Wird es funktionieren?

Ich hoffe, dass Sie mir helfen können. Vielen Dank im Voraus!

War es hilfreich?

Lösung

Der Code sieht gut aus so weit wie eine Heuristik geht. Hier sind einige Punkte zu beachten, dass die Elemente, die Sie brauchen für eine Maschine erheblich schwer zu berechnen:

  1. Was ist ein Satz?

    Im Ernst, was ist ein Satz? Wir haben Perioden, aber sie können auch für Ph.D. verwendet werden, zum Beispiel, das heißt, Y.M.C.A. und andere nicht-Satz-final Zwecke. Wenn Sie Ausrufezeichen, Fragezeichen betrachten und Ellipsen, sich selbst zu tun Sie wirklich einen schlechten Dienst durch einen Punkt unter der Annahme, den Trick. Ich habe vor zu diesem Problem sieht, und wenn Sie wirklich eine zuverlässigere Anzahl der Sätze in realen Texten wollen, müssen Sie den Text zu analysieren. Dies kann rechenintensiv, zeitraubend sein, und hart für freie Ressourcen zu finden. Am Ende haben Sie noch über die Fehlerrate der jeweiligen Parser Umsetzung sorgen. Allerdings nur vollständige Analyse wird Ihnen sagen, was ein Satz ist und was nur einen Zeitraum von vielen anderen Anwendungen. Außerdem, wenn Sie Text verwenden ‚in the wild‘ - wie, sagen wir, HTML - du wirst auch Sätze kümmern um nicht mit Interpunktion endet aber mit dem Tag Endungen. viele Websites Interpunktion nicht in den H1 und H2-Tags, aber sie sind deutlich unterschiedliche Sätze oder Phrasen zum Beispiel.

  2. Syllables sind nicht etwas, was wir werden Annäherung sollte

    Dies ist ein wichtiges Kennzeichen dieser Lesbarkeit heuristischen, und es ist eine, die es am schwierigsten zu implementieren macht. Computeranalyse von Silbenzahl in einer Arbeit erfordert die Annahme, dass die angenommene Leser in dem gleichen Dialekt sprechen, als was auch immer Ihre Silbe Graf Generator geschult wird. Wie klingt fallen um eine Silbe ist tatsächlich ein großer Teil dessen, was Akzente Akzente macht. Wenn Sie mir nicht glauben, versuchen irgendwann Jamaika besuchen. Was dies bedeutet, dass selbst wenn ein Mensch die Berechnungen für diesen von Hand zu tun wäre, wäre es immer noch ein Dialekt spezifische Punktzahl sein.

  3. Was ist ein Wort?

    Nicht Wachs psycholingusitic im geringsten, aber Sie werden feststellen, dass durch Leerzeichen getrennte Wörter finden und was als Worte an einen Lautsprecher konzipiert werden, sind ganz anders. Dies wird das Konzept einer berechenbaren Lesbarkeit Score etwas fragwürdig machen.

Also am Ende, kann ich Ihre Frage beantworten, ‚wird es funktionieren.‘ Wenn Sie schauen, einen Text zu nehmen und diese Lesbarkeit Score unter anderen Metriken zeigen eine Art von denkbaren Mehrwert zu bieten, wird der anspruchsvolle Anwender nicht alle diese Fragen bringen. Wenn Sie versuchen, pädagogisch etwas wissenschaftliche oder sogar etwas zu tun (wie diese Partitur und die wie sie letztlich bestimmt waren), würde ich nicht wirklich gestört. In der Tat, wenn Sie diese verwenden werden, jede Art von Anregungen für einen Benutzer über den Inhalt zu machen, die sie erzeugt haben, würde ich sehr zögerlich sein.

Eine bessere Möglichkeit, das Lesen Schwierigkeit eines Textes zu messen eher etwas würde mit dem Verhältnis von niederfrequenten Wörter zu Hochfrequenz Wörter zusammen mit der Anzahl der hapax legomena im Text. Aber ich würde nicht verfolgen tatsächlich mit einer Heuristik wie diese kommen, weil es sehr schwierig wäre, empirisch etwas zu testen, wie es.

Andere Tipps

Werfen Sie einen Blick auf die PHP Text Statistik Klasse auf GitHub.

Weitere Informationen finden sie auf folgenden zwei Klassen und ihre Verwendungsinformationen. Es wird sicher helfen.

Ablesbarkeit Syllable Count Pattern Library Klasse:

<?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$"
]; } ?>

Eine andere Klasse, die Lesbarkeit Algorithmus Klasse mit zwei Methoden ist Punktzahl zu berechnen:

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

// Beispiel: Wie benutzt man

<?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!");
?>

Ich sehe eigentlich keine Probleme mit diesem Code. Natürlich könnte es ein wenig optimiert werden, wenn man wirklich will mit einem einzigen Zählschleife all unterschiedlichen Funktionen durch den Ersatz. Allerdings würde ich stark argumentieren, dass es nicht notwendig ist, und sogar völlig falsch. Ihr aktueller Code ist sehr gut lesbar und leicht zu verstehen, und alle Optimierungen würden wahrscheinlich aus dieser Perspektive alles noch schlimmer machen. Verwenden Sie es, wie es ist, und versuchen Sie nicht, es zu optimieren, wenn es eine Performance-Engpass sein tatsächlich ausfällt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top