Skip to content

Commit

Permalink
dodati slova bez formov
Browse files Browse the repository at this point in the history
  • Loading branch information
bt2901 committed May 1, 2021
1 parent ea3dcca commit 10012d6
Show file tree
Hide file tree
Showing 3 changed files with 67 additions and 41 deletions.
36 changes: 16 additions & 20 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,14 +39,14 @@
**Како?** Запустити `convert.py`.

**Чи работаjе ли?** Не пополно.
* Потрєбно провєрити корректност алтернативных форм: "слова/словеса" jест две формы, "рєчены (рєчена, рєчено)" jест три формы и так далье.
* ~~Потрєбно провєрити корректност алтернативных форм: "слова/словеса" jест две формы, "рєчены (рєчена, рєчено)" jест три формы и так далье.~~
* Потрєбно провєрити корректност форм глагола "быти" и додати грамем за особливе времена
* Потрєбно измыслити добро изjасненjе грамем за меджусловjанскы язык (они будут имати разлику с русскими грамемами, jербо егзистуjут алтернативне северне/jужне формы, кратке/полны формы заименников и часованjе глаголов фунгуjе инако)
* Не jесм уверены, чи правилно ли имати присловник и придавник како различне формы jедного слова. Вероjетно, треба было бы вообче изчркнути формы, подобне `најбоље абхазски` и можно такоже изчркнути формы, подобне `најкомпјутернєјши`
* Потрєбно измыслити добру обработку вечеj, кторе имаjут нєколико словесов (Lemma = "zadržati dyh", але все формы не имаjут "дых") и возвратных глаголов
* Подобны ствар: osnovany na/podpirany od/polny naděje/prěznačeny za
* Потрєбно измыслити нєкаку методу работы с заименниками затоже прємного опциj анализа имаjут оне.
* Потрєбно додати до словников слова, кторе не има склонениj ("односно", "чи", "ли", "и")
* Не jесм уверены, чи правилно ли имати присловник и придавник како различне формы jедного слова. Вероjетно, ~~треба было бы вообче изчркнути формы, подобне `најбоље абхазски`~~ и можно такоже изчркнути формы, подобне `најкомпјутернєјши`
* Потрєбно измыслити добру обработку вечеj, кторе имаjут нєколико словесов (Lemma = "zadržati dyh", але все формы не имаjут "дых") ~~и возвратных глаголов~~
* ~~Подобны ствар: osnovany na/podpirany od/polny naděje/prěznačeny za~~
* ~~Потрєбно измыслити нєкаку методу работы с заименниками затоже прємного опциj анализа имаjут оне.~~
* ~~Потрєбно додати до словников слова, кторе не има склонениj ("односно", "чи", "ли", "и")~~

## _Генерациjа словников pymorphy2_

Expand All @@ -60,22 +60,18 @@
* `https://github.com/kmike/pymorphy2/blob/master/pymorphy2/lang/uk/_prefixes.py`

**Проблем**
Фаjл `suffixes.json` изгледаjе неправилно, але проблем најбоље вероjетно jест в минулом етапу (jа подзирам формы `најбоље`).
Фаjл `suffixes.json` изгледаjе неправилно, але проблем најбоље вероjетно jест в минулом етапу.
~~(jа подзирам формы `najbolje`)~~.

~~(jа подзирам формы `se`)~~.

(jа подзирам формы `тако рєчены`/`тако званы`).

**Проблем**
Леммы не сут правилне ("имєл" замєсто "имєти", "го" замєсто "он")

**Проблем**
Формы се дублируjут:
```
>>> morph.parse("добро")
[
Parse(word='добро', tag=OpencorporaTag('ADVB'), normal_form='добро', score=1.0, methods_stack=((DictionaryAnalyzer(), 'добро', 12, 0),)),
Parse(word='добро', tag=OpencorporaTag('NOUN,neut'), normal_form='добро', score=1.0, methods_stack=((DictionaryAnalyzer(), 'добро', 17, 0),)),
Parse(word='добро', tag=OpencorporaTag('NOUN,neut sing,nomn'), normal_form='добро', score=1.0, methods_stack=((DictionaryAnalyzer(), 'добро', 17, 1),)),
Parse(word='добро', tag=OpencorporaTag('NOUN,neut sing,accs'), normal_form='добро', score=1.0, methods_stack=((DictionaryAnalyzer(), 'добро', 17, 3),)),
Parse(word='добро', tag=OpencorporaTag('NOUN,neut sing,voct'), normal_form='добро', score=1.0, methods_stack=((DictionaryAnalyzer(), 'добро', 17, 13),)),
...
]
```
Имамо ту форму `NOUN neut` (лемму?) и форму `NOUN,neut sing, nomn`. Туте формы треба быти jеднаковыми, але разбор има обедве.
Поредок тегов в разбору

## _Конверсија до формата словников AZ.js_

Expand Down
56 changes: 40 additions & 16 deletions convert.py
Original file line number Diff line number Diff line change
Expand Up @@ -470,6 +470,8 @@ def yield_all_verb_forms(forms_obj, pos, base):
# TODO: will fuck up if multi-word verb
parts = (forms_obj[time]
.replace("ne ", "")
.replace("ši sá", "ša sę").replace("ši sé", "še sę") # THIS MAKES PARSER NON STANDARD COMPLIANT
.replace(" sę", "")
.replace(",", "").replace("(", "") .replace(")", "")
.split(" "))
for i, entry in enumerate(parts):
Expand Down Expand Up @@ -542,6 +544,7 @@ def iterate_json(forms_obj, pos_data, base):


