MLEnrichmentOperator
Computes 30 text quality and statistical features for document content. Short name: ml_enrichment · Category: Quality
Overview
The MLEnrichmentOperator analyses the text of each document and adds 30 feature columns covering word counts, character ratios, paragraph duplication, and n-gram frequency metrics. Use it before SQLFilterOperator to filter documents based on statistical quality signals, or to enrich your dataset with features for downstream ML pipelines.
Key Features
- 30 features computed in a single pass
- All features are filterable in
SQLFilterOperator - Configurable output column prefix to avoid name collisions
- Language-aware tokenisation via an input language column
- Covers basic counts, ratio metrics, paragraph duplication, and n-gram statistics
Operator Configuration
{
"name": "ml_enrichment",
"type": "ml_enrichment",
"depends_on": ["detect_language"],
"config": {
"lang_column": "lang_name", // optional, default "lang_name"
"output_column_prefix": "" // optional, default ""
}
}
Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
lang_column |
string |
No | "lang_name" |
Column containing the ISO 639-1 language code for language-aware tokenisation. |
output_column_prefix |
string |
No | "" |
Prefix applied to all output column names (e.g. "ml_" → ml_num_words). Useful when running multiple enrichment passes. |
Output Columns
All 30 columns are added to the PyArrow table. Column names gain the output_column_prefix if set.
| Column | Type | Description |
|---|---|---|
num_newlines |
int |
Number of newline characters |
num_paragraphs |
int |
Number of paragraphs |
num_words |
int |
Total word count |
num_chars |
int |
Total character count |
total_non_newline_chars |
int |
Characters excluding newlines |
avg_word_length |
float |
Average word length in characters |
avg_paragraph_length_chars |
float |
Average paragraph length in characters |
avg_paragraph_length_words |
float |
Average paragraph length in words |
alphanumeric_char_ratio |
float |
Ratio of alphanumeric characters (0.0–1.0) |
control_char_ratio |
float |
Ratio of control characters (0.0–1.0) |
punctuation_char_ratio |
float |
Ratio of punctuation characters (0.0–1.0) |
other_symbol_char_ratio |
float |
Ratio of other symbol characters (0.0–1.0) |
tabs_word_ratio |
float |
Ratio of tab characters to words |
hashes_word_ratio |
float |
Ratio of # characters to words |
ellipsis_ratio |
float |
Ratio of ellipsis characters |
bulletpoint_ratio |
float |
Ratio of bullet point characters |
dup_paragraphs_ratio |
float |
Ratio of duplicate paragraphs |
dup_paragraphs_char_ratio |
float |
Character ratio in duplicate paragraphs |
top_2_gram_char_ratio |
float |
Character ratio of most frequent 2-gram |
top_3_gram_char_ratio |
float |
Character ratio of most frequent 3-gram |
top_4_gram_char_ratio |
float |
Character ratio of most frequent 4-gram |
dup_5_gram_char_ratio |
float |
Character ratio of duplicate 5-grams |
dup_6_gram_char_ratio |
float |
Character ratio of duplicate 6-grams |
dup_7_gram_char_ratio |
float |
Character ratio of duplicate 7-grams |
dup_8_gram_char_ratio |
float |
Character ratio of duplicate 8-grams |
dup_9_gram_char_ratio |
float |
Character ratio of duplicate 9-grams |
dup_10_gram_char_ratio |
float |
Character ratio of duplicate 10-grams |
(30 columns total; 3 additional columns are computed internally and not listed here)
Examples
Example 1: Enrich and filter on word count
{
"flow": [
{
"name": "enrich",
"type": "ml_enrichment",
"depends_on": ["detect_language"],
"config": { "lang_column": "lang_name" }
},
{
"name": "filter",
"type": "sql_filter",
"depends_on": ["enrich"],
"config": {
"criteria_list": [
"num_words >= 100",
"dup_paragraphs_ratio < 0.3",
"alphanumeric_char_ratio >= 0.7"
]
}
}
]
}
Example 2: Use a column prefix to avoid conflicts
{
"name": "ml_enrichment",
"type": "ml_enrichment",
"depends_on": ["detect_language"],
"config": {
"lang_column": "lang_name",
"output_column_prefix": "ml_"
}
}
Troubleshooting
lang_column column not found — ensure LanguageDetectionOperator ran before MLEnrichmentOperator, or set lang_column to match the actual column name in your table.
All ratio columns are 0.0 — the content column is empty. Ensure ExtractOperator produced text content before this operator runs.
Column name conflicts — set output_column_prefix to a unique prefix (e.g. "ml_") to avoid collisions with columns from other operators.
Sample Flow
See sample_flows/advanced/quality_branching_merge_pipeline.json for a complete example that includes ML text enrichment.