zimankit 0.2.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- zimankit/__init__.py +60 -0
- zimankit/__main__.py +3 -0
- zimankit/cli.py +209 -0
- zimankit/config.py +69 -0
- zimankit/data/__init__.py +0 -0
- zimankit/data/ckb_function_words.tsv +119 -0
- zimankit/data/ckb_verbs_core.tsv +104 -0
- zimankit/data/kmr_function_words.tsv +97 -0
- zimankit/data/kmr_verbs_core.tsv +68 -0
- zimankit/dependency.py +394 -0
- zimankit/lexicon/__init__.py +0 -0
- zimankit/lexicon/builder.py +518 -0
- zimankit/lexicon/corpus.py +216 -0
- zimankit/lexicon/export.py +627 -0
- zimankit/lexicon/harvest.py +224 -0
- zimankit/lexicon/wiki_lexicon.py +205 -0
- zimankit/rules.py +135 -0
- zimankit/shared_utils/__init__.py +0 -0
- zimankit/shared_utils/lid.py +186 -0
- zimankit/shared_utils/normalizer.py +115 -0
- zimankit/shared_utils/phonology_core.py +183 -0
- zimankit/shared_utils/schema.py +95 -0
- zimankit/shared_utils/text_helpers.py +157 -0
- zimankit/shared_utils/tokenizer.py +85 -0
- zimankit/shared_utils/unicode_tables.py +197 -0
- zimankit/skills_ckb/__init__.py +0 -0
- zimankit/skills_ckb/config.toml +19 -0
- zimankit/skills_ckb/morphology.py +311 -0
- zimankit/skills_ckb/orthography.py +176 -0
- zimankit/skills_ckb/phonology_ipa.py +216 -0
- zimankit/skills_ckb/verbs.py +365 -0
- zimankit/skills_kmr/__init__.py +0 -0
- zimankit/skills_kmr/config.toml +16 -0
- zimankit/skills_kmr/morphology.py +229 -0
- zimankit/skills_kmr/orthography.py +90 -0
- zimankit/skills_kmr/phonology_ipa.py +124 -0
- zimankit/skills_kmr/syntax.py +137 -0
- zimankit/skills_kmr/translit.py +57 -0
- zimankit/skills_kmr/verbs.py +214 -0
- zimankit/tools/__init__.py +0 -0
- zimankit/tools/mdx_extractor.py +125 -0
- zimankit/tools/zim_cleaner.py +110 -0
- zimankit-0.2.0.dist-info/METADATA +178 -0
- zimankit-0.2.0.dist-info/RECORD +48 -0
- zimankit-0.2.0.dist-info/WHEEL +5 -0
- zimankit-0.2.0.dist-info/entry_points.txt +2 -0
- zimankit-0.2.0.dist-info/licenses/LICENSE +675 -0
- zimankit-0.2.0.dist-info/top_level.txt +1 -0
zimankit/__init__.py
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"""zimankit - Kurdish (Central ckb / Northern kmr) NLP skills.
|
|
2
|
+
|
|
3
|
+
Quick API::
|
|
4
|
+
|
|
5
|
+
from zimankit import analyze, normalize, parse, to_ipa, identify
|
|
6
|
+
analyze("کتێبەکەم")[0].segmentation # 'کتێب+ەکە+م'
|
|
7
|
+
to_ipa("jinekê") # 'ʒɪnɛkeː'
|
|
8
|
+
parse("Ew baş e.").tokens[1].deprel # 'root'
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
__version__ = "0.2.0"
|
|
14
|
+
|
|
15
|
+
from .shared_utils.lid import identify
|
|
16
|
+
from .shared_utils.text_helpers import detect_script
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def _lang(text: str, lang: str | None) -> str:
|
|
20
|
+
return lang or ("ckb" if detect_script(text) == "arabic" else "kmr")
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def normalize(text: str, lang: str | None = None) -> str:
|
|
24
|
+
if _lang(text, lang) == "ckb":
|
|
25
|
+
from .skills_ckb.orthography import normalize as f
|
|
26
|
+
else:
|
|
27
|
+
from .skills_kmr.orthography import normalize as f
|
|
28
|
+
return f(text)
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def to_ipa(word: str, lang: str | None = None) -> str:
|
|
32
|
+
if _lang(word, lang) == "ckb":
|
|
33
|
+
from .skills_ckb.phonology_ipa import to_ipa as f
|
|
34
|
+
else:
|
|
35
|
+
from .skills_kmr.phonology_ipa import to_ipa as f
|
|
36
|
+
return f(word)
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
_ANALYZERS: dict = {}
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def analyze(word: str, lang: str | None = None):
|
|
43
|
+
lg = _lang(word, lang)
|
|
44
|
+
if lg not in _ANALYZERS:
|
|
45
|
+
if lg == "ckb":
|
|
46
|
+
from .skills_ckb.morphology import CkbAnalyzer as A
|
|
47
|
+
else:
|
|
48
|
+
from .skills_kmr.morphology import KmrAnalyzer as A
|
|
49
|
+
_ANALYZERS[lg] = A()
|
|
50
|
+
return _ANALYZERS[lg].analyze(word)
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def parse(sentence: str, lang: str | None = None):
|
|
54
|
+
"""Dependency structure of a sentence: see zimankit.dependency."""
|
|
55
|
+
from .dependency import parse as f
|
|
56
|
+
|
|
57
|
+
return f(sentence, lang)
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
__all__ = ["analyze", "normalize", "parse", "to_ipa", "identify", "detect_script", "__version__"]
|
zimankit/__main__.py
ADDED
zimankit/cli.py
ADDED
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
"""Command-line interface: ``python -m zimankit <command> ...`` or ``zimankit ...``.
|
|
2
|
+
|
|
3
|
+
Every command reads its words/text from arguments, or from stdin when none
|
|
4
|
+
are given, so it composes with shell pipelines.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import argparse
|
|
10
|
+
import json
|
|
11
|
+
import sys
|
|
12
|
+
from collections.abc import Iterable
|
|
13
|
+
from dataclasses import asdict
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def _inputs(args: list[str]) -> Iterable[str]:
|
|
17
|
+
if args:
|
|
18
|
+
yield from args
|
|
19
|
+
else:
|
|
20
|
+
for line in sys.stdin:
|
|
21
|
+
line = line.rstrip("\n")
|
|
22
|
+
if line:
|
|
23
|
+
yield line
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def _lang_of(text: str, forced: str | None) -> str:
|
|
27
|
+
if forced:
|
|
28
|
+
return forced
|
|
29
|
+
from .shared_utils.text_helpers import detect_script
|
|
30
|
+
|
|
31
|
+
return "ckb" if detect_script(text) == "arabic" else "kmr"
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def cmd_normalize(a) -> None:
|
|
35
|
+
for t in _inputs(a.text):
|
|
36
|
+
lang = _lang_of(t, a.lang)
|
|
37
|
+
if lang == "ckb":
|
|
38
|
+
from .skills_ckb.orthography import normalize
|
|
39
|
+
else:
|
|
40
|
+
from .skills_kmr.orthography import normalize
|
|
41
|
+
print(normalize(t))
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def cmd_tokenize(a) -> None:
|
|
45
|
+
from .shared_utils.tokenizer import tokenize
|
|
46
|
+
|
|
47
|
+
for t in _inputs(a.text):
|
|
48
|
+
print(" ".join(tok.text for tok in tokenize(t)) if not a.json else json.dumps([asdict(tok) for tok in tokenize(t)], ensure_ascii=False))
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def cmd_lid(a) -> None:
|
|
52
|
+
from .shared_utils.lid import identify
|
|
53
|
+
|
|
54
|
+
for t in _inputs(a.text):
|
|
55
|
+
r = identify(t)
|
|
56
|
+
print(json.dumps({"lang": r.lang, "script": r.script, "confidence": r.confidence}, ensure_ascii=False) if a.json else f"{r.lang}\t{r.confidence}\t{t[:60]}")
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def cmd_ipa(a) -> None:
|
|
60
|
+
for t in _inputs(a.text):
|
|
61
|
+
lang = _lang_of(t, a.lang)
|
|
62
|
+
if lang == "ckb":
|
|
63
|
+
from .skills_ckb.phonology_ipa import G2POptions, text_to_ipa
|
|
64
|
+
|
|
65
|
+
print(text_to_ipa(t, G2POptions(mark_epenthesis=not a.plain, syllable_dots=a.syllables)))
|
|
66
|
+
else:
|
|
67
|
+
from .skills_kmr.phonology_ipa import KmrG2POptions, text_to_ipa
|
|
68
|
+
|
|
69
|
+
print(text_to_ipa(t, KmrG2POptions(narrow=a.narrow, syllable_dots=a.syllables)))
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def cmd_translit(a) -> None:
|
|
73
|
+
from .shared_utils.tokenizer import tokenize
|
|
74
|
+
|
|
75
|
+
for t in _inputs(a.text):
|
|
76
|
+
lang = _lang_of(t, a.lang)
|
|
77
|
+
if lang == "ckb":
|
|
78
|
+
from .skills_ckb.phonology_ipa import to_latin as conv
|
|
79
|
+
else:
|
|
80
|
+
from .skills_kmr.translit import to_arabic as conv
|
|
81
|
+
print(" ".join(conv(tok.text) if tok.kind == "word" else tok.text for tok in tokenize(t)))
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def _analyzer(lang: str):
|
|
85
|
+
if lang == "ckb":
|
|
86
|
+
from .skills_ckb.morphology import CkbAnalyzer
|
|
87
|
+
|
|
88
|
+
return CkbAnalyzer()
|
|
89
|
+
from .skills_kmr.morphology import KmrAnalyzer
|
|
90
|
+
|
|
91
|
+
return KmrAnalyzer()
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def cmd_analyze(a) -> None:
|
|
95
|
+
from .shared_utils.tokenizer import words
|
|
96
|
+
|
|
97
|
+
cache: dict[str, object] = {}
|
|
98
|
+
for t in _inputs(a.text):
|
|
99
|
+
lang = _lang_of(t, a.lang)
|
|
100
|
+
an = cache.setdefault(lang, _analyzer(lang))
|
|
101
|
+
for w in words(t):
|
|
102
|
+
res = an.analyze(w)[: a.top] # type: ignore[attr-defined]
|
|
103
|
+
if a.json:
|
|
104
|
+
print(json.dumps({"token": w, "analyses": [r.to_dict() for r in res]}, ensure_ascii=False))
|
|
105
|
+
else:
|
|
106
|
+
for r in res:
|
|
107
|
+
print(f"{w}\t{r.lemma}\t{r.pos}\t{r.segmentation}\t{r.gloss}\t{json.dumps(r.features, ensure_ascii=False)}\t{r.score}")
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
def cmd_conjugate(a) -> None:
|
|
111
|
+
lang = _lang_of(a.infinitive, a.lang)
|
|
112
|
+
if lang == "ckb":
|
|
113
|
+
from .skills_ckb import verbs as V
|
|
114
|
+
else:
|
|
115
|
+
from .skills_kmr import verbs as V
|
|
116
|
+
idx = V.default_index()
|
|
117
|
+
v = idx.verbs.get(a.infinitive)
|
|
118
|
+
if v is None:
|
|
119
|
+
known = {x.infinitive: x for x in idx.verbs.values() if not x.preverb}
|
|
120
|
+
v = V.make_verb(a.infinitive, None if a.transitive is None else a.transitive == "yes", a.present, "guess", known)
|
|
121
|
+
if v is None:
|
|
122
|
+
sys.exit(f"cannot build a paradigm for {a.infinitive!r}")
|
|
123
|
+
for f in V.conjugate(v):
|
|
124
|
+
feats = ",".join(f"{k}={x}" for k, x in f.features.items() if k != "pos")
|
|
125
|
+
print(f"{f.form}\t{feats}")
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
def cmd_ergativity(a) -> None:
|
|
129
|
+
from .skills_kmr.syntax import detect_alignment
|
|
130
|
+
|
|
131
|
+
for t in _inputs(a.text):
|
|
132
|
+
print(json.dumps(detect_alignment(t).to_dict(), ensure_ascii=False))
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
def cmd_parse(a) -> None:
|
|
136
|
+
from .dependency import parse
|
|
137
|
+
|
|
138
|
+
for t in _inputs(a.text):
|
|
139
|
+
p = parse(t, a.lang)
|
|
140
|
+
if a.json:
|
|
141
|
+
print(json.dumps(p.to_dict(), ensure_ascii=False))
|
|
142
|
+
continue
|
|
143
|
+
for w in p.tokens:
|
|
144
|
+
print(f"{w.id}\t{w.text}\t{w.lemma}\t{w.upos}\t{w.head}\t{w.deprel}")
|
|
145
|
+
print()
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
def cmd_validate(a) -> None:
|
|
149
|
+
for t in _inputs(a.text):
|
|
150
|
+
lang = _lang_of(t, a.lang)
|
|
151
|
+
if lang == "ckb":
|
|
152
|
+
from .skills_ckb.orthography import normalize_word, validate_word
|
|
153
|
+
else:
|
|
154
|
+
from .skills_kmr.orthography import normalize_word, validate_word
|
|
155
|
+
w = normalize_word(t)
|
|
156
|
+
p = validate_word(w)
|
|
157
|
+
print(f"{t}\t{w}\t{'OK' if not p else '; '.join(p)}")
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
def cmd_rules(a) -> None:
|
|
161
|
+
from .rules import export_rules
|
|
162
|
+
|
|
163
|
+
print(export_rules(a.out or f"output/{a.lang}/grammar_rules_{a.lang}.json", a.lang))
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
def main(argv: list[str] | None = None) -> int:
|
|
167
|
+
from . import __version__
|
|
168
|
+
|
|
169
|
+
ap = argparse.ArgumentParser(prog="zimankit", description="Kurdish (ckb / kmr) NLP skills")
|
|
170
|
+
ap.add_argument("--version", action="version", version=f"zimankit {__version__}")
|
|
171
|
+
sub = ap.add_subparsers(dest="cmd", required=True)
|
|
172
|
+
|
|
173
|
+
def add(name, fn, help_, text=True):
|
|
174
|
+
p = sub.add_parser(name, help=help_)
|
|
175
|
+
if text:
|
|
176
|
+
p.add_argument("text", nargs="*")
|
|
177
|
+
p.add_argument("--lang", choices=["ckb", "kmr"])
|
|
178
|
+
p.set_defaults(fn=fn)
|
|
179
|
+
return p
|
|
180
|
+
|
|
181
|
+
add("normalize", cmd_normalize, "orthographic normalisation")
|
|
182
|
+
add("tokenize", cmd_tokenize, "word tokenisation").add_argument("--json", action="store_true")
|
|
183
|
+
add("lid", cmd_lid, "language identification").add_argument("--json", action="store_true")
|
|
184
|
+
p = add("ipa", cmd_ipa, "grapheme-to-phoneme (IPA)")
|
|
185
|
+
p.add_argument("--narrow", action="store_true", help="kmr: aspiration, ŋ")
|
|
186
|
+
p.add_argument("--plain", action="store_true", help="ckb: do not mark the inferred bizroke")
|
|
187
|
+
p.add_argument("--syllables", action="store_true")
|
|
188
|
+
add("translit", cmd_translit, "ckb Arabic->Latin, kmr Latin->Arabic")
|
|
189
|
+
p = add("analyze", cmd_analyze, "morphological analysis")
|
|
190
|
+
p.add_argument("--top", type=int, default=1)
|
|
191
|
+
p.add_argument("--json", action="store_true")
|
|
192
|
+
p = add("conjugate", cmd_conjugate, "full verb paradigm", text=False)
|
|
193
|
+
p.add_argument("infinitive")
|
|
194
|
+
p.add_argument("--present", help="present stem for verbs not in the reference list")
|
|
195
|
+
p.add_argument("--transitive", choices=["yes", "no"])
|
|
196
|
+
add("ergativity", cmd_ergativity, "kmr clause alignment / agreement check")
|
|
197
|
+
add("validate", cmd_validate, "orthographic validation of words")
|
|
198
|
+
add("parse", cmd_parse, "sentence structure: head and relation of each word").add_argument("--json", action="store_true")
|
|
199
|
+
p = add("rules", cmd_rules, "export grammar_rules_<lang>.json", text=False)
|
|
200
|
+
p.add_argument("--out")
|
|
201
|
+
a = ap.parse_args(argv)
|
|
202
|
+
if a.cmd == "rules" and not a.lang:
|
|
203
|
+
ap.error("rules needs --lang")
|
|
204
|
+
a.fn(a)
|
|
205
|
+
return 0
|
|
206
|
+
|
|
207
|
+
|
|
208
|
+
if __name__ == "__main__":
|
|
209
|
+
sys.exit(main())
|
zimankit/config.py
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"""Configuration loading: ``config/pipeline.toml`` + ``config/sources.local.toml``."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import os
|
|
6
|
+
import tomllib
|
|
7
|
+
from dataclasses import dataclass, field
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
|
|
10
|
+
PROJECT_ROOT = Path(__file__).resolve().parent.parent
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
@dataclass
|
|
14
|
+
class Source:
|
|
15
|
+
id: str
|
|
16
|
+
tag: str
|
|
17
|
+
kind: str
|
|
18
|
+
lang: str
|
|
19
|
+
path: str | None = None
|
|
20
|
+
glob: list[str] = field(default_factory=list)
|
|
21
|
+
exclude: list[str] = field(default_factory=list)
|
|
22
|
+
options: dict = field(default_factory=dict)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
@dataclass
|
|
26
|
+
class Config:
|
|
27
|
+
settings: dict
|
|
28
|
+
sources: list[Source]
|
|
29
|
+
deny_tokens: set[str]
|
|
30
|
+
root: Path
|
|
31
|
+
|
|
32
|
+
@property
|
|
33
|
+
def cache_dir(self) -> Path:
|
|
34
|
+
return self.root / self.settings["run"]["cache_dir"]
|
|
35
|
+
|
|
36
|
+
@property
|
|
37
|
+
def output_dir(self) -> Path:
|
|
38
|
+
return self.root / self.settings["run"]["output_dir"]
|
|
39
|
+
|
|
40
|
+
@property
|
|
41
|
+
def workers(self) -> int:
|
|
42
|
+
return int(os.environ.get("ZIMANKIT_WORKERS", self.settings["run"].get("workers", 4)))
|
|
43
|
+
|
|
44
|
+
def by_kind(self, *kinds: str) -> list[Source]:
|
|
45
|
+
return [s for s in self.sources if s.kind in kinds]
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def load_config(root: str | Path | None = None, sources_file: str | None = None) -> Config:
|
|
49
|
+
root = Path(root) if root else PROJECT_ROOT
|
|
50
|
+
with open(root / "config" / "pipeline.toml", "rb") as fh:
|
|
51
|
+
settings = tomllib.load(fh)
|
|
52
|
+
src_path = Path(sources_file) if sources_file else root / "config" / "sources.local.toml"
|
|
53
|
+
if not src_path.exists():
|
|
54
|
+
src_path = root / "config" / "sources.example.toml"
|
|
55
|
+
with open(src_path, "rb") as fh:
|
|
56
|
+
raw = tomllib.load(fh)
|
|
57
|
+
sources = []
|
|
58
|
+
known = {"id", "tag", "kind", "lang", "path", "glob", "exclude"}
|
|
59
|
+
for s in raw.get("source", []):
|
|
60
|
+
globs = s.get("glob", [])
|
|
61
|
+
sources.append(
|
|
62
|
+
Source(
|
|
63
|
+
id=s["id"], tag=s["tag"], kind=s["kind"], lang=s.get("lang", "auto"), path=s.get("path"),
|
|
64
|
+
glob=[globs] if isinstance(globs, str) else list(globs), exclude=list(s.get("exclude", [])),
|
|
65
|
+
options={k: v for k, v in s.items() if k not in known},
|
|
66
|
+
)
|
|
67
|
+
)
|
|
68
|
+
deny = {t.lower() for t in raw.get("deny_tokens", [])}
|
|
69
|
+
return Config(settings, sources, deny, root)
|
|
File without changes
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
# Central Kurdish closed-class words (authored reference data).
|
|
2
|
+
# word upos features
|
|
3
|
+
من PRON person=1sg|case=dir
|
|
4
|
+
تۆ PRON person=2sg|case=dir
|
|
5
|
+
ئەو PRON person=3sg|deixis=distal
|
|
6
|
+
ئێمە PRON person=1pl
|
|
7
|
+
ئێوە PRON person=2pl
|
|
8
|
+
ئەوان PRON person=3pl
|
|
9
|
+
خۆ PRON reflexive=yes
|
|
10
|
+
خۆم PRON reflexive=yes|person=1sg
|
|
11
|
+
خۆت PRON reflexive=yes|person=2sg
|
|
12
|
+
خۆی PRON reflexive=yes|person=3sg
|
|
13
|
+
خۆمان PRON reflexive=yes|person=1pl
|
|
14
|
+
خۆتان PRON reflexive=yes|person=2pl
|
|
15
|
+
خۆیان PRON reflexive=yes|person=3pl
|
|
16
|
+
ئەم DET deixis=proximal
|
|
17
|
+
ئەمە PRON deixis=proximal
|
|
18
|
+
ئەوە PRON deixis=distal
|
|
19
|
+
ئەمانە PRON deixis=proximal|number=pl
|
|
20
|
+
ئەوانە PRON deixis=distal|number=pl
|
|
21
|
+
کێ PRON prontype=int
|
|
22
|
+
چی PRON prontype=int
|
|
23
|
+
کام DET prontype=int
|
|
24
|
+
چۆن ADV prontype=int
|
|
25
|
+
کەی ADV prontype=int
|
|
26
|
+
بۆچی ADV prontype=int
|
|
27
|
+
لەکوێ ADV prontype=int
|
|
28
|
+
کوا ADV prontype=int
|
|
29
|
+
چەند DET prontype=int
|
|
30
|
+
هەموو DET prontype=tot
|
|
31
|
+
هەر DET prontype=tot
|
|
32
|
+
هیچ DET prontype=neg
|
|
33
|
+
هەندێک DET prontype=ind
|
|
34
|
+
لە ADP adptype=prep
|
|
35
|
+
بە ADP adptype=prep
|
|
36
|
+
بۆ ADP adptype=prep
|
|
37
|
+
لەگەڵ ADP adptype=prep
|
|
38
|
+
تا ADP adptype=prep
|
|
39
|
+
بێ ADP adptype=prep
|
|
40
|
+
بەبێ ADP adptype=prep
|
|
41
|
+
وەک ADP adptype=prep
|
|
42
|
+
لەسەر ADP adptype=prep
|
|
43
|
+
لەژێر ADP adptype=prep
|
|
44
|
+
لەناو ADP adptype=prep
|
|
45
|
+
لەبەر ADP adptype=prep
|
|
46
|
+
لەپێش ADP adptype=prep
|
|
47
|
+
لەدوای ADP adptype=prep
|
|
48
|
+
بەرەو ADP adptype=prep
|
|
49
|
+
دوای ADP adptype=prep
|
|
50
|
+
پێش ADP adptype=prep
|
|
51
|
+
نێوان ADP adptype=prep
|
|
52
|
+
دژی ADP adptype=prep
|
|
53
|
+
و CCONJ
|
|
54
|
+
یان CCONJ
|
|
55
|
+
یا CCONJ
|
|
56
|
+
بەڵام CCONJ
|
|
57
|
+
کە SCONJ
|
|
58
|
+
ئەگەر SCONJ
|
|
59
|
+
چونکە SCONJ
|
|
60
|
+
هەتا SCONJ
|
|
61
|
+
تاکو SCONJ
|
|
62
|
+
هەروەها ADV
|
|
63
|
+
بەڵێ INTJ
|
|
64
|
+
نەخێر INTJ
|
|
65
|
+
ئا INTJ
|
|
66
|
+
نا PART polarity=neg
|
|
67
|
+
نە PART polarity=neg
|
|
68
|
+
زۆر ADV degree=yes
|
|
69
|
+
کەم ADJ
|
|
70
|
+
ئێستا ADV
|
|
71
|
+
ئەمڕۆ ADV
|
|
72
|
+
دوێنێ ADV
|
|
73
|
+
سبەی ADV
|
|
74
|
+
لێرە ADV
|
|
75
|
+
لەوێ ADV
|
|
76
|
+
یەک NUM numtype=card
|
|
77
|
+
دوو NUM numtype=card
|
|
78
|
+
سێ NUM numtype=card
|
|
79
|
+
چوار NUM numtype=card
|
|
80
|
+
پێنج NUM numtype=card
|
|
81
|
+
شەش NUM numtype=card
|
|
82
|
+
حەوت NUM numtype=card
|
|
83
|
+
هەشت NUM numtype=card
|
|
84
|
+
نۆ NUM numtype=card
|
|
85
|
+
دە NUM numtype=card
|
|
86
|
+
سەد NUM numtype=card
|
|
87
|
+
هەزار NUM numtype=card
|
|
88
|
+
یەکەم ADJ numtype=ord
|
|
89
|
+
دووەم ADJ numtype=ord
|
|
90
|
+
سێیەم ADJ numtype=ord
|
|
91
|
+
هەیە VERB existential=yes|polarity=pos
|
|
92
|
+
نییە VERB existential=yes|polarity=neg
|
|
93
|
+
ی PART ezafe=yes
|
|
94
|
+
دا ADP adptype=post
|
|
95
|
+
ەوە ADP adptype=post
|
|
96
|
+
بۆیە ADV
|
|
97
|
+
بەڵکو CCONJ
|
|
98
|
+
لەلایەن ADP adptype=prep
|
|
99
|
+
بەرامبەر ADP adptype=prep
|
|
100
|
+
بەسەر ADP adptype=prep
|
|
101
|
+
چەندین DET prontype=ind
|
|
102
|
+
زیاتر ADV degree=cmp
|
|
103
|
+
کەمتر ADV degree=cmp
|
|
104
|
+
پێویستە AUX mood=necessitative
|
|
105
|
+
دەبێت AUX mood=necessitative
|
|
106
|
+
ئەوەیە PRON deixis=distal|copula=yes
|
|
107
|
+
تەنها ADV
|
|
108
|
+
تەنیا ADV
|
|
109
|
+
هێشتا ADV
|
|
110
|
+
پاشان ADV
|
|
111
|
+
بەتایبەتی ADV
|
|
112
|
+
کاک NOUN title=yes
|
|
113
|
+
هەمیشە ADV
|
|
114
|
+
هەردوو DET prontype=tot
|
|
115
|
+
ئایا PART prontype=int
|
|
116
|
+
ژێر ADP adptype=prep
|
|
117
|
+
دژ ADP adptype=prep
|
|
118
|
+
ڕەنگە ADV mood=potential
|
|
119
|
+
زۆربەی DET prontype=ind
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
# Central Kurdish core verbs (authored reference data).
|
|
2
|
+
# infinitive past_stem present_stem transitivity preverb notes
|
|
3
|
+
# transitivity: T = transitive (past tense is ergative), I = intransitive
|
|
4
|
+
# preverb: a separable prefix written before the aspect marker (هەڵ دەگرێت)
|
|
5
|
+
کردن کرد کە T
|
|
6
|
+
بوون بوو ب I
|
|
7
|
+
هاتن هات ێ I irregular present دێم, negative نایەم, imperative وەرە
|
|
8
|
+
چوون چوو چ I imperative بڕۆ is suppletive (from ڕۆیشتن)
|
|
9
|
+
گرتن گرت گر T passive stem گیر
|
|
10
|
+
دان دا دە T
|
|
11
|
+
خواردن خوارد خۆ T
|
|
12
|
+
بردن برد بە T
|
|
13
|
+
هێنان هێنا هێن T
|
|
14
|
+
زانین زانی زان T
|
|
15
|
+
ویستن ویست وێ T present uses a clitic subject: دەمەوێت
|
|
16
|
+
بینین بینی بین T
|
|
17
|
+
دیتن دیت بین T
|
|
18
|
+
گوتن گوت ڵێ T
|
|
19
|
+
وتن وت ڵێ T
|
|
20
|
+
نووسین نووسی نووس T
|
|
21
|
+
خوێندن خوێند خوێن T
|
|
22
|
+
کوشتن کوشت کوژ T
|
|
23
|
+
مردن مرد مر I
|
|
24
|
+
ڕۆیشتن ڕۆیشت ڕۆ I
|
|
25
|
+
نیشتن نیشت نیش I
|
|
26
|
+
هەستان هەستا هەست I
|
|
27
|
+
ناردن نارد نێر T
|
|
28
|
+
کڕین کڕی کڕ T
|
|
29
|
+
فرۆشتن فرۆشت فرۆش T
|
|
30
|
+
شکاندن شکاند شکێن T
|
|
31
|
+
شکان شکا شکێ I
|
|
32
|
+
سووتان سووتا سووتێ I
|
|
33
|
+
سووتاندن سووتاند سووتێن T
|
|
34
|
+
کەوتن کەوت کەو I
|
|
35
|
+
خستن خست خە T
|
|
36
|
+
ژیان ژیا ژی I
|
|
37
|
+
ترسان ترسا ترس I
|
|
38
|
+
پرسین پرسی پرس T
|
|
39
|
+
گەڕان گەڕا گەڕێ I
|
|
40
|
+
گەیشتن گەیشت گە I
|
|
41
|
+
گەیاندن گەیاند گەیەن T
|
|
42
|
+
شوشتن شوشت شۆ T
|
|
43
|
+
بەستن بەست بەست T
|
|
44
|
+
ناسین ناسی ناس T
|
|
45
|
+
خەوتن خەوت خەو I
|
|
46
|
+
گریان گریا گری I
|
|
47
|
+
کێشان کێشا کێش T
|
|
48
|
+
ڕشتن ڕشت ڕێژ T
|
|
49
|
+
هێشتن هێشت هێڵ T
|
|
50
|
+
مان ما مێن I
|
|
51
|
+
بیستن بیست بیس T
|
|
52
|
+
توانین توانی توان T
|
|
53
|
+
کەندن کەند کەن T
|
|
54
|
+
چاندن چاند چێن T
|
|
55
|
+
فڕین فڕی فڕ I
|
|
56
|
+
بارین باری بار I
|
|
57
|
+
گۆڕین گۆڕی گۆڕ T
|
|
58
|
+
گۆڕان گۆڕا گۆڕێ I
|
|
59
|
+
بڕین بڕی بڕ T
|
|
60
|
+
دۆزین دۆزی دۆز T
|
|
61
|
+
نووستن نووست نوو I
|
|
62
|
+
پێچان پێچا پێچ T
|
|
63
|
+
بژاردن بژارد بژێر T
|
|
64
|
+
پاراستن پاراست پارێز T
|
|
65
|
+
ژماردن ژمارد ژمێر T
|
|
66
|
+
سپاردن سپارد سپێر T
|
|
67
|
+
کوتان کوتا کوت T
|
|
68
|
+
لەرزین لەرزی لەرز I
|
|
69
|
+
بزووتن بزووت بزوو I
|
|
70
|
+
ڕووخان ڕووخا ڕووخێ I
|
|
71
|
+
کشان کشا کشێ I
|
|
72
|
+
تەقین تەقی تەق I
|
|
73
|
+
تەقاندن تەقاند تەقێن T
|
|
74
|
+
مژین مژی مژ T
|
|
75
|
+
گەزین گەزی گەز T
|
|
76
|
+
خنکان خنکا خنکێ I
|
|
77
|
+
خنکاندن خنکاند خنکێن T
|
|
78
|
+
ڕوانین ڕوانی ڕوان I
|
|
79
|
+
ئێشان ئێشا ئێش I
|
|
80
|
+
کەنین کەنی کەن I
|
|
81
|
+
خوێندنەوە خوێند خوێن T suffix -ەوە ("again, back")
|
|
82
|
+
کردنەوە کرد کە T
|
|
83
|
+
هاتنەوە هات ێ I
|
|
84
|
+
چوونەوە چوو چ I
|
|
85
|
+
گەڕانەوە گەڕا گەڕێ I
|
|
86
|
+
دۆزینەوە دۆزی دۆز T
|
|
87
|
+
مانەوە ما مێن I
|
|
88
|
+
هەڵگرتن گرت گر T هەڵ
|
|
89
|
+
هەڵبژاردن بژارد بژێر T هەڵ
|
|
90
|
+
وەرگرتن گرت گر T وەر
|
|
91
|
+
دەرکردن کرد کە T دەر
|
|
92
|
+
تێگەیشتن گەیشت گە I تێ
|
|
93
|
+
داخستن خست خە T دا
|
|
94
|
+
دانیشتن نیشت نیش I دا
|
|
95
|
+
ڕاگەیاندن گەیاند گەیەن T ڕا
|
|
96
|
+
ڕاکردن کرد کە I ڕا
|
|
97
|
+
لێدان دا دە T لێ
|
|
98
|
+
پێکەنین کەنی کەن I پێ
|
|
99
|
+
دەرکەوتن کەوت کەو I دەر
|
|
100
|
+
دەرچوون چوو چ I دەر
|
|
101
|
+
هەڵسان هەڵسا هەڵس I
|
|
102
|
+
پێکهاتن هات ێ I پێک
|
|
103
|
+
بەکارهێنان هێنا هێن T بەکار
|
|
104
|
+
دەستپێکردن کرد کە T دەستپێ
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
# Northern Kurdish closed-class words (authored reference data).
|
|
2
|
+
# word upos features
|
|
3
|
+
ez PRON person=1sg|case=dir
|
|
4
|
+
tu PRON person=2sg|case=dir
|
|
5
|
+
ew PRON person=3sg|case=dir|deixis=distal
|
|
6
|
+
em PRON person=1pl|case=dir
|
|
7
|
+
hûn PRON person=2pl|case=dir
|
|
8
|
+
ev PRON person=3sg|case=dir|deixis=proximal
|
|
9
|
+
min PRON person=1sg|case=obl
|
|
10
|
+
te PRON person=2sg|case=obl
|
|
11
|
+
wî PRON person=3sg|case=obl|gender=m|deixis=distal
|
|
12
|
+
wê PRON person=3sg|case=obl|gender=f|deixis=distal
|
|
13
|
+
vî PRON person=3sg|case=obl|gender=m|deixis=proximal
|
|
14
|
+
vê PRON person=3sg|case=obl|gender=f|deixis=proximal
|
|
15
|
+
me PRON person=1pl|case=obl
|
|
16
|
+
we PRON person=2pl|case=obl
|
|
17
|
+
wan PRON person=3pl|case=obl|deixis=distal
|
|
18
|
+
van PRON person=3pl|case=obl|deixis=proximal
|
|
19
|
+
xwe PRON reflexive=yes
|
|
20
|
+
yê PRON prontype=ezafe|gender=m|number=sg
|
|
21
|
+
ya PRON prontype=ezafe|gender=f|number=sg
|
|
22
|
+
yên PRON prontype=ezafe|number=pl
|
|
23
|
+
kî PRON prontype=int
|
|
24
|
+
çi PRON prontype=int
|
|
25
|
+
kîjan DET prontype=int
|
|
26
|
+
çend DET prontype=int
|
|
27
|
+
kengî ADV prontype=int
|
|
28
|
+
çawa ADV prontype=int
|
|
29
|
+
çima ADV prontype=int
|
|
30
|
+
her DET prontype=tot
|
|
31
|
+
hemû DET prontype=tot
|
|
32
|
+
tu DET prontype=neg
|
|
33
|
+
hin DET prontype=ind
|
|
34
|
+
di ADP adptype=prep
|
|
35
|
+
ji ADP adptype=prep
|
|
36
|
+
bi ADP adptype=prep
|
|
37
|
+
li ADP adptype=prep
|
|
38
|
+
bo ADP adptype=prep
|
|
39
|
+
jibo ADP adptype=prep
|
|
40
|
+
ber ADP adptype=prep
|
|
41
|
+
bê ADP adptype=prep
|
|
42
|
+
heta ADP adptype=prep
|
|
43
|
+
ta ADP adptype=prep
|
|
44
|
+
ligel ADP adptype=prep
|
|
45
|
+
digel ADP adptype=prep
|
|
46
|
+
nav ADP adptype=prep
|
|
47
|
+
navbera ADP adptype=prep
|
|
48
|
+
ser ADP adptype=prep
|
|
49
|
+
bin ADP adptype=prep
|
|
50
|
+
wek ADP adptype=prep
|
|
51
|
+
de ADP adptype=post
|
|
52
|
+
da ADP adptype=post
|
|
53
|
+
re ADP adptype=post
|
|
54
|
+
ra ADP adptype=post
|
|
55
|
+
ve ADP adptype=post
|
|
56
|
+
û CCONJ
|
|
57
|
+
an CCONJ
|
|
58
|
+
yan CCONJ
|
|
59
|
+
lê CCONJ
|
|
60
|
+
belê CCONJ
|
|
61
|
+
ku SCONJ
|
|
62
|
+
heke SCONJ
|
|
63
|
+
eger SCONJ
|
|
64
|
+
wekî SCONJ
|
|
65
|
+
jî PART additive=yes
|
|
66
|
+
ne PART polarity=neg
|
|
67
|
+
na PART polarity=neg
|
|
68
|
+
dê AUX tense=fut
|
|
69
|
+
ê AUX tense=fut
|
|
70
|
+
ma PART prontype=int
|
|
71
|
+
e AUX copula=yes|person=3sg
|
|
72
|
+
ye AUX copula=yes|person=3sg
|
|
73
|
+
im AUX copula=yes|person=1sg
|
|
74
|
+
in AUX copula=yes|person=pl
|
|
75
|
+
heye VERB existential=yes|polarity=pos
|
|
76
|
+
tune VERB existential=yes|polarity=neg
|
|
77
|
+
tuneye VERB existential=yes|polarity=neg
|
|
78
|
+
gelek ADV degree=yes
|
|
79
|
+
pir ADV degree=yes
|
|
80
|
+
niha ADV
|
|
81
|
+
îro ADV
|
|
82
|
+
duh ADV
|
|
83
|
+
sibê ADV
|
|
84
|
+
vir ADV
|
|
85
|
+
wir ADV
|
|
86
|
+
yek NUM numtype=card
|
|
87
|
+
du NUM numtype=card
|
|
88
|
+
sê NUM numtype=card
|
|
89
|
+
çar NUM numtype=card
|
|
90
|
+
pênc NUM numtype=card
|
|
91
|
+
şeş NUM numtype=card
|
|
92
|
+
heft NUM numtype=card
|
|
93
|
+
heşt NUM numtype=card
|
|
94
|
+
neh NUM numtype=card
|
|
95
|
+
deh NUM numtype=card
|
|
96
|
+
sed NUM numtype=card
|
|
97
|
+
hezar NUM numtype=card
|