From 46c0d401494d63f2cab681dc69cefab7f7d621df Mon Sep 17 00:00:00 2001 From: EpsIotaPi <1037272365@qq.com> Date: Sun, 28 Jan 2024 17:24:07 +0800 Subject: [PATCH 1/2] Add ReadabilityScorer as the base class of the scorers, and simplified all scorers' structure --- readability/readability.py | 18 +++--- readability/scorers/ari.py | 36 +++--------- readability/scorers/base_scorer.py | 79 +++++++++++++++++++++++++++ readability/scorers/coleman_liau.py | 30 +++------- readability/scorers/dale_chall.py | 30 +++------- readability/scorers/flesch.py | 35 +++--------- readability/scorers/flesch_kincaid.py | 32 +++-------- readability/scorers/gunning_fog.py | 36 +++--------- readability/scorers/linsear_write.py | 32 +++-------- readability/scorers/smog.py | 45 ++++----------- readability/scorers/spache.py | 30 +++------- readability/text/__init__.py | 1 + test/test_readability.py | 30 +++++----- 13 files changed, 178 insertions(+), 256 deletions(-) create mode 100644 readability/scorers/base_scorer.py diff --git a/readability/readability.py b/readability/readability.py index 3a48d42..d6dfc19 100644 --- a/readability/readability.py +++ b/readability/readability.py @@ -15,41 +15,41 @@ def __init__(self, text, min_words=100): def ari(self): """Calculate Automated Readability Index (ARI).""" - return ARI(self._statistics, self._min_words).score() + return ARI(self._statistics, self._min_words).results() def coleman_liau(self): """Calculate Coleman Liau Index.""" - return ColemanLiau(self._statistics, self._min_words).score() + return ColemanLiau(self._statistics, self._min_words).results() def dale_chall(self): """Calculate Dale Chall.""" - return DaleChall(self._statistics, self._min_words).score() + return DaleChall(self._statistics, self._min_words).results() def flesch(self): """Calculate Flesch Reading Ease score.""" - return Flesch(self._statistics, self._min_words).score() + return Flesch(self._statistics, self._min_words).results() def flesch_kincaid(self): """Calculate Flesch-Kincaid Grade Level.""" - return FleschKincaid(self._statistics, self._min_words).score() + return FleschKincaid(self._statistics, self._min_words).results() def gunning_fog(self): """Calculate Gunning Fog score.""" - return GunningFog(self._statistics, self._min_words).score() + return GunningFog(self._statistics, self._min_words).results() def linsear_write(self): """Calculate Linsear Write.""" - return LinsearWrite(self._statistics, self._min_words).score() + return LinsearWrite(self._statistics, self._min_words).results() def smog(self,all_sentences=False, ignore_length=False): """SMOG Index. `all_sentences` indicates whether SMOG should use a sample of 30 sentences, as described in the original paper, or if it should use all sentences in the text""" return Smog(self._statistics, self._analyzer.sentences, - all_sentences=all_sentences, ignore_length=ignore_length).score() + all_sentences=all_sentences).results() def spache(self): """Spache Index.""" - return Spache(self._statistics, self._min_words).score() + return Spache(self._statistics, self._min_words).results() def statistics(self): return { diff --git a/readability/scorers/ari.py b/readability/scorers/ari.py index 0c2baa8..b914963 100644 --- a/readability/scorers/ari.py +++ b/readability/scorers/ari.py @@ -1,39 +1,21 @@ import math -from readability.exceptions import ReadabilityException +from readability.scorers.base_scorer import ReadabilityScorer -class Result: - def __init__(self, score, grade_levels, ages): - self.score = score - self.grade_levels = grade_levels - self.ages = ages - def __str__(self): - return "score: {}, grade_levels: {}, ages: {}". \ - format(self.score, self.grade_levels, self.ages) - - -class ARI: +class ARI(ReadabilityScorer): def __init__(self, stats, min_words=100): - self._stats = stats - if stats.num_words < min_words: - raise ReadabilityException('{} words required.'.format(min_words)) - - def score(self): - score = self._score() - return Result( - score=score, - grade_levels=self._grade_levels(score), - ages=self._ages(score)) + super().__init__(stats, min_words) + self.scorer_name = "ARI" - def _score(self): + def _raw_score(self): s = self._stats letters_per_word = s.num_letters / s.num_words words_per_sent = s.num_words / s.num_sentences return 4.71 * letters_per_word + 0.5 * words_per_sent - 21.43 - def _grade_levels(self, score): - score = math.ceil(score) + def _grade_level(self): + score = math.ceil(self.raw_score) if score <= 1: return ['K'] elif score <= 2: @@ -63,8 +45,8 @@ def _grade_levels(self, score): else: return ['college_graduate'] - def _ages(self, score): - score = math.ceil(score) + def _age(self): + score = math.ceil(self.raw_score) if score <= 1: return [5, 6] elif score <= 2: diff --git a/readability/scorers/base_scorer.py b/readability/scorers/base_scorer.py new file mode 100644 index 0000000..0d005ab --- /dev/null +++ b/readability/scorers/base_scorer.py @@ -0,0 +1,79 @@ +import pandas as pd +from readability.exceptions import ReadabilityException +from readability.text import AnalyzerStatistics + + +class Result: + def __init__(self, scorer_name, raw_score, grade_level, age, scale_value, cloze_score, description): + self.name = scorer_name + + self.raw_score = raw_score + self.grade_level = grade_level + self.age = age + self.scale_value = scale_value + self.cloze_score = cloze_score + self.description = description + + def __str__(self): + if self.name is not None: + result = "{}: ".format(self.name) + else: + result = "" + + if self.raw_score is not None: + if type(self.raw_score) == float: + result += "raw_score = {:.2f}, ".format(self.raw_score) + else: + result += "raw_score = {}, ".format(self.raw_score) + + if self.grade_level is not None: + result += "grade_level = {}, ".format(self.grade_level) + if self.age is not None: + result += "age = {}, ".format(self.age) + if self.scale_value is not None: + result += "scale_value = {:.2f}, ".format(self.scale_value) + if self.cloze_score is not None: + result += "cloze_score = {:.2f}, ".format(self.cloze_score) + if self.description is not None: + result += "{}, ".format(self.description) + + return result[:-2] + + +class ReadabilityScorer: + def __init__(self, stats:AnalyzerStatistics, min_words=100): + if stats.num_words < min_words: + raise ReadabilityException('{} words required.'.format(min_words)) + + self._stats = stats + self.scorer_name = None + + def results(self): + self.raw_score = self._raw_score() + return Result( + scorer_name=self.scorer_name, + raw_score=self.raw_score, + grade_level=self._grade_level(), + age=self._age(), + scale_value=self._scale_value(), + cloze_score=self._cloze_score(), + description=self._description(), + ) + + def _raw_score(self): + return None + + def _grade_level(self): + return None + + def _age(self): + return None + + def _scale_value(self): + return None + + def _cloze_score(self): + return None + + def _description(self): + return None \ No newline at end of file diff --git a/readability/scorers/coleman_liau.py b/readability/scorers/coleman_liau.py index 8283894..5344b03 100644 --- a/readability/scorers/coleman_liau.py +++ b/readability/scorers/coleman_liau.py @@ -1,30 +1,14 @@ -from readability.exceptions import ReadabilityException +from readability.scorers.base_scorer import ReadabilityScorer -class Result: - def __init__(self, score, grade_level): - self.score = score - self.grade_level = grade_level - def __str__(self): - return "score: {}, grade_level: '{}'". \ - format(self.score, self.grade_level) - -class ColemanLiau: +class ColemanLiau(ReadabilityScorer): def __init__(self, stats, min_words=100): - self._stats = stats - if stats.num_words < min_words: - raise ReadabilityException('{} words required.'.format(min_words)) - - def score(self): - score = self._score() - return Result( - score=score, - grade_level=self._grade_level(score) - ) + super().__init__(stats, min_words) + self.scorer_name = 'Coleman-Liau' - def _score(self): + def _raw_score(self): s = self._stats scalar = s.num_words / 100 letters_per_100_words = s.num_letters / scalar @@ -32,5 +16,5 @@ def _score(self): return 0.0588 * letters_per_100_words - \ 0.296 * sentences_per_100_words - 15.8 - def _grade_level(self, score): - return str(round(score)) + def _grade_level(self): + return str(round(self.raw_score)) diff --git a/readability/scorers/dale_chall.py b/readability/scorers/dale_chall.py index 2ca9b15..b7ecb34 100644 --- a/readability/scorers/dale_chall.py +++ b/readability/scorers/dale_chall.py @@ -1,29 +1,12 @@ -from readability.exceptions import ReadabilityException +from readability.scorers.base_scorer import ReadabilityScorer -class Result: - def __init__(self, score, grade_levels): - self.score = score - self.grade_levels = grade_levels - - def __str__(self): - return "score: {}, grade_levels: {}". \ - format(self.score, self.grade_levels) - - -class DaleChall: +class DaleChall(ReadabilityScorer): def __init__(self, stats, min_words=100): - self._stats = stats - if stats.num_words < min_words: - raise ReadabilityException('{} words required.'.format(min_words)) - - def score(self): - score = self._score() - return Result( - score=score, - grade_levels=self._grade_levels(score)) + super().__init__(stats, min_words) + self.scorer_name = "Dale-Chall" - def _score(self): + def _raw_score(self): stats = self._stats words_per_sent = stats.num_words / stats.num_sentences percent_difficult_words = \ @@ -34,7 +17,8 @@ def _score(self): else raw_score return adjusted_score - def _grade_levels(self, score): + def _grade_level(self): + score = self._raw_score() if score <= 4.9: return ['1', '2', '3', '4'] elif score >= 5 and score < 6: diff --git a/readability/scorers/flesch.py b/readability/scorers/flesch.py index 7d35cc0..4746912 100644 --- a/readability/scorers/flesch.py +++ b/readability/scorers/flesch.py @@ -1,37 +1,19 @@ -from readability.exceptions import ReadabilityException +from readability.scorers.base_scorer import ReadabilityScorer -class Result: - def __init__(self, score, grade_levels, ease): - self.score = score - self.ease = ease - self.grade_levels = grade_levels - - def __str__(self): - return "score: {}, ease: '{}', grade_levels: {}". \ - format(self.score, self.ease, self.grade_levels) - - -class Flesch: +class Flesch(ReadabilityScorer): def __init__(self, stats, min_words=100): - self._stats = stats - if stats.num_words < min_words: - raise ReadabilityException('{} words required.'.format(min_words)) - - def score(self): - score = self._score() - return Result( - score=score, - ease=self._ease(score), - grade_levels=self._grade_levels(score)) + super().__init__(stats, min_words) + self.scorer_name = "Flesch" - def _score(self): + def _raw_score(self): stats = self._stats words_per_sent = stats.num_words / stats.num_sentences syllables_per_word = stats.num_syllables / stats.num_words return 206.835 - (1.015 * words_per_sent) - (84.6 * syllables_per_word) - def _ease(self, score): + def _description(self): + score = self.raw_score if score >= 90 and score <= 100: return 'very_easy' elif score >= 80 and score < 90: @@ -47,7 +29,8 @@ def _ease(self, score): else: return 'very_confusing' - def _grade_levels(self, score): + def _grade_level(self): + score = self.raw_score if score >= 90 and score <= 100: return ['5'] elif score >= 80 and score < 90: diff --git a/readability/scorers/flesch_kincaid.py b/readability/scorers/flesch_kincaid.py index 67286c8..0cd5e10 100644 --- a/readability/scorers/flesch_kincaid.py +++ b/readability/scorers/flesch_kincaid.py @@ -1,33 +1,15 @@ -from readability.exceptions import ReadabilityException +from readability.scorers.base_scorer import ReadabilityScorer -class Result: - def __init__(self, score, grade_level): - self.score = score - self.grade_level = grade_level - - def __str__(self): - return "score: {}, grade_level: '{}'". \ - format(self.score, self.grade_level) - - -class FleschKincaid: +class FleschKincaid(ReadabilityScorer): def __init__(self, stats, min_words=100): - self._stats = stats - if stats.num_words < min_words: - raise ReadabilityException('{} words required.'.format(min_words)) - - def score(self): - score = self._score() - return Result( - score=score, - grade_level=self._grade_level(score) - ) + super().__init__(stats, min_words) + self.scorer_name = "Flesh-Kincaid" - def _score(self): + def _raw_score(self): stats = self._stats return (0.38 * stats.avg_words_per_sentence + 11.8 * stats.avg_syllables_per_word) - 15.59 - def _grade_level(self, score): - return str(round(score)) + def _grade_level(self): + return str(round(self.raw_score)) diff --git a/readability/scorers/gunning_fog.py b/readability/scorers/gunning_fog.py index b3109f1..0e18a43 100644 --- a/readability/scorers/gunning_fog.py +++ b/readability/scorers/gunning_fog.py @@ -1,42 +1,24 @@ -from readability.exceptions import ReadabilityException +from readability.scorers.base_scorer import ReadabilityScorer -class Result: - def __init__(self, score, grade_level): - self.score = score - self.grade_level = grade_level - - def __str__(self): - return "score: {}, grade_level: '{}'". \ - format(self.score, self.grade_level) - - -class GunningFog: +class GunningFog(ReadabilityScorer): def __init__(self, stats, min_words=100): - self._stats = stats - if stats.num_words < min_words: - raise ReadabilityException('{} words required.'.format(min_words)) - - def score(self): - score = self._score() - return Result( - score=score, - grade_level=self._grade_level(score) - ) + super().__init__(stats, min_words) + self.scorer_name = "Gunning Fog" - def _score(self): + def _raw_score(self): s = self._stats word_per_sent = s.num_words / s.num_sentences poly_syllables_per_word = s.num_gunning_complex / s.num_words return 0.4 * (word_per_sent + 100 * poly_syllables_per_word) - def _grade_level(self, score): - rounded = round(score) + def _grade_level(self): + rounded = round(self.raw_score) if rounded < 6: return 'na' - elif rounded >= 6 and rounded <= 12: + elif 6 <= rounded <= 12: return str(rounded) - elif rounded >= 13 and rounded <= 16: + elif 13 <= rounded <= 16: return 'college' else: return 'college_graduate' diff --git a/readability/scorers/linsear_write.py b/readability/scorers/linsear_write.py index 98da289..aa3bacc 100644 --- a/readability/scorers/linsear_write.py +++ b/readability/scorers/linsear_write.py @@ -1,30 +1,12 @@ -from readability.exceptions import ReadabilityException +from readability.scorers.base_scorer import ReadabilityScorer -class Result: - def __init__(self, score, grade_level): - self.score = score - self.grade_level = grade_level - - def __str__(self): - return "score: {}, grade_level: '{}'". \ - format(self.score, self.grade_level) - - -class LinsearWrite: +class LinsearWrite(ReadabilityScorer): def __init__(self, stats, min_words=100): - self._stats = stats - if stats.num_words < min_words: - raise ReadabilityException('{} words required.'.format(min_words)) - - def score(self): - score = self._score() - return Result( - score=score, - grade_level=self._grade_level(score) - ) + super().__init__(stats, min_words) + self.scorer_name = "Linsear Write" - def _score(self): + def _raw_score(self): s = self._stats num_easy_words = s.num_words - s.num_poly_syllable_words num_hard_words = s.num_poly_syllable_words @@ -33,5 +15,5 @@ def _score(self): return inter_score / 2 return (inter_score - 2) / 2 - def _grade_level(self, score): - return str(round(score)) + def _grade_level(self): + return str(round(self.raw_score)) diff --git a/readability/scorers/smog.py b/readability/scorers/smog.py index ae73fd4..efc36e3 100644 --- a/readability/scorers/smog.py +++ b/readability/scorers/smog.py @@ -1,51 +1,30 @@ import math -from readability.text.analyzer import Analyzer -from readability.exceptions import ReadabilityException import warnings - -class Result: - def __init__(self, score, grade_level): - self.score = score - self.grade_level = grade_level - - def __str__(self): - return "score: {}, grade_level: {}". \ - format(self.score, self.grade_level) +from readability.text.analyzer import Analyzer +from readability.scorers.base_scorer import ReadabilityScorer -class Smog: - def __init__(self, stats, sentences, all_sentences=False, ignore_length=False): +class Smog(ReadabilityScorer): + def __init__(self, stats, sentences, all_sentences=False): """ Computes the SMOG readability score (Harry McLaughlin, 1969 https://ogg.osu.edu/media/documents/health_lit/WRRSMOG_Readability_Formula_G._Harry_McLaughlin__1969_.pdf) If all_sentences is false, computes the score as described in McLaughlin, 1969, using exactly 30 sentences If all_sentences is true, adjusts the score to use all sentences in the text """ if stats.num_sentences < 30: - if not ignore_length: - raise ReadabilityException( - 'SMOG requires 30 sentences. {} found' - .format(stats.num_sentences)) - else: - warnings.warn( - 'SMOG requires 30 sentences. {} found' - .format(stats.num_sentences)) + warnings.warn( + 'SMOG requires 30 sentences. {} found' + .format(stats.num_sentences)) + super().__init__(stats, 0) - self._stats = stats self.all_sentences = all_sentences if not self.all_sentences: self._smog_stats = self._smog_text_stats(sentences) - - def score(self): - score = self._score() - grade_level = self._grade_level(score) - return Result( - score=score, - grade_level=grade_level - ) + self.scorer_name = "SMOG" - def _score(self): + def _raw_score(self): if self.all_sentences: smog_stats = self._stats num_sentences = smog_stats.num_sentences @@ -56,8 +35,8 @@ def _score(self): num_complex_words = smog_stats.num_poly_syllable_words return 1.0430 * math.sqrt(30 * num_complex_words / num_sentences) + 3.1291 - def _grade_level(self, score): - return str(round(score)) + def _grade_level(self): + return str(round(self.raw_score)) def _smog_text_stats(self, sentences): mid = int(math.floor(len(sentences) / 2)) diff --git a/readability/scorers/spache.py b/readability/scorers/spache.py index 18b8f78..a884cbb 100644 --- a/readability/scorers/spache.py +++ b/readability/scorers/spache.py @@ -1,29 +1,13 @@ -from readability.exceptions import ReadabilityException +from readability.scorers.base_scorer import ReadabilityScorer -class Result: - def __init__(self, score, grade_level): - self.score = score - self.grade_level = grade_level - def __str__(self): - return "score: {}, grade_level: '{}'". \ - format(self.score, self.grade_level) - - -class Spache: +class Spache(ReadabilityScorer): def __init__(self, stats, min_words=100): - self._stats = stats - if stats.num_words < min_words: - raise ReadabilityException('{} words required.'.format(min_words)) - - def score(self): - score = self._score() - return Result( - score=score, - grade_level=self._grade_level(score)) + super().__init__(stats, min_words) + self.scorer_name = "Spache" - def _score(self): + def _raw_score(self): stats = self._stats avg_sentence_len = stats.num_words / stats.num_sentences percent_difficult_words = \ @@ -31,5 +15,5 @@ def _score(self): return (0.141 * avg_sentence_len) + (0.086 * percent_difficult_words) + 0.839 - def _grade_level(self, score): - return str(round(score)) + def _grade_level(self): + return str(round(self.raw_score)) diff --git a/readability/text/__init__.py b/readability/text/__init__.py index 263d485..516d0f4 100644 --- a/readability/text/__init__.py +++ b/readability/text/__init__.py @@ -1 +1,2 @@ from .analyzer import Analyzer +from .analyzer import AnalyzerStatistics diff --git a/test/test_readability.py b/test/test_readability.py index 46e0d1b..9b5657a 100644 --- a/test/test_readability.py +++ b/test/test_readability.py @@ -13,45 +13,45 @@ def setUp(self): def test_ari(self): r = self.readability.ari() print(r) - self.assertEqual(9.551245421245422, r.score) - self.assertEqual(['10'], r.grade_levels) - self.assertEqual([15, 16], r.ages) + self.assertEqual(9.551245421245422, r.raw_score) + self.assertEqual(['10'], r.grade_level) + self.assertEqual([15, 16], r.age) def test_coleman_liau(self): r = self.readability.coleman_liau() print(r) - self.assertEqual(10.673162393162393, r.score) + self.assertEqual(10.673162393162393, r.raw_score) self.assertEqual('11', r.grade_level) def test_dale_chall(self): r = self.readability.dale_chall() print(r) - self.assertEqual(9.32399010989011, r.score) - self.assertEqual(['college'], r.grade_levels) + self.assertEqual(9.32399010989011, r.raw_score) + self.assertEqual(['college'], r.grade_level) def test_flesch(self): r = self.readability.flesch() print(r) - self.assertEqual(51.039230769230784, r.score) - self.assertEqual(['10', '11', '12'], r.grade_levels) - self.assertEqual('fairly_difficult', r.ease) + self.assertEqual(51.039230769230784, r.raw_score) + self.assertEqual(['10', '11', '12'], r.grade_level) + self.assertEqual('fairly_difficult', r.description) def test_flesch_kincaid(self): r = self.readability.flesch_kincaid() print(r) - self.assertEqual(10.125531135531137, r.score) + self.assertEqual(10.125531135531137, r.raw_score) self.assertEqual('10', r.grade_level) def test_gunning_fog(self): r = self.readability.gunning_fog() print(r) - self.assertEqual(12.4976800976801, r.score) + self.assertEqual(12.4976800976801, r.raw_score) self.assertEqual('12', r.grade_level) def test_linsear_write(self): r = self.readability.linsear_write() print(r) - self.assertEqual(11.214285714285714, r.score) + self.assertEqual(11.214285714285714, r.raw_score) self.assertEqual('11', r.grade_level) def test_smog(self): @@ -71,17 +71,17 @@ def test_smog(self): print("all_sentences=False: %s ; all_sentences=True: %s" % (r1,r2)) - self.assertEqual(12.516099999999998, r1.score) + self.assertEqual(12.516099999999998, r1.raw_score) self.assertEqual('13', r1.grade_level) - self.assertEqual(12.785403640627713, r2.score) + self.assertEqual(12.785403640627713, r2.raw_score) self.assertEqual('13', r2.grade_level) def test_spache(self): r = self.readability.spache() print(r) - self.assertEqual(7.164945054945054, r.score) + self.assertEqual(7.164945054945054, r.raw_score) self.assertEqual('7', r.grade_level) def test_print_stats(self): From 9c52170627843cfaddb1a5c31b3d1689c4793f4a Mon Sep 17 00:00:00 2001 From: EpsIotaPi <1037272365@qq.com> Date: Sat, 17 Feb 2024 16:41:47 +0800 Subject: [PATCH 2/2] Change raw_score to score for backward compatibility --- .gitignore | 3 ++- readability/scorers/ari.py | 4 ++-- readability/scorers/base_scorer.py | 21 ++++++++++----------- readability/scorers/coleman_liau.py | 2 +- readability/scorers/dale_chall.py | 2 +- readability/scorers/flesch.py | 4 ++-- readability/scorers/flesch_kincaid.py | 2 +- readability/scorers/gunning_fog.py | 2 +- readability/scorers/linsear_write.py | 2 +- readability/scorers/smog.py | 2 +- readability/scorers/spache.py | 2 +- test/test_readability.py | 20 ++++++++++---------- 12 files changed, 33 insertions(+), 33 deletions(-) diff --git a/.gitignore b/.gitignore index c65a17d..1f4259e 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,5 @@ __pycache__ .vscode py_readability_metrics.egg-info dist -build \ No newline at end of file +build +*.rsp \ No newline at end of file diff --git a/readability/scorers/ari.py b/readability/scorers/ari.py index b914963..a6004eb 100644 --- a/readability/scorers/ari.py +++ b/readability/scorers/ari.py @@ -15,7 +15,7 @@ def _raw_score(self): return 4.71 * letters_per_word + 0.5 * words_per_sent - 21.43 def _grade_level(self): - score = math.ceil(self.raw_score) + score = math.ceil(self._score) if score <= 1: return ['K'] elif score <= 2: @@ -46,7 +46,7 @@ def _grade_level(self): return ['college_graduate'] def _age(self): - score = math.ceil(self.raw_score) + score = math.ceil(self._score) if score <= 1: return [5, 6] elif score <= 2: diff --git a/readability/scorers/base_scorer.py b/readability/scorers/base_scorer.py index 0d005ab..966c952 100644 --- a/readability/scorers/base_scorer.py +++ b/readability/scorers/base_scorer.py @@ -1,13 +1,12 @@ -import pandas as pd from readability.exceptions import ReadabilityException from readability.text import AnalyzerStatistics class Result: - def __init__(self, scorer_name, raw_score, grade_level, age, scale_value, cloze_score, description): + def __init__(self, scorer_name, score, grade_level, age, scale_value, cloze_score, description): self.name = scorer_name - self.raw_score = raw_score + self.score = score self.grade_level = grade_level self.age = age self.scale_value = scale_value @@ -20,11 +19,11 @@ def __str__(self): else: result = "" - if self.raw_score is not None: - if type(self.raw_score) == float: - result += "raw_score = {:.2f}, ".format(self.raw_score) + if self.score is not None: + if isinstance(self.score, float): + result += "score = {:.2f}, ".format(self.score) else: - result += "raw_score = {}, ".format(self.raw_score) + result += "score = {}, ".format(self.score) if self.grade_level is not None: result += "grade_level = {}, ".format(self.grade_level) @@ -41,7 +40,7 @@ def __str__(self): class ReadabilityScorer: - def __init__(self, stats:AnalyzerStatistics, min_words=100): + def __init__(self, stats: AnalyzerStatistics, min_words=100): if stats.num_words < min_words: raise ReadabilityException('{} words required.'.format(min_words)) @@ -49,10 +48,10 @@ def __init__(self, stats:AnalyzerStatistics, min_words=100): self.scorer_name = None def results(self): - self.raw_score = self._raw_score() + self._score = self._raw_score() return Result( scorer_name=self.scorer_name, - raw_score=self.raw_score, + score=self._score, grade_level=self._grade_level(), age=self._age(), scale_value=self._scale_value(), @@ -76,4 +75,4 @@ def _cloze_score(self): return None def _description(self): - return None \ No newline at end of file + return None diff --git a/readability/scorers/coleman_liau.py b/readability/scorers/coleman_liau.py index 5344b03..cf82a56 100644 --- a/readability/scorers/coleman_liau.py +++ b/readability/scorers/coleman_liau.py @@ -17,4 +17,4 @@ def _raw_score(self): 0.296 * sentences_per_100_words - 15.8 def _grade_level(self): - return str(round(self.raw_score)) + return str(round(self._score)) diff --git a/readability/scorers/dale_chall.py b/readability/scorers/dale_chall.py index b7ecb34..f70809d 100644 --- a/readability/scorers/dale_chall.py +++ b/readability/scorers/dale_chall.py @@ -18,7 +18,7 @@ def _raw_score(self): return adjusted_score def _grade_level(self): - score = self._raw_score() + score = self._score if score <= 4.9: return ['1', '2', '3', '4'] elif score >= 5 and score < 6: diff --git a/readability/scorers/flesch.py b/readability/scorers/flesch.py index 4746912..6a83ddc 100644 --- a/readability/scorers/flesch.py +++ b/readability/scorers/flesch.py @@ -13,7 +13,7 @@ def _raw_score(self): return 206.835 - (1.015 * words_per_sent) - (84.6 * syllables_per_word) def _description(self): - score = self.raw_score + score = self._score if score >= 90 and score <= 100: return 'very_easy' elif score >= 80 and score < 90: @@ -30,7 +30,7 @@ def _description(self): return 'very_confusing' def _grade_level(self): - score = self.raw_score + score = self._score if score >= 90 and score <= 100: return ['5'] elif score >= 80 and score < 90: diff --git a/readability/scorers/flesch_kincaid.py b/readability/scorers/flesch_kincaid.py index 0cd5e10..94edd7b 100644 --- a/readability/scorers/flesch_kincaid.py +++ b/readability/scorers/flesch_kincaid.py @@ -12,4 +12,4 @@ def _raw_score(self): 11.8 * stats.avg_syllables_per_word) - 15.59 def _grade_level(self): - return str(round(self.raw_score)) + return str(round(self._score)) diff --git a/readability/scorers/gunning_fog.py b/readability/scorers/gunning_fog.py index 0e18a43..8f8037e 100644 --- a/readability/scorers/gunning_fog.py +++ b/readability/scorers/gunning_fog.py @@ -13,7 +13,7 @@ def _raw_score(self): return 0.4 * (word_per_sent + 100 * poly_syllables_per_word) def _grade_level(self): - rounded = round(self.raw_score) + rounded = round(self._score) if rounded < 6: return 'na' elif 6 <= rounded <= 12: diff --git a/readability/scorers/linsear_write.py b/readability/scorers/linsear_write.py index aa3bacc..0dc46cf 100644 --- a/readability/scorers/linsear_write.py +++ b/readability/scorers/linsear_write.py @@ -16,4 +16,4 @@ def _raw_score(self): return (inter_score - 2) / 2 def _grade_level(self): - return str(round(self.raw_score)) + return str(round(self._score)) diff --git a/readability/scorers/smog.py b/readability/scorers/smog.py index efc36e3..2e662a2 100644 --- a/readability/scorers/smog.py +++ b/readability/scorers/smog.py @@ -36,7 +36,7 @@ def _raw_score(self): return 1.0430 * math.sqrt(30 * num_complex_words / num_sentences) + 3.1291 def _grade_level(self): - return str(round(self.raw_score)) + return str(round(self._score)) def _smog_text_stats(self, sentences): mid = int(math.floor(len(sentences) / 2)) diff --git a/readability/scorers/spache.py b/readability/scorers/spache.py index a884cbb..d2a8169 100644 --- a/readability/scorers/spache.py +++ b/readability/scorers/spache.py @@ -16,4 +16,4 @@ def _raw_score(self): return (0.141 * avg_sentence_len) + (0.086 * percent_difficult_words) + 0.839 def _grade_level(self): - return str(round(self.raw_score)) + return str(round(self._score)) diff --git a/test/test_readability.py b/test/test_readability.py index 9b5657a..152e317 100644 --- a/test/test_readability.py +++ b/test/test_readability.py @@ -13,45 +13,45 @@ def setUp(self): def test_ari(self): r = self.readability.ari() print(r) - self.assertEqual(9.551245421245422, r.raw_score) + self.assertEqual(9.551245421245422, r.score) self.assertEqual(['10'], r.grade_level) self.assertEqual([15, 16], r.age) def test_coleman_liau(self): r = self.readability.coleman_liau() print(r) - self.assertEqual(10.673162393162393, r.raw_score) + self.assertEqual(10.673162393162393, r.score) self.assertEqual('11', r.grade_level) def test_dale_chall(self): r = self.readability.dale_chall() print(r) - self.assertEqual(9.32399010989011, r.raw_score) + self.assertEqual(9.32399010989011, r.score) self.assertEqual(['college'], r.grade_level) def test_flesch(self): r = self.readability.flesch() print(r) - self.assertEqual(51.039230769230784, r.raw_score) + self.assertEqual(51.039230769230784, r.score) self.assertEqual(['10', '11', '12'], r.grade_level) self.assertEqual('fairly_difficult', r.description) def test_flesch_kincaid(self): r = self.readability.flesch_kincaid() print(r) - self.assertEqual(10.125531135531137, r.raw_score) + self.assertEqual(10.125531135531137, r.score) self.assertEqual('10', r.grade_level) def test_gunning_fog(self): r = self.readability.gunning_fog() print(r) - self.assertEqual(12.4976800976801, r.raw_score) + self.assertEqual(12.4976800976801, r.score) self.assertEqual('12', r.grade_level) def test_linsear_write(self): r = self.readability.linsear_write() print(r) - self.assertEqual(11.214285714285714, r.raw_score) + self.assertEqual(11.214285714285714, r.score) self.assertEqual('11', r.grade_level) def test_smog(self): @@ -71,17 +71,17 @@ def test_smog(self): print("all_sentences=False: %s ; all_sentences=True: %s" % (r1,r2)) - self.assertEqual(12.516099999999998, r1.raw_score) + self.assertEqual(12.516099999999998, r1.score) self.assertEqual('13', r1.grade_level) - self.assertEqual(12.785403640627713, r2.raw_score) + self.assertEqual(12.785403640627713, r2.score) self.assertEqual('13', r2.grade_level) def test_spache(self): r = self.readability.spache() print(r) - self.assertEqual(7.164945054945054, r.raw_score) + self.assertEqual(7.164945054945054, r.score) self.assertEqual('7', r.grade_level) def test_print_stats(self):