Skip to content

Commit

Permalink
Rebased UK Parse PR (#56)
Browse files Browse the repository at this point in the history
* uk parsing

* class tests passing

* format tests fixes

* parse file cleaning, datetime tests fixes

* Refactor `uk-uk` to `uk-ua`

* Cleanup extra `print` calls and refactor to use `LOG.debug` for troubleshooting tests

* More review feedback cleanup

* Remove `LOG` since ovos-utils is not a dependency

* Troubleshoot whitespace causing test failure

* Update test_format_uk.py

* Update test_format_uk.py

* Update test_format_uk.py

* Update test_format_uk.py

night change

* Update test_format_uk.py

* Add uk-ua symbols configuration to include "`" in normalized utterances

* Replace syntax error in `format_uk` with note for reasoning behind extra strings

---------

Co-authored-by: mariiarazno <[email protected]>
Co-authored-by: Daniel McKnight <[email protected]>
Co-authored-by: NeonDmitry <[email protected]>
  • Loading branch information
4 people authored Jun 18, 2024
1 parent 204aff9 commit 7d67ffd
Show file tree
Hide file tree
Showing 9 changed files with 1,006 additions and 107 deletions.
1 change: 0 additions & 1 deletion lingua_franca/format.py
Original file line number Diff line number Diff line change
Expand Up @@ -240,7 +240,6 @@ def year_format(self, dt, lang, bc):
dt.year, number_tuple, lang, formatted_decade, formatted_hundreds)

s = self._format_string(dt.year, 'year_format', lang)

return re.sub(' +', ' ',
s.format(
year=str(dt.year),
Expand Down
42 changes: 27 additions & 15 deletions lingua_franca/lang/format_uk.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,6 @@ def nice_number_uk(number, speech=True, denominators=range(1, 21)):

if not speech:
if num == 0:
# TODO: Number grouping? E.g. "1,000,000"
return str(whole)
else:
return '{} {}/{}'.format(whole, num, den)
Expand All @@ -55,9 +54,6 @@ def nice_number_uk(number, speech=True, denominators=range(1, 21)):
den_str = _FRACTION_STRING_UK[den]

if whole == 0:
# if num == 1 and den <= 4:
# return_string = '{}'.format(den_str)
# else:
return_string = '{} {}'.format(num, den_str)
elif num == 1 and den == 2:
return_string = '{} з половиною'.format(whole)
Expand Down Expand Up @@ -370,7 +366,7 @@ def nice_time_uk(dt, speech=True, use_24hour=True, use_ampm=False):
speak += pronounce_number_uk(int(string[1]))
else:
speak = pronounce_hour_uk(int(string[0:2]))
if speak == None:
if speak is None:
speak = pronounce_number_uk(int(string[0:2]))

speak += " "
Expand Down Expand Up @@ -400,25 +396,29 @@ def nice_time_uk(dt, speech=True, use_24hour=True, use_ampm=False):
else:
speak = pronounce_hour_uk(hour)

if use_ampm:
if dt.hour < 4:
speak += " ночі"
elif dt.hour < 12:
speak += " ранку"
elif dt.hour < 18:
speak += " дня"
else:
speak += " вечора"

if dt.minute == 0:
if not use_ampm:
if dt.hour % 12 == 1:
return speak
return speak + " " + plural_uk(dt.hour % 12, "година", "години", "годин")
# TODO: the `one`/`few`/`many` structure doesn't cover
# all cases in Ukrainian
return speak + " " + plural_uk(dt.hour % 12, one="година",
few="години", many="годин")
else:
if dt.minute < 10:
speak += " нуль"
speak += " " + pronounce_number_uk(dt.minute)

if use_ampm:
if dt.hour < 4:
speak += " ночі"
elif dt.hour < 12:
speak += " ранку"
elif dt.hour < 18:
speak += " дня"
else:
speak += " вечора"
return speak


Expand Down Expand Up @@ -472,6 +472,17 @@ def pronounce_hour_uk(num):
if num in HOURS_UK.keys():
return HOURS_UK[num] + ' година'

def pronounce_mins_uk(num):
if num in _NUM_STRING_UK.keys():
if num == 1:
return 'одна хвилина'
if num == 2:
return 'дві хвилини'
if num in [10, 20, 30, 40, 50, 60]:
_NUM_STRING_UK[num] + 'хвилин'
else:
return


def pronounce_hour_genitive_uk(num):
if num in HOURS_UK.keys():
Expand All @@ -484,6 +495,7 @@ def pronounce_hour_genitive_uk(num):

def pronounce_number_feminine_uk(num):
pronounced = pronounce_number_uk(num)

num %= 100
if num % 10 == 1 and num // 10 != 1:
return pronounced[:-2] + "на"
Expand Down
6 changes: 3 additions & 3 deletions lingua_franca/lang/parse_uk.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
#
# Copyright 2017 Mycroft AI Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
Expand Down Expand Up @@ -511,7 +510,7 @@ def _extract_whole_number_with_text_uk(tokens, short_scale, ordinals):
word not in multiplies,
current_val >= 10
]):
# Backtrack - we've got numbers we can't sum
# Backtrack - we've got numbers we can't sum.
number_words.pop()
val = prev_val
break
Expand Down Expand Up @@ -1643,7 +1642,8 @@ def extract_numbers_uk(text, short_scale=True, ordinals=False):


