Rishe (ریشه)
Fast Persian NLP and morphology for Python. Prebuilt wheels, no Python dependencies, and the base pipeline needs no model downloads.
Install
pip install rishe
Python 3.9+. Linux (glibc and musl), macOS and Windows wheels are published.
Quickstart
from rishe import Pipeline
pipe = Pipeline()
doc = pipe("اون داره تو خونه کتاب میخونه، چیه؟")
doc.tokens # ['آن', 'دارد', 'تو', 'خانه', 'کتاب', 'میخواند', '،', 'چیست', '؟']
doc.lemmas # ['آن', 'داشت', 'تو', 'خانه', 'کتاب', 'خواند', '،', 'چیست', '؟']
doc.formal_text # 'آن دارد تو خانه کتاب میخواند، چیست؟'
pipe.normalize, word_tokenize, sent_tokenize, lemmatize, stem,
conjugate, spell_correct and the rest are methods on the same object.
pipe(text) rewrites colloquial forms; word_tokenize tokenizes the surface
text without rewriting.
Class-based API
The same engine is available as small, reusable classes:
from rishe import (
Lemmatizer,
Normalizer,
SentenceTokenizer,
Stemmer,
TokenSplitter,
WordTokenizer,
sent_tokenize,
word_tokenize,
)
Normalizer().normalize("مي كنم") # 'میکنم'
WordTokenizer().tokenize("رفته است") # ['رفته_است']
SentenceTokenizer().tokenize("یک. دو.")
Lemmatizer().lemmatize("میروم") # 'رفت#رو'
Stemmer().stem("کتابها") # 'کتاب'
TokenSplitter().split_token_words("بهش") # [('به', 'او')]
word_tokenize("رفته است") # ['رفته_است']
sent_tokenize("یک. دو.")
No lexicon paths are needed: the classes use Rishe's compiled-in lexicons.
WordTokenizer accepts the same options as the pipeline tokenizer
(join_verb_parts, replace_emails, replace_links, and so on).
Features
- Normalization, tokenization, sentence splitting and lemmatization.
- Stemming, conjugation, inflection, clitic splitting, spell correction, stopwords and ezafe detection.
- Static fastText/word2vec embeddings with sentence pooling.
- Optional POS, NER and learned ezafe model packs.
Feature tour
Morphology and utilities
pipe.stem("کتابها") # 'کتاب'
pipe.conjugate("رفت")["present"][:3] # ['میروم', 'میروی', 'میرود']
pipe.comparative("بزرگ") # 'بزرگتر'
pipe.superlative("بزرگ") # 'بزرگترین'
pipe.plural("کتاب") # 'کتابها'
pipe.possessive("خانه", 0) # 'خانهام'
pipe.split_token("بهش") # ['به', 'او']
pipe.spell_correct("سسلام بر ششما") # 'سلام بر شما'
pipe.tokenize_spans("سلام دنیا") # [('سلام', 0, 4), ('دنیا', 5, 9)]
Normalization and masking
normalize_stages applies individual operators in the order you list them;
mask_stages removes or masks URLs, emails, mentions, hashtags, HTML, digits,
diacritics, punctuation, stopwords, offensive words and non-Persian text.
pipe.normalize_stages("﷽ 1𝟮3٤٥⓺", ["arabic_unicode", "digits"])
# 'بسم الله الرحمن الرحیم ۱۲۳۴۵۶'
pipe.mask_stages("سلام @user، به https://rishe.dev یا info@rishe.dev بنویس.",
["url", "email", "mention"])
# 'سلام به <URL> یا <EMAIL> بنویس.'
Utilities, keywords and transliteration
pipe.number_to_words(1404) # 'یک هزار و چهارصد و چهار'
pipe.ngrams("این یک متن", 1, 2) # ['این', 'یک', 'متن', 'این یک', 'یک متن']
pipe.persianize("فایل را با کامپیوتر باز کن") # 'پرونده را با رایانه باز کن'
pipe.rake(text, top_n=5)
pipe.textrank(text, top_n=5)
pipe.to_tajik("خانه") # 'хона'
pipe.to_persian("хона") # 'خانه'
keyboard_noise, ocr_noise and whitespace_noise add reproducible typing, OCR
and spacing noise; pass seed= for deterministic output.
Tokenizer options
pipe.word_tokenize_with("رفته است", join_verb_parts=True) # ['رفته_است']
pipe.word_tokenize_with("info@a.co", replace_emails=True) # ['EMAIL']
Options include join_verb_parts, join_abbreviations, separate_emoji,
replace_links, replace_ids, replace_emails, replace_numbers and
replace_hashtags.
Corpora
from rishe import ConlluReader, PeymaReader, PlainTextReader
for sentence in ConlluReader("data/corpora/fa_perdt-ud-test.conllu"):
print(sentence.text, sentence.tokens[0].lemma)
ConlluReader handles CoNLL-U, PeymaReader reads the PEYMA format and
PlainTextReader reads one sentence per line.
Model packs
POS, NER and ezafe are separate, checksum-verified downloads. They run inside the package without ONNX Runtime or a Python ML stack.
rishe hub pull pos-compact
rishe hub pull ner-compact
rishe hub pull ezafe-compact
from rishe import Pipeline, hub
pipe = Pipeline(
pos_pack=str(hub.path_pack("pos-compact")),
ner_pack=str(hub.path_pack("ner-compact")),
ezafe_pack=str(hub.path_pack("ezafe-compact")),
)
for token in pipe.pos("کتابهای خوب را به دوستانم میدهم."):
print(token.text, token.tag, token.start, token.end)
for entity in pipe.ner("سرلشگر فیروزآبادی به پادشاه عربستان گفت."):
print(entity.text, entity.label, entity.start, entity.end)
for token in pipe.ezafe("کتابخانه مرکزی دانشگاه شریف"):
print(token.text, token.tag, token.start, token.end)
pipe.pos_batch(["کتابهای خوب", "خوب است"])
pipe.ner_batch(["فیروزآبادی گفت.", "عربستان جای خوبی است."])
pipe.ezafe_batch(["کتابخانه مرکزی", "دانشگاه شریف"])
TaggedToken has text, tag, start and end; Entity has text,
label, start and end. Start/end are character offsets. The lower-level
ModelPack class is still available when you want one task:
from rishe import ModelPack
pack = ModelPack(str(hub.path_pack("pos-compact")))
pack.tag_tokens("کتابهای خوب") # typed TaggedToken list
pack.tag_words(["کتابهای", "خوب"]) # tuple output
Embeddings
rishe hub pull hazm-fasttext-300 # optional 2.3 GB static embedding file
from rishe import Embeddings, hub
emb = Embeddings(str(hub.path("hazm-fasttext-300")))
emb.dim, len(emb) # vector size, vocabulary size
emb.vector("کتاب") # list[float] or None
emb.sentence_vector("این کتاب خوب است") # mean of in-vocab token vectors
emb.most_similar("کتاب", 5) # [(word, cosine), ...]
CLI
rishe normalize "مي كنم"
rishe tokenize "سلام دنیا" --json
rishe pos "کتابهای خوب را به دوستانم میدهم."
rishe ner --json "سرلشگر فیروزآبادی به پادشاه عربستان گفت."
rishe ezafe "کتابخانه مرکزی دانشگاه شریف"
Docs
License
Dual-licensed under Apache-2.0 or MIT, at your option. Lexicon attributions are in NOTICE.md.
Built by Mahdi Alikhah.
Metadata
Release files for rishe 0.6.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| rishe-0.6.1.tar.gz | 1.8 MB | With provenance | Details for rishe-0.6.1.tar.gz |
Built distributions (wheels)
Total release size: 81.6 MB
Release files / rishe-0.6.1.tar.gz
| Download URL | rishe-0.6.1.tar.gz |
|---|---|
| Size | 1.8 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
2b3d2583464be9f9a2d25ed57d47df0a3a1b3fc505ad31f4cce7c92e6d95aa73
|
|
BLAKE2b-256 checksum How to use checksums |
dc92e293aa08a92efdd57400b44eee1eb1351818daca9c8422155252ff5e16ce
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
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 Oct 28, 2026.
Transparency logRelease files / rishe-0.6.1-cp39-abi3-win_amd64.whl
| Download URL | rishe-0.6.1-cp39-abi3-win_amd64.whl |
|---|---|
| Size | 10.4 MB |
| Tags | CPython 3.9 Windows x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
1434c73898b7516fe744aa27bc6117b0a4cab5d8404e7201401a848649401fe3
|
|
BLAKE2b-256 checksum How to use checksums |
ada0e3e5ec4837d76a18d895a9512419cae2717ab07f995113312f4685b0d3e5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
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 Oct 28, 2026.
Transparency logRelease files / rishe-0.6.1-cp39-abi3-musllinux_1_2_x86_64.whl
| Download URL | rishe-0.6.1-cp39-abi3-musllinux_1_2_x86_64.whl |
|---|---|
| Size | 12.8 MB |
| Tags | CPython 3.9 Linux musl 1.2+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
d9e68496fc8ac5ac0d50b2117d3f17f8b40ef5fda2cb7ec08d6d6eade1e18932
|
|
BLAKE2b-256 checksum How to use checksums |
983de442b09bab10f7afe9951d88c13ddd6f70c2b07160ef8e69dcd064e70c44
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
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 Oct 28, 2026.
Transparency logRelease files / rishe-0.6.1-cp39-abi3-musllinux_1_2_aarch64.whl
| Download URL | rishe-0.6.1-cp39-abi3-musllinux_1_2_aarch64.whl |
|---|---|
| Size | 11.9 MB |
| Tags | CPython 3.9 Linux musl 1.2+ ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
d82810f02dc55dfba7b4141297bfad935dc9811ad41369657f27855e86dbcf79
|
|
BLAKE2b-256 checksum How to use checksums |
37df2e8a858f327839ca4afddd70bb755c063960f7f7302b6341edf07c77644c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
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 Oct 28, 2026.
Transparency logRelease files / rishe-0.6.1-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | rishe-0.6.1-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 11.8 MB |
| Tags | CPython 3.9 Linux glibc 2.17+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
3aecbe4125a16ca7b9fd44970d09b0ac5ad97b1c38f13b800366259a48c1d30b
|
|
BLAKE2b-256 checksum How to use checksums |
115d2747d64850d302ea6369e7468044d62542d8c50d7a969990e8277a7092df
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
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 Oct 28, 2026.
Transparency logRelease files / rishe-0.6.1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
| Download URL | rishe-0.6.1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl |
|---|---|
| Size | 11.6 MB |
| Tags | CPython 3.9 Linux glibc 2.17+ ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
447039da9054b90d9a8b24d885b8910c536d2c7e6e9f328c34d2f575c17e2378
|
|
BLAKE2b-256 checksum How to use checksums |
35fbc01ba0d591b21e06390248759da834a03ea9af9ad1120c051ae2a8b55aec
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
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 Oct 28, 2026.
Transparency logRelease files / rishe-0.6.1-cp39-abi3-macosx_11_0_arm64.whl
| Download URL | rishe-0.6.1-cp39-abi3-macosx_11_0_arm64.whl |
|---|---|
| Size | 10.2 MB |
| Tags | CPython 3.9 abi3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
8947e9d2f5c529eec4017cac2668506195d0e656604341018e7a1409f62eee44
|
|
BLAKE2b-256 checksum How to use checksums |
1f5fb8db382e691335b0f65e78bd93d784bf924e4d5461fce0ff7b9fa95f612c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
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 Oct 28, 2026.
Transparency logRelease files / rishe-0.6.1-cp39-abi3-macosx_10_12_x86_64.whl
| Download URL | rishe-0.6.1-cp39-abi3-macosx_10_12_x86_64.whl |
|---|---|
| Size | 11.1 MB |
| Tags | CPython 3.9 abi3 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
6d933f4594f28d74eea4e39f216ce7a60c35a93d95ab5c65a99a07ba9b13e2ac
|
|
BLAKE2b-256 checksum How to use checksums |
6e355142d30d1ebc9bd7605af58b25bac6129cbe53a47ecc4ac9126a8c6c4946
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
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 Oct 28, 2026.
Transparency logSecurity for rishe 0.6.1
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.
Full provenance
All 8 files in this release have been uploaded with provenance metadata.
Attestation for rishe-0.6.1.tar.gz
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 Oct 28, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.