2009-07-02 9 views
7

私は関数としてフレッシュ・キンケード可読性スコアを実装するために、このPHPコードを書きました:フレッシュ・キンケイド可読性:PHPの機能を向上させる

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

あなたは、コードを改善する方法の提案を持っていますか?それが正しいか?それは働くでしょうか?

私があなたを助けてくれることを願っています。前もって感謝します!

答えて

17

ヒューリスティックになる限り、コードは正常に見えます。あなたが計算する必要があるアイテムを機械にとってかなり困難にするいくつかのポイントを挙げておきます:

  1. 文章とは何ですか?

    真剣に、文とは何ですか?期間はありますが、博士号(例:Y.M.C.A.)やその他の非文章の最終目的にも使用できます。感嘆符、疑問符、および省略記号を考慮する場合、あなたは実際には、期間がトリックを行うと仮定することによって自分自身を中傷している。私はこの問題を以前に見てきましたが、実際の文章の文章数をもっと信頼できるものにするには、文章を解析する必要があります。これは、計算集約的で時間がかかり、無料のリソースを見つけるのが難しい場合があります。最終的には、特定のパーサー実装のエラー率を心配する必要があります。しかし、完全な構文解析だけでは、何が文章であり、何が期間の他の多くの用途であるかが分かります。さらに、HTMLなどの「野生の中の」テキストを使用している場合、句読点ではなくタグの終わりで終わる文についても心配する必要があります。たとえば、多くのサイトでは、h1タグとh2タグに句読点を追加していませんが、明らかに異なる文章や句です。

  2. 音節は、我々はこれは、この読みやすさのヒューリスティックの主要な特徴であり、そしてそれが実現することが最も困難に一つだ

    を近似しなければならない何かではありません。仕事の音節数の計算的分析には、仮定された読者があなたの音節数ジェネレーターが訓練されているものと同じ方言で話すという前提が必要です。どの音が音節の周りにどのように落ちるかは、実際にはアクセントを強調する要素の大部分です。あなたが私を信じていないなら、いつかジャマイカを訪問してみてください。これは、たとえ人間がこれを手作業で計算しても、依然として方言固有のスコアであることを意味します。

  3. 単語とは何ですか?

    psycholingusiticをほんの少しではないが、スペースで区切られた単語と、話者の言葉として概念化されたものが全く異なることがわかる。これにより、計算可能な可読性スコアのコンセプトが多少疑わしいものになります。

最終的には、私はあなたの質問に答えることができます。テキストを取り出し、この可読性スコアを他のメトリックの中に表示して、考えられる付加価値を提供したいと思っているなら、分かりやすいユーザーはこれらのすべての質問を出すことはありません。あなたが何か科学的な、あるいは教育的な何かをしようとしているなら(このスコアとそれが最終的に意図されているように)、私は本当に気にしません。実際、あなたが生成したコンテンツについてユーザに何らかの提案をするためにこれを使うつもりなら、私は非常に躊躇します。

テキストの読み難さを測定するより良い方法は、低頻度の単語と高頻度の単語の比率と、テキスト内のhapax legomenaの数を関連付けることです。しかし、私は実際には経験的にこのようなものをテストすることは非常に難しいので、実際にはこのようなヒューリスティックを思いつくことを追求しません。

+0

この詳細な回答ありがとうございます。今私は正確な結果が必要な場合は、この数式を使用することは意味がないことを理解しました。 – caw

0

実際にこのコードで問題は発生していません。もちろん、すべての異なる機能を単一のカウントループに置き換えることが本当に必要な場合は、少し最適化することができます。しかし、私は、それが必要ではなく、まったく間違っていると強く主張します。あなたの現在のコードは非常に読みやすく、理解しやすく、どんな最適化でも、おそらくそのような観点から悪化するでしょう。それをそのまま使用し、実際にパフォーマンスのボトルネックとならない限り、最適化を試みないでください。

8

GitHubのPHP Text Statisticsクラスを見てください。

+0

ありがとう、面白いリンク! – caw

6

次の2つのクラスとその使用方法をご覧ください。それは確かにあなたを助けるでしょう。

可読性音節カウントパターンライブラリクラス:

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

スコアを計算するために2つのメソッドを持つ可読性アルゴリズムクラスである別のクラス:

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

//例:

<?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!"); 
?> 
を使用する方法
関連する問題