class UkrainianNormalizer(Normalizer):
with open(resolve_resource_file("text/uk-ua/normalize.json"), encoding='utf8') as f:
with open(resolve_resource_file("text/uk-ua/normalize.json"),
encoding='utf8') as f:
_default_config = json.load(f)


Expand Down
117 changes: 59 additions & 58 deletions lingua_franca/res/text/uk-ua/date_time.json
Original file line number Diff line number Diff line change
Expand Up @@ -58,49 +58,49 @@
"yesterday": "вчора"
},
"date_time_format": {
"date_time": "{formatted_date} о {formatted_time}"
"date_time": "{formatted_date}, {formatted_time}"
},
"weekday": {
"0": "у понеділок",
"1": "у вівторок",
"2": "у середу",
"3": "у четвер",
"4": "у п'ятницю",
"5": "у суботу",
"6": "у неділю"
"0": "понеділок",
"1": "вівторок",
"2": "середа",
"3": "четвер",
"4": "п'ятниця",
"5": "субота",
"6": "неділя"
},
"date": {
"1": "першого",
"2": "другого",
"3": "третього",
"4": "четвертого",
"5": "п'ятого",
"6": "шостого",
"7": "сьомого",
"8": "восьмого",
"9": "дев'ятого",
"10": "десятого",
"11": "одинадцятого",
"12": "дванадцятого",
"13": "тринадцятого",
"14": "чотирнадцятого",
"15": "п'ятнадцятого",
"16": "шістнадцятого",
"17": "сімнадцятого",
"18": "вісімнадцятого",
"19": "дев'ятнадцятого",
"20": "двадцятого",
"21": "двадцять першого",
"22": "двадцять другого",
"23": "двадцять третього",
"24": "двадцять четвертого",
"25": "двадцять п'ятого",
"26": "двадцять шостого",
"27": "двадцять сьомого",
"28": "двадцять восьмого",
"29": "двадцять дев'ятого",
"30": "тридцятого",
"31": "тридцять першого"
"1": "перше",
"2": "друге",
"3": "третє",
"4": "четверте",
"5": "п'яте",
"6": "шосте",
"7": "сьоме",
"8": "восьме",
"9": "дев'яте",
"10": "десяте",
"11": "одинадцяте",
"12": "дванадцяте",
"13": "тринадцяте",
"14": "чотирнадцяте",
"15": "п'ятнадцяте",
"16": "шістнадцяте",
"17": "сімнадцяте",
"18": "вісімнадцяте",
"19": "дев'ятнадцяте",
"20": "двадцяте",
"21": "двадцять перше",
"22": "двадцять друге",
"23": "двадцять третє",
"24": "двадцять четверте",
"25": "двадцять п'яте",
"26": "двадцять шосте",
"27": "двадцять сьоме",
"28": "двадцять восьме",
"29": "двадцять дев'яте",
"30": "тридцяте",
"31": "тридцять перше"
},
"month": {
"1": "січня",
Expand All @@ -116,27 +116,28 @@
"11": "листопада",
"12": "грудня"
},