base_tag_set = {}
INDECLINABLE_POS = {'adverb', 'conjunction', 'preposition', 'interjection', 'particle'}


class Dictionary(object):
Expand All @@ -562,33 +565,51 @@ def __init__(self, fname, mapping):
word_id, isv_lemma, addition, pos, *rest = ujson.loads(raw_data)
forms_obj_array = ujson.loads(forms)

# HOTFIX TIME!
if word_id == "36454":
pos = "adj."
if word_id == "36649":
pos = "f."

for form_num, forms_obj in enumerate(forms_obj_array):
add_tag = set() if form_num == 0 else {f"alt{form_num}"}

details_set = set(getArr(pos)) | add_tag
# if infer_pos is None, then fallback to the first form
pos = infer_pos(details_set) or pos
if pos == "noun":
details_set |= {'noun'}

if not isinstance(forms_obj, dict):
if forms_obj != '':
# add isolated lemma

if pos in INDECLINABLE_POS and " " not in isv_lemma:
current_lemma = Lemma(
isv_lemma,
lemma_form_tags=details_set,
)
current_lemma.add_form(WordForm(
isv_lemma,
tags=details_set,
))
self.add_lemma(current_lemma)
continue
# print([isv_lemma, pos_formatted, forms_obj])
if " " in isv_lemma and "," not in isv_lemma and isinstance(forms_obj, dict):
splitted = isv_lemma.split()
if len(splitted) == 2 and "sę" in splitted:
counter_se += 1
else:
counter_multiword += 1
# TODO TODO XXX
if "verb" not in pos_formatted:
# TODO TODO XXX
# print(isv_lemma.split(), pos_formatted)
# print(forms_obj)
counter_multiword_verb += 1


# Here we've found a new lemma, let's add old one to the list
# and continue
print(isv_lemma.split(), pos_formatted)
print(forms_obj)
else:
print(isv_lemma.split(), pos_formatted, forms_obj['infinitive'])
# continue

details_set = set(getArr(pos)) | add_tag
# if infer_pos is None, then fallback to the first form
pos = infer_pos(details_set) or pos
if pos == "noun":
details_set |= {'noun'}
current_lemma = Lemma(
isv_lemma,
lemma_form_tags=details_set,
Expand All @@ -615,6 +636,9 @@ def __init__(self, fname, mapping):
if pos == "verb":
if forms_obj['infinitive'].replace("ì", "i") != isv_lemma:
current_lemma.lemma_form.form = forms_obj['infinitive']
if pos == "pronoun":
# replace го -> он
pass
# if "adj" in pos:
#if isv_lemma == "žučji":
# print(pos, isv_lemma, pos_formatted)
Expand Down Expand Up @@ -645,17 +669,17 @@ def export_to_xml(self, fname, lang="isv_cyr"):
# if "NPRO" in lemma.lemma_form.tags:
# if "NPRO" in str(lemma_xml):
if "pron" in lemma.lemma_form.tags:
print(lemma.lemma_form.tags, lemma.lemma_form.form)
# print(lemma.lemma_form.tags, lemma.lemma_form.form)
signature = "|".join(
f"{k}: {v[0].form}" for i, (k, v) in enumerate(lemma.forms.items())
if i != 0
)
if signature in known_pronouns:
print(known_pronouns[signature], "<-", lemma.lemma_form.form)
# print(known_pronouns[signature], "<-", lemma.lemma_form.form)
continue
else:
known_pronouns[signature] = lemma.lemma_form.form
print(f"=> SAVING: {lemma.lemma_form.form}")
# print(f"=> SAVING: {lemma.lemma_form.form}")
#print(lemma_xml)
#print(lemma_xml.write())
lemmata.append(lemma_xml)
Expand Down
16 changes: 11 additions & 5 deletions run_generate.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,9 @@ def log_doubleform(sender, tags_signature):

DIR = "C:\\dev"
DEBUG = True
RUN_EXPORT = False
RUN_CONVERT = False
RUN_BUILD_DICTS = False
RUN_EXPORT = True
RUN_CONVERT = True
RUN_BUILD_DICTS = True

if RUN_EXPORT:
subprocess.check_output(
Expand Down Expand Up @@ -73,11 +73,17 @@ def log_doubleform(sender, tags_signature):


out_dir_etm = join(DIR, "pymorphy2-dicts", "out_isv_etm")

etm_morph = pymorphy2.MorphAnalyzer(
out_dir_etm,
units=[pymorphy2.units.DictionaryAnalyzer()],
char_substitutes={'e': 'ě', 'a': 'å', 'u': 'ų'}
units=[pymorphy2.units.DictionaryAnalyzer(), pymorphy2.units.KnownSuffixAnalyzer()],
char_substitutes={
'e': 'ě', 'c': 'č', 'z': 'ž', 's': 'š',
'a': 'å', 'u': 'ų', 'č': 'ć', 'e': 'ę',
# 'dž': 'đ' # ne funguje
}
)

print(etm_morph.parse("ljudij"))
print(etm_morph.parse("råzumějų"))
print(etm_morph.parse("razumeju"))
Expand Down

0 comments on commit 10012d6

Please sign in to comment.