ste100-checker
Rule-based ASD-STE100 (Simplified Technical English) compliance checker for procedural and descriptive technical text. It analyzes files with spaCy and reports writing-rule violations together with approved-alternative suggestions.
STE is a controlled natural language: a restricted vocabulary, one meaning per word, short simple sentences. No public labeled STE corpus exists, so all compliance logic is rule-based on top of spaCy's statistical tokenizer, POS tagger, dependency parser, and lemmatizer.
Features
- Ten automatable STE rules: vocabulary, part of speech, spelling, noun clusters, verb tense, passive voice, sentence length, semicolons, phrasal verbs
- Approved-alternative suggestion with every violation
- Text output for humans, JSON output for pipelines
- Curated, extensible JSON dictionary (approved, unapproved, technical)
Installation
Requires Python 3.11+.
pip install ste100-checker
python -m spacy download en_core_web_sm
For development, install from a source checkout:
python -m venv .venv && source .venv/bin/activate
pip install -e ".[dev]"
python -m spacy download en_core_web_sm
Usage
ste100 <file.txt> [--format text|json]
| Option | Alias | Description | Default |
|---|---|---|---|
path |
Text file to check | required | |
--format |
-f |
Output format: text or json |
text |
--help |
Show help and exit |
Text output:
$ ste100 src/samples/non_compliant.txt
Words: 45
Sentences: 3
Violations: 20
1. [1.1] "Utilize" is not an approved word (57-64)
suggestion: use
2. [1.1] "colour" is not in the approved or technical dictionary (69-75)
...
JSON output:
{
"words": 45,
"sentences": 3,
"total": 20,
"violations": [
{
"rule": "1.1",
"start": 57,
"end": 64,
"text": "Utilize",
"message": "\"Utilize\" is not an approved word",
"suggestion": "use"
}
]
}
Each violation carries the rule id, character offsets into the source text,
the offending span, a message, and an approved alternative when one exists.
Exit status is 0 whether or not violations are found; parse the JSON and
branch on total if you need a nonzero signal.
Rule coverage
| STE rule | Check | spaCy technique |
|---|---|---|
| 1.1 | Unapproved or unknown word (with approved alternative) | dictionary lookup on token.lower_ / lemma |
| 1.2 | Approved word used with wrong part of speech | compare token.pos_ to dictionary POS |
| 1.14 | British spelling (-ise, colour, centre) |
regex + replacement map |
| 2.1 | Noun cluster with more than 3 nouns | consecutive NOUN/PROPN runs |
| 3.2 / 3.4 | Complex tenses (perfect, progressive, modal + be + VBN, "is to be + VBN") | Matcher on LEMMA / TAG |
| 3.5 | -ing form used as a verb |
VBG that is ROOT/conj |
| 3.6 | Passive voice | nsubjpass -> auxpass -> VBN |
| 5.1 | Sentence longer than 20 words | doc.sents + token count |
| 8.1 | Semicolon usage | token text ; |
| 9.3 | Phrasal verbs (curated) | phrase list on lemma |
Non-automatable rules (approved meanings, topic sentences, comprehension) are documented as out of scope; checkers are aids, not proofs.
Extending the dictionary
src/data/ holds the vocabulary as JSON. technical.json stores the domain words
you add under rules 1.5 / 1.12:
{
"nouns": ["actuator", "alternator", "antenna", "duct", "nozzle", "piston"],
"verbs": ["bond", "drill", "weld"]
}
Append your own terms and rules 1.1 and 1.2 accept them automatically.
approved.json maps approved words to their one allowed part of speech;
unapproved.json maps unapproved words to their approved alternatives.
Evaluation
src/samples/eval.json is a 16-sentence annotated suite. Run the harness:
python -m src.evaluate
Current results: precision 0.941, recall 1.000, F1 0.970 (one false
positive: rule 1.1 flags generator, a legitimate technical noun absent from
the small curated dictionary). For context, Boeing BSEC reports 79%/89% and
SECC 87%/93% on their much larger suites.
Development
ruff check .
ruff format --check .
python -m pytest
Project layout
├─ src/ package root: dictionary, pipeline, engine, rules, report, cli, evaluate
├─ src/data/ curated approved / unapproved / technical dictionaries
├─ src/rules/ one module per rule family
├─ src/samples/ compliant / non-compliant examples + annotated eval suite
├─ tests/ per-rule unit tests and CLI/eval tests
├─ case-study/ college case-study report (Typst)
└─ .github/ CI and release workflows
License
MIT. See LICENSE.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file ste100_checker-0.1.1.tar.gz.
File metadata
- Download URL: ste100_checker-0.1.1.tar.gz
- Upload date:
- Size: 22.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f44daa5ee3b03d754fcc9d86f1323de5e6e6496084b8d446a9e2dcf89bfc8fe1
|
|
| MD5 |
1a520c5330502182c18b0803681cd1be
|
|
| BLAKE2b-256 |
5d6ce5f5f548215cd8447231428dd5d4f824d7fc8560b4d37cb1861ca93dfc8f
|
Provenance
The following attestation bundles were made for ste100_checker-0.1.1.tar.gz:
Publisher:
release.yml on swarooppatilx/ste100
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
ste100_checker-0.1.1.tar.gz -
Subject digest:
f44daa5ee3b03d754fcc9d86f1323de5e6e6496084b8d446a9e2dcf89bfc8fe1 - Sigstore transparency entry: 2399036613
- Sigstore integration time:
-
Permalink:
swarooppatilx/ste100@6bbed1e639411ea10df9aa3f0ca166289102ba7b -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/swarooppatilx
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@6bbed1e639411ea10df9aa3f0ca166289102ba7b -
Trigger Event:
push
-
Statement type:
File details
Details for the file ste100_checker-0.1.1-py3-none-any.whl.
File metadata
- Download URL: ste100_checker-0.1.1-py3-none-any.whl
- Upload date:
- Size: 21.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9494a269ecf19882e70a71e61d32fc7d77fc6e248164e98c4e38f82f2b867b37
|
|
| MD5 |
7971f58d4e78eb91ad75d4d012578db0
|
|
| BLAKE2b-256 |
09adb1c65876733db16db2aa998be5980ef927da50afe856f03bf3b169faf820
|
Provenance
The following attestation bundles were made for ste100_checker-0.1.1-py3-none-any.whl:
Publisher:
release.yml on swarooppatilx/ste100
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
ste100_checker-0.1.1-py3-none-any.whl -
Subject digest:
9494a269ecf19882e70a71e61d32fc7d77fc6e248164e98c4e38f82f2b867b37 - Sigstore transparency entry: 2399036736
- Sigstore integration time:
-
Permalink:
swarooppatilx/ste100@6bbed1e639411ea10df9aa3f0ca166289102ba7b -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/swarooppatilx
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@6bbed1e639411ea10df9aa3f0ca166289102ba7b -
Trigger Event:
push
-
Statement type: