Skip to main content

ste100-checker

PyPI version CI

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.

Metadata

Release files for ste100-checker 0.1.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for ste100-checker 0.1.1
File Size Uploaded
ste100_checker-0.1.1.tar.gz 22.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for ste100-checker 0.1.1
File Interpreter ABI Platform
ste100_checker-0.1.1-py3-none-any.whl Python 3 none any Details

Total release size: 43.4 kB

Release files / ste100_checker-0.1.1.tar.gz

Download URL ste100_checker-0.1.1.tar.gz
Size 22.4 kB
Tags Source
SHA-256 checksum
How to use checksums
f44daa5ee3b03d754fcc9d86f1323de5e6e6496084b8d446a9e2dcf89bfc8fe1
BLAKE2b-256 checksum
How to use checksums
5d6ce5f5f548215cd8447231428dd5d4f824d7fc8560b4d37cb1861ca93dfc8f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 9, 2026.

Transparency log

Release files / ste100_checker-0.1.1-py3-none-any.whl

Download URL ste100_checker-0.1.1-py3-none-any.whl
Size 21.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
9494a269ecf19882e70a71e61d32fc7d77fc6e248164e98c4e38f82f2b867b37
BLAKE2b-256 checksum
How to use checksums
09adb1c65876733db16db2aa998be5980ef927da50afe856f03bf3b169faf820
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 9, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.1.1 This release

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page