フレッシュ・キンケイドの可読性:PHP機能の改善
-
21-08-2019 - |
質問
Flesch-Kincaid 可読性スコアを関数として実装するために、次の 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;
}
コードを改善する方法について提案はありますか?それが正しいか?うまくいきますか?
助けていただければ幸いです。前もって感謝します!
解決
ヒューリスティックに関する限り、コードは問題ないようです。マシンにとって計算が非常に難しい項目を考慮する必要があるいくつかの点を次に示します。
文とは何ですか?
真剣に、文とは何ですか?ピリオドはありますが、Y.M.C.A. などの Ph.D. やその他の最終的な文章以外の目的にも使用できます。感嘆符、疑問符、省略記号について考えるとき、ピリオドで十分だと思い込んでいると、本当にひどいことになります。私は以前にこの問題を検討したことがありますが、実際のテキスト内の文の数をより信頼性の高いものにしたい場合は、テキストを解析する必要があります。これは計算量が多く、時間がかかり、無料のリソースを見つけるのが難しい場合があります。結局のところ、特定のパーサー実装のエラー率について心配する必要があります。ただし、完全な解析のみが、何が文であり、何がピリオドの他の多くの用途に使用されているかを知ることができます。さらに、HTML などの「そのままの」テキストを使用している場合は、句読点ではなくタグで終わる文についても心配する必要があります。たとえば、多くのサイトでは h1 タグと h2 タグに句読点を追加していませんが、これらは明らかに異なる文またはフレーズです。
音節は近似すべきものではありません
これは、この可読性ヒューリスティックの大きな特徴であり、実装を最も困難にしているものでもあります。作品の音節数をコンピューターで分析するには、想定される読者が、音節数ジェネレーターがトレーニングされているものと同じ方言で話すという前提が必要です。音が音節の周りにどのように配置されるかは、実際、アクセントをアクセントにする主要な部分です。私の言うことが信じられないなら、一度ジャマイカを訪れてみてください。これが意味するのは、たとえ人間が手作業で計算したとしても、依然として方言固有のスコアになるということです。
言葉とは何ですか?
言語心理学的なことを少しも言うつもりはありませんが、スペースで区切られた単語と、話者にとって単語として概念化されたものはまったく異なることがわかるでしょう。これにより、計算可能な可読性スコアの概念に多少の疑問が生じます。
したがって、最終的には、「うまくいくかどうか」という質問に答えることができます。テキストの一部を取得し、この可読性スコアを他の指標と合わせて表示して、何らかの付加価値を提供しようとしている場合、目の肥えたユーザーはこれらすべての質問を持ち出すことはありません。もしあなたが何か科学的なこと、あるいは教育的なこと(このスコアやそれに類するものが最終的に意図したものであるように)をやろうとしているのであれば、私はあまり気にしません。実際、ユーザーが生成したコンテンツについてユーザーに何らかの提案をするためにこれを使用するつもりなら、私は非常に躊躇するでしょう。
テキストの読みにくさを測定するより良い方法は、低頻度単語と高頻度単語の比率、および単語の数に関連する可能性が高いでしょう。 ハパックス レゴメナ 本文中。しかし、このようなヒューリスティックを実際に考え出すことは追求しません。なぜなら、このようなものを経験的にテストするのは非常に難しいからです。
他のヒント
PHPのテキストを見てみましょうGitHubの統計のクラスます。
二つのクラスとその使用方法に関する情報を、以下を見てください。それはきっとあなたを助けるでしょう。
可読性音節カウントパターンライブラリクラスます:
<?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!");
?>
私は実際にそのコードに問題が表示されません。あなたが本当に単一カウントループですべての異なる機能を置き換えることにより、したい場合はもちろん、それは少しを最適化することができます。しかし、私は強く、それが必要とさえ完全に間違っていないと主張していると思います。あなたの現在のコードは非常に読みやすく、理解しやすい、そして任意の最適化は、おそらくそのような観点から物事を悪化させるだろう。それがあるとして、それを使用し、それが実際にパフォーマンスのボトルネックであることが判明していない限り、それを最適化しようとしません。