ReadabilityOperator

Computes text readability scores for document content using established readability formulas. Short name: readability · Category: Quality

Overview

The ReadabilityOperator applies up to 13 readability formulas to the text content of each document and adds a score column for each selected formula. Use it before SQLFilterOperator to filter out documents that are too complex or too simple for your target audience, or to enrich your dataset with reading-level metadata for downstream analysis.

Key Features

  • 13 established readability formulas including Flesch, Gunning Fog, SMOG, Coleman-Liau, and more
  • Select any subset of scores to compute — no need to run all 13
  • Each score is added as a separate filterable column
  • Supports grade-level, complexity, and reading-time metrics
  • Works on any text content column

Operator Configuration

{
  "name": "compute_readability",
  "type": "readability",
  "depends_on": ["extract"],
  "config": {
    "readability_score_list": [
      "flesch_ease",       // 0–100, higher = easier
      "flesch_kincaid",    // US grade level
      "gunning_fog"        // grade level based on complex words
    ]
  }
}

Parameters

Parameter Type Required Default Description
readability_score_list list[string] Yes All 13 scores Names of readability formulas to compute. See score reference below.

Available score names:

Score name Output type Description
flesch_ease float 0–100 scale; higher = easier to read
flesch_kincaid float US grade level
gunning_fog float Grade level based on long sentences and hard words
smog_index float Grade level from polysyllabic word count
coleman_liau_index float Grade level using letter counts
automated_readability_index float Grade level using character/word ratios
dale_chall_readability_score float Grade level from uncommon word frequency
difficult_words int Count of uncommon words
linsear_write_formula float Grade level for technical writing
text_standard float Consensus grade level from multiple formulas
spache_readability float Grade level for primary school texts (grades 1–4)
mcalpine_eflaw float Readability metric for ESL/EFL learners
reading_time float Estimated reading time in seconds

Output Columns

Each score in readability_score_list produces one output column named <score_name>_textstat.

Column Type Description
flesch_ease_textstat float Flesch Reading Ease score (if selected)
flesch_kincaid_textstat float Flesch-Kincaid grade level (if selected)
gunning_fog_textstat float Gunning Fog index (if selected)
<score_name>_textstat float or int Any other selected score

Examples

Example 1: Grade-level filter pipeline

{
  "flow_name": "Readability Filter",
  "flow": [
    {
      "name": "ingest", "type": "ingest_source",
      "config": { "provider": "filesystem", "connection_params": {"paths": ["./documents"]} }
    },
    {
      "name": "extract", "type": "extract_operator",
      "depends_on": ["ingest"],
      "config": {
        "text_extraction": { "provider": "docling_library" },
        "entity_extraction": { "provider": "none" }
      }
    },
    {
      "name": "readability", "type": "readability",
      "depends_on": ["extract"],
      "config": {
        "readability_score_list": ["flesch_ease", "flesch_kincaid"]
      }
    },
    {
      "name": "filter", "type": "sql_filter",
      "depends_on": ["readability"],
      "config": {
        "criteria_list": [
          "flesch_ease_textstat >= 60",
          "flesch_kincaid_textstat <= 10"
        ]
      }
    }
  ]
}

Example 2: Compute all 13 scores

{
  "name": "full_readability",
  "type": "readability",
  "depends_on": ["extract"],
  "config": {
    "readability_score_list": [
      "flesch_ease", "flesch_kincaid", "gunning_fog", "smog_index",
      "coleman_liau_index", "automated_readability_index",
      "dale_chall_readability_score", "difficult_words",
      "linsear_write_formula", "text_standard",
      "spache_readability", "mcalpine_eflaw", "reading_time"
    ]
  }
}

Troubleshooting

readability_score_list is empty or missing — the operator requires at least one score name. Provide a list with one or more valid score names from the table above.

Invalid score name — use the exact names from the score reference table. Names are case-sensitive.

All scores are 0.0 or NaN — the content column is empty or the text is too short (fewer than ~30 words). Readability formulas are unreliable on very short texts.

Sample Flow

See sample_flows/advanced/quality_branching_merge_pipeline.json for a complete example using readability scoring in a quality-filtered pipeline.