TS POSTagger
TS POSTagger is a Turkish part-of-speech tagging library with a hybrid pipeline:
ts-tokenizerproduces token boundaries and deterministic token classes.- A bundled spaCy POS model predicts contextual grammatical tags.
- A resolver preserves structural token types such as hashtags, mentions, URLs, dates, and punctuation when they are more informative than a generic grammatical label.
The package exposes:
- a Python API:
from ts_postagger import pos - a CLI:
ts-postagger
Installation
pip install ts-postagger
Requirements:
- Python
>=3.11
The trained model is bundled with the package. No separate download step is required.
Quick Start
from ts_postagger import pos
tokens = pos("Defne'nin heyecanla beklediği #viyana yolculuğu bugün başladı.")
for token in tokens:
print(token.text, token.pos)
Example output:
Defne'nin PropN
heyecanla Adv
beklediği Adj
#viyana Hashtag
yolculuğu Noun
bugün Adv
başladı Verb
. Punc
Python API
The main entrypoint is pos(text: str) -> list[TSToken].
Each returned TSToken has these fields:
| Field | Description |
|---|---|
text |
Original surface form |
lower |
Turkish-aware lowercase form |
token_type |
Deterministic token class from ts-tokenizer |
tag |
Contextual grammatical prediction from the model |
pos |
Final output POS label |
pos is the field you should use as the final annotation.
Minimal example
from ts_postagger import pos
text = pos("Bugün yeni ve güzel bir gün!")
for token in text:
print(token.pos)
Convert results to dictionaries
TSToken is a dataclass, so standard dataclass helpers work:
from dataclasses import asdict
from ts_postagger import pos
tokens = pos("#YeniBilgi yayımlandı.")
rows = [asdict(token) for token in tokens]
for row in rows:
print(row)
Example dictionary:
{
"text": "#YeniBilgi",
"lower": "#yenibilgi",
"token_type": "Hashtag",
"tag": "Noun",
"pos": "Hashtag",
}
Empty input
from ts_postagger import pos
print(pos(""))
Output:
[]
Why token_type, tag, and pos are different
The library intentionally keeps multiple annotation layers.
For lexical tokens, the final output usually follows the POS model:
çalışmalar Valid_Word Noun Noun
yayımlandı Valid_Word Verb Verb
For structural or social-media tokens, the final output stays deterministic even when the model predicts a regular grammatical tag:
#YeniBilgi Hashtag Noun Hashtag
@yeni Mention Noun Mention
19.10.2026 Date Num Date
https://example.org URL Noun URL
Meaning of each layer:
token_type: deterministic label from the tokenizertag: raw contextual prediction from the POS modelpos: final POS output of TS POSTagger
Turkish-aware lowercasing
The lower field uses Turkish-aware lowercasing from ts-tokenizer.
from ts_postagger import pos
tokens = pos("IĞDIR İSTANBUL")
for token in tokens:
print(token.text, token.lower)
Output:
IĞDIR ığdır
İSTANBUL istanbul
lower is a lowercase surface form. It is not a lemma.
CLI
Installing the package also installs the ts-postagger command.
The CLI accepts either:
- a single positional text argument, or
- standard input
Default output format:
TOKEN<TAB>POS
Tag inline text
ts-postagger "Bugün yeni ve güzel bir gün!"
Example output:
Bugün Adv
yeni Adj
ve Conj
güzel Adj
bir Det
gün Noun
! Punc
Lowercase only
ts-postagger -low "Bugün yeni ve güzel bir gün!"
Example output:
bugün
yeni
ve
güzel
bir
gün
!
Raw model tag
ts-postagger -tag "Bugün yeni ve güzel bir gün!"
Example output:
Bugün Adv
yeni Adj
ve Conj
güzel Adj
bir Det
gün Noun
! Punc
Full output
ts-postagger --full "Bugün yeni ve güzel bir gün!"
Example output:
Bugün bugün Adv
yeni yeni Adj
ve ve Conj
güzel güzel Adj
bir bir Det
gün gün Noun
! ! Punc
Columns:
TOKEN<TAB>LOWER<TAB>POS
Read from stdin
echo "Bugün yeni ve güzel bir gün!" | ts-postagger
Version
ts-postagger -V
Help
ts-postagger --help
Notes
- The package name for installation is
ts-postagger. - The Python import package is
ts_postagger. - The CLI command is
ts-postagger.
Citation
If you use TS POSTagger in academic work, please cite the associated doctoral dissertation:
Sezer, T. (2025). Dizilerden birimlere: Bilişimsel dilbilim çerçevesinde bir birimlendirici tasarımı [Doctoral dissertation, Hacettepe University].
License
This project is licensed under the MIT 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 ts_postagger-0.1.0.tar.gz.
File metadata
- Download URL: ts_postagger-0.1.0.tar.gz
- Upload date:
- Size: 85.7 MB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.13.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d26366115cbb72c8672b8098e2ba19fad9e77c31e6a4dc4000cdb735050ec878
|
|
| MD5 |
01b90acb998baa5e98adb088fce62b63
|
|
| BLAKE2b-256 |
408798fe951bc6c5a624965a616c83ed0119f673e6eadf00bc00a26d3242d18d
|
File details
Details for the file ts_postagger-0.1.0-py3-none-any.whl.
File metadata
- Download URL: ts_postagger-0.1.0-py3-none-any.whl
- Upload date:
- Size: 85.7 MB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.13.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
25d937719beb211c5d550888863804e273b7ce41d0a9679aa7092eccec9cf989
|
|
| MD5 |
c7313fbe9c62552cc5343071a77245df
|
|
| BLAKE2b-256 |
e039f358c09e09cd5d042fda313fe4a42a20175fac093c61eb9c301b90d28838
|