diff --git a/README.fa.md b/README.fa.md
index 5108ae3..a4a23d1 100644
--- a/README.fa.md
+++ b/README.fa.md
@@ -42,10 +42,9 @@ print(doc.ents) # (محمدرضا شجریان, مشهد)
| سرعت (940MX، دستهٔ ۳۲) | ۱۰٬۲۳۵ | ۹٬۰۵۸ | ۹٬۲۱۵ | بخش توان عملیاتی | |
| حجم بستهٔ نصب | ۱۳٫۵ مگابایت | ۶۸٫۵ مگابایت | ۲۳۵ مگابایت | ۶۰۸ مگابایت | |
-ردهٔ `trf` که ParsBERT را ریزتنظیم میکند در همهجا جلو است مگر در واژهیابی و مرزبندی جمله، که
-`lg` با واژهیاب درختویرایش روی زیرواژههای floret همچنان بهتر عمل میکند. تنها ردهٔای است که از
-مرجع `DEP_LAS` برابر ۸۹٫۳۴ عبور میکند. این رده به کارت گرافیک نیاز دارد و مدل پایهٔ آن پروانهٔ
-مشخصی ندارد، پس قابل بازانتشار نیست؛ هر دو نکته در `docs/MODELS.md` بخش ۸ آمده است.
+ردهٔ `trf` در همهجا جلو است مگر در واژهیابی و مرزبندی جمله، و تنها ردهٔای است که از مرجع
+`DEP_LAS` برابر ۸۹٫۳۴ عبور میکند. به کارت گرافیک نیاز دارد و مدل پایهٔ آن پروانهٔ مشخصی ندارد،
+پس قابل بازانتشار نیست (`docs/MODELS.md` بخش ۸).
برچسبهای موجودیت «نقرهای» هستند: از لایهای در خود پیکره میآیند که با برچسبزن Beheshti-NER
تولید و سپس دستی اصلاح شده است. بنابراین `ENTS_F` تا اندازهای همخوانی با آن برچسبزن را
@@ -68,14 +67,10 @@ print(doc.ents) # (محمدرضا شجریان, مشهد)
| `lg` | ۴٬۷۱۵ | ۹٬۲۱۵ | |
| `trf` | ۱۸۷ | | ۸٬۳۲۰ |
-ردهٔ `trf` جنس دیگری دارد: روی همان پردازندهٔ لپتاپ ۱۸۷ واژه بر ثانیه است، یعنی حدود ۲۹ برابر
-کندتر از `sm` با ۵٬۴۸۴. روی T4 به ۸٬۳۲۰ میرسد و روی پردازندهٔ همان ماشین ۳۳۶، یعنی شتاب ۲۵
-برابری. پس کارت گرافیک برای این رده یک نیاز است نه یک بهینهسازی. کارت 940MX اصلاً `trf` را
-اجرا نمیکند، چون نسخههای امروزی PyTorch پشتیبانی از معماری sm_50 را کنار گذاشتهاند.
-
-فاصلهٔ `sm` و `md` و `lg` روی پردازنده کمتر از ۱۵ درصد است، یعنی کمتر از آنچه تفاوت اندازهٔ
-جدول بردارها نشان میدهد: گلوگاه tok2vec نیست، تجزیهگر و واژهیاب است. پراکندگی اجراها روی
-لپتاپ بسته به دمای دستگاه حدود ۱۰± درصد است، پس تفاوتهای کمتر از آن نویز شمرده میشوند.
+ردهٔ `trf` روی یک پردازنده حدود ۲۹ برابر کندتر از `sm` است، و روی T4 نسبت به پردازندهٔ همان
+ماشین (۳۳۶ واژه بر ثانیه) ۲۵ برابر سریعتر، پس کارت گرافیک برای آن یک نیاز است نه بهینهسازی.
+فاصلهٔ ردههای پردازندهای کمتر از ۱۵ درصد است، یعنی گلوگاه جستوجوی tok2vec نیست بلکه تجزیهگر
+و واژهیاب است. پراکندگی اجراها روی لپتاپ بسته به دمای دستگاه حدود ۱۰± درصد است.
گامهای تبدیل پیکره، آموزش، ارزیابی و بستهبندی در [`project.yml`](project.yml) تعریف شدهاند.
توضیح بیشتر دربارهٔ گزینش پیکره و پروانهها در [`docs/MODELS.md`](docs/MODELS.md) و شرح انگلیسی
diff --git a/README.md b/README.md
index 89c3132..ea0a13e 100644
--- a/README.md
+++ b/README.md
@@ -25,13 +25,12 @@ pip install https://huggingface.co/Phazel/fa_core_news_sm/resolve/main/fa_core_n
Compared against Hazm (the most-used Persian toolkit) and `en_core_web_sm` (English reference).
-| Metric | **`spacy-persian`**
`fa_core_news_sm` | **Hazm**
(Persian toolkit) | `en_core_web_sm`
(English reference) |
+| Metric | **`spacy-persian`**
`fa_core_news_trf` | **Hazm**
(Persian toolkit) | `en_core_web_sm`
(English reference) |
|--------|:---:|:---:|:---:|
-| **POS Accuracy (UPOS)** | **96.24%** | ~95.69%¹ | 97.21%² |
-| **Lemma Accuracy** | **97.91%** | 89.9%¹ | — |
-| **Dependency LAS** | 85.15% | 85.6%¹ | 91.85%² |
-| **NER F-score** | 71.87% | — | 83.80%² |
-| **Package Size** | **13 MB** (syntax+NER)
**7.5 MB** (syntax-only) | ~7 MB | 12 MB |
+| **POS Accuracy (UPOS)** | **97.63%** | ~95.69%¹ | 97.21%² |
+| **Lemma Accuracy** | **97.31%** | 89.9%¹ | — |
+| **Dependency LAS** | **90.79%** | 85.6%¹ | 91.85%² |
+| **NER F-score** | **82.89%** | — | 83.80%² |
> **¹** Hazm scores from its official README
> **²** `en_core_web_sm` scores from spaCy's official model card
@@ -48,6 +47,7 @@ From `spacy benchmark accuracy`, stored in `metrics/`.
| `fa_dep_news_md` | same as `fa_dep_news_sm`, plus floret vectors | CC BY-SA 4.0 | LEMMA 97.96 | 62 MB |
| `fa_core_news_md` | same as `fa_core_news_sm`, plus floret vectors | CC BY-SA 4.0 | ENTS_F 74.71 | 68 MB |
| `fa_ent_news_md` | `ner` alone (own embedded tok2vec), plus floret vectors | CC BY-SA 4.0 | ENTS_F 74.71 | 58 MB |
+| `fa_core_news_trf` | transformer, tagger, morphologizer, trainable_lemmatizer, parser, ner | see §8, encoder unlicensed | ENTS_F 82.89, LAS 90.79 | 608 MB |
The `md` tier adds a 50k x 300d floret vector table trained on 400k Persian documents. Its
config differs from `sm` by exactly one line (`include_static_vectors`), so the columns below
@@ -69,11 +69,9 @@ isolate what the vectors buy. Full breakdown in `docs/MODELS.md` §6.
| Speed (940MX, batch 32) | 10,235 words/s | 9,058 words/s | 9,215 words/s | see §Throughput | |
| Wheel size | 13.5 MB | 68.5 MB | 235 MB | 608 MB | |
-`trf` fine-tunes ParsBERT and wins everywhere except lemmatization and sentence
-segmentation, where `lg`'s edit-tree lemmatizer over floret subwords still leads. It is the
-only tier to pass the hazm+ParsBERT `DEP_LAS` reference of 89.34. It needs a GPU and its
-encoder has no stated licence, so it is not redistributable; `docs/MODELS.md` §8 has both
-caveats.
+`trf` leads everywhere except lemmatization and sentence segmentation, and is the only tier to
+pass the hazm+ParsBERT `DEP_LAS` reference of 89.34. It needs a GPU, and its encoder states no
+licence so it is not redistributable (`docs/MODELS.md` §8).
Entity scores are `fa_core_news_*` on the PerDT NER test split; per-label breakdown and
caveats are in [Named entity recognition](#named-entity-recognition).
@@ -97,16 +95,10 @@ timing the pipe only, warmup discarded. Reproduce with
| `lg` | 4,715 | 9,215 | |
| `trf` | 187 | | 8,320 |
-The `trf` tier is a different kind of thing: 187 words/s on the same laptop CPU that runs
-`sm` at 5,484, so about 29x slower. On a T4 it reaches 8,320, and on that VM's own Xeon it
-manages 336, a 25x GPU speedup. Treat GPU as a requirement rather than an optimization.
-The 940MX cannot run `trf` at all, since current PyTorch wheels have dropped its sm_50
-compute capability.
-
-`sm`, `md` and `lg` are within about 15% of each other on CPU, which is smaller than the
-gap in vector-table size suggests: the tok2vec is not the bottleneck, the parser and
-lemmatizer are. Run-to-run spread on the laptop is roughly +/-10% depending on thermal
-state, so treat differences under that as noise.
+`trf` runs 29x slower than `sm` on the same CPU, and 25x faster on a T4 than on that VM's own
+Xeon (336 words/s), so a GPU is a requirement rather than an optimization. The CPU tiers sit
+within 15% of each other, so the tok2vec lookup is not the bottleneck; the parser and
+lemmatizer are. Laptop spread is about 10% with thermal state.
## Named entity recognition
@@ -119,23 +111,25 @@ recall, so the `ENTS_F` numbers below partly reflect agreement with that tagger,
human annotation.
`ner` runs standalone with its own embedded tok2vec (`fa_ent_news_sm`, `fa_ent_news_md`), or
-bundled into `fa_core_news_sm`/`fa_core_news_md` alongside the syntax pipeline.
+bundled into `fa_core_news_sm`/`fa_core_news_md` alongside the syntax pipeline. In `trf` it is
+trained jointly against the shared transformer instead, so there is no standalone trf variant.
-| Label | Gold in test | `sm` F | `md` F | Train examples |
-| --- | --- | --- | --- | --- |
-| `LOC` | 273 | 80.24 | 84.05 | 4,954 |
-| `PER` | 297 | 65.29 | 68.18 | 4,847 |
-| `ORG` | 144 | 68.77 | 70.25 | 2,643 |
-| `DAT` | 69 | 74.45 | 76.19 | 1,323 |
-| `MON` | 10 | 73.68 | 84.21 | 205 |
-| `TIM` | 9 | 66.67 | 66.67 | 135 |
-| `PCT` | 4 | 57.14 | 33.33 | 121 |
+| Label | `sm` F | `md` F | `lg` F | `trf` F | Train examples |
+| --- | --- | --- | --- | --- | --- |
+| `LOC` | 80.24 | 84.05 | 83.66 | **87.78** | 4,954 |
+| `PER` | 65.29 | 68.18 | 72.63 | **81.88** | 4,847 |
+| `ORG` | 68.77 | 70.25 | 71.01 | **78.50** | 2,643 |
+| `DAT` | 74.45 | 76.19 | 70.83 | **82.52** | 1,323 |
+| `MON` | 73.68 | 84.21 | 88.89 | 88.89 | 205 |
+| `TIM` | 66.67 | 66.67 | 61.54 | 50.00 | 135 |
+| `PCT` | 57.14 | 33.33 | 57.14 | 33.33 | 121 |
-`MON`, `TIM` and `PCT` have single-digit support in the test split, so their deltas are one
-or two entities changing hands, not signal. `PER`, `LOC` and `ORG` carry the split and all
-improve with floret vectors; the `md` gain over `sm` (`ENTS_F` 71.87 to 74.71) is almost
-entirely recall (+6.08), the lexical prior static vectors give rare proper nouns that hash
-embeddings never had.
+`MON`, `TIM` and `PCT` have single-digit support in the test split, so their deltas are one or
+two entities changing hands, not signal. `PER`, `LOC` and `ORG` carry the split. The `md` gain
+over `sm` (`ENTS_F` 71.87 to 74.71) is almost entirely recall (+6.08), the lexical prior static
+vectors give rare proper nouns that hash embeddings never had. `trf` adds another +6.95 F over
+`lg`, again mostly recall (71.09 to 81.76), and its largest per-label gains are `PER` (+9.25)
+and `DAT` (+11.69).
## Install