"number": {
"0": "нуль",
"1": "перший",
"2": "другий",
"3": "третій",
"4": "четвертий",
"5": "п'ятий",
"6": "шостий",
"7": "сьомий",
"8": "восьмий",
"9": "дев'ятий",
"10": "десятий",
"11": "одинадцятий",
"12": "дванадцятий",
"13": "тринадцятий",
"14": "чотирнадцятий",
"15": "п'ятнадцятий",
"16": "шістнадцятий",
"17": "сімнадцятий",
"18": "вісімнадцятий",
"19": "дев'ятнадцятий",
"1": "один",
"2": "два",
"3": "три",
"4": "чотири",
"5": "п'ять",
"6": "шість",
"7": "сім",
"8": "вісім",
"9": "дев'ять",
"10": "десять",
"11": "одинадцять",
"12": "дванадцять",
"13": "тринадцять",
"14": "чотирнадцять",
"15": "п'ятнадцять",
"16": "шестнадцать",
"17": "сімнадцять",
"18": "вісімнадцять",
"19": "дев'ятнадцять",
"20": "двадцять",
"30": "тридцять",
"40": "сорок",
Expand Down
23 changes: 12 additions & 11 deletions lingua_franca/res/text/uk-ua/date_time_test.json
Original file line number Diff line number Diff line change
@@ -1,22 +1,23 @@
{
"test_nice_year": {
"1": {"datetime_param": "1, 1, 31, 13, 22, 3", "bc": "True", "assertEqual": "перший до нашої ери" }
"1": {
"datetime_param": "1, 1, 31, 13, 22, 3",
"bc": "True",
"assertEqual": "один до нашої ери"
}
},

"test_nice_date": {
"1": {"datetime_param": "2017, 1, 31, 0, 2, 3", "now": "None", "assertEqual": "у вівторок, тридцять першого січня, дві тисячі сімнадцятий"},
"2": {"datetime_param": "2018, 2, 4, 0, 2, 3", "now": "2017, 1, 1, 0, 2, 3", "assertEqual": "у неділю, четвертого лютого, дві тисячі вісімнадцятий"},
"3": {"datetime_param": "2018, 2, 4, 0, 2, 3", "now": "2018, 1, 1, 0, 2, 3", "assertEqual": "у неділю, четвертого лютого"},
"4": {"datetime_param": "2018, 2, 4, 0, 2, 3", "now": "2018, 2, 1, 0, 2, 3", "assertEqual": "у неділю, четвертого"},
"1": {"datetime_param": "2017, 1, 31, 0, 2, 3", "now": "None", "assertEqual": "вівторок, тридцять перше січня, дві тисячі сімнадцять"},
"2": {"datetime_param": "2018, 2, 4, 0, 2, 3", "now": "2017, 1, 1, 0, 2, 3", "assertEqual": "неділя, четверте лютого, дві тисячі вісімнадцять"},
"3": {"datetime_param": "2018, 2, 4, 0, 2, 3", "now": "2018, 1, 1, 0, 2, 3", "assertEqual": "неділя, четверте лютого"},
"4": {"datetime_param": "2018, 2, 4, 0, 2, 3", "now": "2018, 2, 1, 0, 2, 3", "assertEqual": "неділя, четверте"},
"5": {"datetime_param": "2018, 2, 4, 0, 2, 3", "now": "2018, 2, 3, 0, 2, 3", "assertEqual": "завтра"},
"6": {"datetime_param": "2018, 2, 4, 0, 2, 3", "now": "2018, 2, 4, 0, 2, 3", "assertEqual": "сьогодні"},
"7": {"datetime_param": "2018, 2, 4, 0, 2, 3", "now": "2018, 2, 5, 0, 2, 3", "assertEqual": "вчора"},
"8": {"datetime_param": "2018, 2, 4, 0, 2, 3", "now": "2018, 2, 6, 0, 2, 3", "assertEqual": "у неділю, четвертого лютого"},
"9": {"datetime_param": "2021, 2, 4, 0, 2, 3", "now": "None", "assertEqual": "у четвер, четвертого лютого, дві тисячі двадцять перший"}
"8": {"datetime_param": "2018, 2, 4, 0, 2, 3", "now": "2019, 2, 6, 0, 2, 3", "assertEqual": "неділя, четверте лютого, дві тисячі вісімнадцять"}
},

"test_nice_date_time": {
"1": {"datetime_param": "2017, 1, 31, 13, 22, 3", "now": "None", "use_24hour": "False", "use_ampm": "True", "assertEqual": "у вівторок, тридцять першого січня, дві тисячі сімнадцятий о перша година двадцять два дня"},
"2": {"datetime_param": "2017, 1, 31, 13, 22, 3", "now": "None", "use_24hour": "True", "use_ampm": "False", "assertEqual": "у вівторок, тридцять першого січня, дві тисячі сімнадцятий о тринадцять двадцять два"}
"1": {"datetime_param": "2017, 1, 31, 13, 22, 3", "now": "None", "use_24hour": "False", "use_ampm": "True", "assertEqual": "вівторок, тридцять перше січня, дві тисячі сімнадцять, перша година дня двадцять два"},
"2": {"datetime_param": "2017, 1, 31, 13, 22, 3", "now": "None", "use_24hour": "True", "use_ampm": "False", "assertEqual": "вівторок, тридцять перше січня, дві тисячі сімнадцять, тринадцять двадцять два"}
}
}
2 changes: 2 additions & 0 deletions lingua_franca/res/text/uk-ua/normalize.json
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,8 @@
"тисяча": "1000",
"тисяч": "1000"
},
"symbols": [".", ",", ";", "_", "!", "?", "<", ">", "|", "(", ")", "=", "[",
"]", "{", "}", "»", "«", "*", "~", "^", "\""],
"stopwords": [],
"articles": []
}
Loading

0 comments on commit 7d67ffd

Please sign in to comment.