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.
Files changed (48) hide show
  1. zimankit/__init__.py +60 -0
  2. zimankit/__main__.py +3 -0
  3. zimankit/cli.py +209 -0
  4. zimankit/config.py +69 -0
  5. zimankit/data/__init__.py +0 -0
  6. zimankit/data/ckb_function_words.tsv +119 -0
  7. zimankit/data/ckb_verbs_core.tsv +104 -0
  8. zimankit/data/kmr_function_words.tsv +97 -0
  9. zimankit/data/kmr_verbs_core.tsv +68 -0
  10. zimankit/dependency.py +394 -0
  11. zimankit/lexicon/__init__.py +0 -0
  12. zimankit/lexicon/builder.py +518 -0
  13. zimankit/lexicon/corpus.py +216 -0
  14. zimankit/lexicon/export.py +627 -0
  15. zimankit/lexicon/harvest.py +224 -0
  16. zimankit/lexicon/wiki_lexicon.py +205 -0
  17. zimankit/rules.py +135 -0
  18. zimankit/shared_utils/__init__.py +0 -0
  19. zimankit/shared_utils/lid.py +186 -0
  20. zimankit/shared_utils/normalizer.py +115 -0
  21. zimankit/shared_utils/phonology_core.py +183 -0
  22. zimankit/shared_utils/schema.py +95 -0
  23. zimankit/shared_utils/text_helpers.py +157 -0
  24. zimankit/shared_utils/tokenizer.py +85 -0
  25. zimankit/shared_utils/unicode_tables.py +197 -0
  26. zimankit/skills_ckb/__init__.py +0 -0
  27. zimankit/skills_ckb/config.toml +19 -0
  28. zimankit/skills_ckb/morphology.py +311 -0
  29. zimankit/skills_ckb/orthography.py +176 -0
  30. zimankit/skills_ckb/phonology_ipa.py +216 -0
  31. zimankit/skills_ckb/verbs.py +365 -0
  32. zimankit/skills_kmr/__init__.py +0 -0
  33. zimankit/skills_kmr/config.toml +16 -0
  34. zimankit/skills_kmr/morphology.py +229 -0
  35. zimankit/skills_kmr/orthography.py +90 -0
  36. zimankit/skills_kmr/phonology_ipa.py +124 -0
  37. zimankit/skills_kmr/syntax.py +137 -0
  38. zimankit/skills_kmr/translit.py +57 -0
  39. zimankit/skills_kmr/verbs.py +214 -0
  40. zimankit/tools/__init__.py +0 -0
  41. zimankit/tools/mdx_extractor.py +125 -0
  42. zimankit/tools/zim_cleaner.py +110 -0
  43. zimankit-0.2.0.dist-info/METADATA +178 -0
  44. zimankit-0.2.0.dist-info/RECORD +48 -0
  45. zimankit-0.2.0.dist-info/WHEEL +5 -0
  46. zimankit-0.2.0.dist-info/entry_points.txt +2 -0
  47. zimankit-0.2.0.dist-info/licenses/LICENSE +675 -0
  48. 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
@@ -0,0 +1,3 @@
1
+ from .cli import main
2
+
3
+ raise SystemExit(main())
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