Checks grammar using LanguageTool.
Project description
language_tool_python: Python wrapper for LanguageTool
language_tool_python is a Python interface/wrapper to LanguageTool, an open-source grammar, style, and spell checker.
It can:
- run a local LanguageTool Java server,
- call LanguageTool public API,
- call your own remote LanguageTool server,
- be used from Python code and from a CLI.
Default local download target: latest snapshot (currently 6.8-SNAPSHOT).
Documentation
- Docs: https://language-tool-python.readthedocs.io/en/latest/
- Changelog: CHANGELOG.md
- Contributing: CONTRIBUTING.md
Requirements
- Python
>=3.9(tested up to 3.14) - Java (to run local LanguageTool server):
- LanguageTool
< 6.6: Java>=9 - LanguageTool
>= 6.6(default): Java>=17
- LanguageTool
Installation
pip install --upgrade language_tool_python
Quick Start
Local server
import language_tool_python
with language_tool_python.LanguageTool("en-US") as tool:
text = "A sentence with a error in the Hitchhiker's Guide tot he Galaxy"
matches = tool.check(text)
print(matches)
print(tool.correct(text))
Public LanguageTool API
import language_tool_python
with language_tool_python.LanguageToolPublicAPI("es") as tool:
matches = tool.check("Se a hecho un esfuerzo.")
print(matches)
Your own remote LanguageTool server
import language_tool_python
with language_tool_python.LanguageTool(
"en-US",
remote_server="https://your-lt-server.example.com",
) as tool:
print(tool.check("This are bad."))
Constructor Parameters Worth Knowing
language_tool_download_version (local server only)
Use this parameter to force which LanguageTool package is used when running a local server.
import language_tool_python
with language_tool_python.LanguageTool(
"en-US",
language_tool_download_version="6.7",
) as tool:
print(tool.check("This are bad."))
Accepted formats:
latest(default): latest snapshot configured by this package (6.8-SNAPSHOTat the moment)YYYYMMDD: snapshot by date (example:20260201)X.Y: release version (example:6.7,4.0)
Notes:
- Only relevant when using a local server (no
remote_server). - Versions below
4.0are not supported.
proxies (remote server only)
Use this parameter to pass proxy settings to requests when calling a remote LanguageTool server.
import language_tool_python
with language_tool_python.LanguageTool(
"en-US",
remote_server="https://your-lt-server.example.com",
proxies={
"http": "http://proxy.example.com:8080",
"https": "http://proxy.example.com:8080",
},
) as tool:
print(tool.check("This are bad."))
Notes:
proxiesworks only withremote_server.- Passing
proxieswithoutremote_serverraisesValueError.
Core Python API
Check text
matches = tool.check("This is noot okay.")
Each item is a Match object with these fields:
rule_idmessagereplacementsoffset_in_context,context,offset,error_lengthcategory,rule_issue_typesentence
Auto-correct
corrected = tool.correct("This is noot okay.")
# Uses first suggestion for each match
Apply only selected matches
text = "There is a bok on the table."
matches = tool.check(text)
# Keep a specific suggestion for first match
matches[0].select_replacement(2)
patched = language_tool_python.utils.correct(text, matches)
Check only parts matching a regex
matches = tool.check_matching_regions(
'He said "I has a problem" but she replied "It are fine".',
r'"[^"]*"',
)
Classify result quality
from language_tool_python.utils import classify_matches
status = classify_matches(tool.check("This is a cats."))
# TextStatus.CORRECT / TextStatus.FAULTY / TextStatus.GARBAGE
Rule and Language Controls
You can tune checks per instance:
tool.language = "en" # Can also be set from constructor (`LanguageTool("en")`)
tool.mother_tongue = "fr" # Can also be set from constructor (`LanguageTool("en", mother_tongue="fr")`)
tool.disabled_rules.update({"MORFOLOGIK_RULE_EN_US"})
tool.enabled_rules.update({"EN_A_VS_AN"})
tool.enabled_rules_only = False
tool.disabled_categories.update({"CASING"})
tool.enabled_categories.update({"GRAMMAR"})
tool.preferred_variants.update({"en-GB"})
tool.picky = True
Spellchecking control:
tool.disable_spellchecking()
tool.enable_spellchecking()
# Equivalent to:
tool.disabled_categories.update({"TYPOS"})
tool.disabled_categories.difference_update({"TYPOS"})
Custom Spellings
You can register domain-specific words:
with language_tool_python.LanguageTool(
"en-US",
new_spellings=["my_product_name", "my_team_term"],
new_spellings_persist=False,
) as tool:
print(tool.check("my_product_name is released"))
new_spellings_persist=True(default): keeps words in the local LT spelling file.new_spellings_persist=False: session-only, words are removed onclose().
Local Server Configuration (config=)
For local servers only, pass a config dictionary. Example:
with language_tool_python.LanguageTool(
"en-US",
config={
"cacheSize": 1000,
"pipelineCaching": True,
"maxTextLength": 50000,
},
) as tool:
print(tool.check("Text to inspect"))
Supported keys:
maxTextLength,maxTextHardLength,maxCheckTimeMillismaxErrorsPerWordRate,maxSpellingSuggestions,maxCheckThreadscacheSize,cacheTTLSecondsrequestLimit,requestLimitInBytes,timeoutRequestLimit,requestLimitPeriodInSecondslanguageModel,fasttextModel,fasttextBinarymaxWorkQueueSize,rulesFile,blockedReferrerspremiumOnly,disabledRuleIdspipelineCaching,maxPipelinePoolSize,pipelineExpireTimeInSeconds,pipelinePrewarmingtrustXForwardForHeader,suggestionsEnabled- spellcheck-only language keys:
lang-<code>lang-<code>-dictPath
Notes:
remote_serverandconfigcannot be used together.proxiescan only be used withremote_server.
CLI
Entry point:
language_tool_python [OPTIONS] FILE [FILE ...]
Use - as file to read from stdin.
Examples:
# Check a file
language_tool_python -l en-US README.md
# Check stdin
echo "This are bad." | language_tool_python -l en-US -
# Auto-apply suggestions
language_tool_python -l en-US --apply input.txt
# Use only selected rules
language_tool_python -l en-US --enabled-only --enable MORFOLOGIK_RULE_EN_US input.txt
# Use remote LT server
language_tool_python -l en-US --remote-host 127.0.0.1 --remote-port 8081 input.txt
Main options:
-l, --language CODE-m, --mother-tongue CODE-d, --disable RULES-e, --enable RULES--enabled-only-p, --picky-a, --apply-s, --spell-check-off--ignore-lines REGEX--remote-host HOST,--remote-port PORT-c, --encoding--verbose--version
Exit codes:
0: no issues2: issues found
Environment Variables
LTP_PATH: directory used to store downloaded LanguageTool packages.- default:
~/.cache/language_tool_python/
- default:
LTP_JAR_DIR_PATH: use an existing local LanguageTool directory (skip download).LTP_DOWNLOAD_HOST_SNAPSHOT: override snapshot download host.- default:
https://internal1.languagetool.org/snapshots/
- default:
LTP_DOWNLOAD_HOST_RELEASE: override release download host.- default:
https://languagetool.org/download/
- default:
LTP_DOWNLOAD_HOST_ARCHIVE: override archive download host.- default:
https://languagetool.org/download/archive/
- default:
Example:
export LTP_PATH=/path/to/cache
export LTP_JAR_DIR_PATH=/path/to/LanguageTool-6.8-SNAPSHOT
Resource Management
When using a local server, prefer a context manager or explicit close():
with language_tool_python.LanguageTool("en-US") as tool:
...
# or
tool = language_tool_python.LanguageTool("en-US")
...
tool.close()
Client/Server Pattern
You can run LT on one process/host and connect from another client:
# Server side
server_tool = language_tool_python.LanguageTool("en-US")
# Client side
client_tool = language_tool_python.LanguageTool(
"en-US",
remote_server=f"http://127.0.0.1:{server_tool.port}",
)
Error Types
Main exceptions in language_tool_python.exceptions:
LanguageToolErrorServerErrorJavaErrorPathErrorRateLimitError
Development
# Install dev dependencies
uv sync --group tests --group docs --group types
# Lint / format / types
uvx ruff@0.14.5 check .
uvx ruff@0.14.5 format .
uvx mypy@1.18.2
# Tests
pytest
License
GPL-3.0-only. See LICENSE.
Acknowledgements
This project is based on the original language-check project:
https://github.com/myint/language-check/
Project details
Release history Release notifications | RSS feed
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 language_tool_python-3.3.0.tar.gz.
File metadata
- Download URL: language_tool_python-3.3.0.tar.gz
- Upload date:
- Size: 53.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.6.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
60be6dbbd2009b1289ece3785d542dcf8cc148c070a0f901965765a46afb5e4e
|
|
| MD5 |
b4df17d4ff96e41a78b77aa6c401a680
|
|
| BLAKE2b-256 |
4f0812e0f8e77a4ef42b25bf0008532581a45197eccc569aa4ba3f3f5294d6f6
|
File details
Details for the file language_tool_python-3.3.0-py3-none-any.whl.
File metadata
- Download URL: language_tool_python-3.3.0-py3-none-any.whl
- Upload date:
- Size: 54.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.6.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8e50f6d802c54d1ad7a1dc3c414adfbf26c4eb79189df8f63ed2a174ac504fa7
|
|
| MD5 |
08ef0be8474de8d71cd6866fd8a10b81
|
|
| BLAKE2b-256 |
d003a79a49f425adfc34457bf6589dc0067cb6fee99dd8b01a492db8020678be
|