German formatting for Wolfram alpha skill responses in format_de.py (#1669)

Response formatting for German language ordinals depending on cases/prepositions for dates
"am 1. März" -> "am ersten März" (on the first of March)
"der 1. März" -> "der erste März" (the first of March)
"1. März" -> "erster März" (first of March)

Response formatting for mathematical results
"10 ^ 2" -> "10 hoch 2" (ten to the power of two)

Can be tested via the corresponding test_format_de or by using wolfram alpha skill:
"Was ist die Fläche von Canada"
"Wann ist George Washington geboren"
pull/1696/head
f-e-l-i-x 2018-07-19 09:44:33 +02:00 committed by Steve Penrod
parent c140d5b889
commit 9e2dc9628e
15 changed files with 71 additions and 12 deletions

View File

@ -1,3 +1,3 @@
abbrechen
Vergiss es
verwerfen
verwerfen

View File

@ -1,3 +1,3 @@
Suche nach Updates
kleinen Moment während ich mich aktualisiere
bitte warte während ich mich aktualisiere
bitte warte während ich mich aktualisiere

View File

@ -1,4 +1,4 @@
Entschuldigung, ich habe das nicht verstanden
Ich fürchte, ich habe das nicht verstanden
kannst du das noch einmal wiederholen?
kannst du das nochmal sagen?
kannst du das nochmal sagen?

View File

@ -1 +1 @@
Ich werde jetzt die Interaktionsdaten zu Mycroft AI hochladen, damit ich intelligenter werden kann. Diese beinhalten die kompletten Aufzeichnungen ab dem Aktivierungswort.
Ich werde jetzt die Interaktionsdaten zu Mycroft AI hochladen, damit ich intelligenter werden kann. Diese beinhalten die kompletten Aufzeichnungen ab dem Aktivierungswort.

View File

@ -1 +1 @@
Hallo ich bin Mycroft, dein neuer Butler. Um dir zu assistieren brauche ich eine Verbindung zum Internet. Du kannst mich per Kabel verbinden oder per WLAN. Folge der Anweisung um das WLAN zu konfigurieren:
Hallo ich bin Mycroft, dein neuer Butler. Um dir zu assistieren brauche ich eine Verbindung zum Internet. Du kannst mich per Kabel verbinden oder per WLAN. Folge der Anweisung um das WLAN zu konfigurieren:

View File

@ -1,4 +1,4 @@
Es sieht so aus, als wäre ich nicht mit dem Internet verbunden
Es scheint als wäre ich nicht mit dem Internet verbunden
Ich kann das Internet gerade nicht erreichen
Es ist mir gerade nicht möglich das Internet zu erreichen
Es ist mir gerade nicht möglich das Internet zu erreichen

View File

@ -1 +1 @@
bitte warte einen moment bis ich fertig mit dem booten bin
bitte warte einen moment bis ich fertig mit dem booten bin

View File

@ -1,2 +1,2 @@
jalapeno: halapenyo
ai: ey ei
ai: ey ei

View File

@ -1,2 +1,2 @@
Ich bin auf dem neuesten Stand
Fähigkeiten aktualisiert. Ich bin jetzt bereit dir zu helfen.
Fähigkeiten aktualisiert. Ich bin jetzt bereit dir zu helfen.

View File

@ -1 +1 @@
Ein Fehler ist aufgetreten während der Aktualisierung der Fähigkeiten.
Ein Fehler ist aufgetreten während der Aktualisierung der Fähigkeiten.

View File

@ -1 +1 @@
SSH anmeldung ist nicht möglich.
SSH anmeldung ist nicht möglich.

View File

@ -1 +1 @@
SSH Anmeldung ist jetzt möglich.
SSH Anmeldung ist jetzt möglich.

View File

@ -18,6 +18,10 @@
from mycroft.util.lang.format_common import convert_to_mixed_fraction
from math import floor
months = ['januar', 'februar', 'märz', 'april', 'mai', 'juni',
'juli', 'august', 'september', 'oktober', 'november',
'dezember']
NUM_STRING_DE = {
0: 'null',
1: 'ein', # ein Viertel etc., nicht eins Viertel
@ -342,3 +346,43 @@ def nice_time_de(dt, speech=True, use_24hour=False, use_ampm=False):
speak += " morgens" # 03:00 - 11:59 morgens/in the morning
return speak
def nice_response_de(text):
# check for months and call nice_ordinal_de declension of ordinals
# replace "^" with "hoch" (to the power of)
words = text.split()
for idx, word in enumerate(words):
if word.lower() in months:
text = nice_ordinal_de(text)
if word == '^':
wordNext = words[idx + 1] if idx + 1 < len(words) else ""
if wordNext.isnumeric():
words[idx] = "hoch"
text = " ".join(words)
return text
def nice_ordinal_de(text):
# check for months for declension of ordinals before months
# depending on articles/prepositions
normalized_text = text
words = text.split()
for idx, word in enumerate(words):
wordNext = words[idx + 1] if idx + 1 < len(words) else ""
wordPrev = words[idx - 1] if idx > 0 else ""
if word[-1:] == ".":
if word[:-1].isdecimal():
if wordNext.lower() in months:
word = pronounce_ordinal_de(int(word[:-1]))
if wordPrev.lower() in ["am", "dem", "vom", "zum",
"(vom", "(am", "zum"]:
word += "n"
elif wordPrev.lower() not in ["der", "die", "das"]:
word += "r"
words[idx] = word
normalized_text = " ".join(words)
return normalized_text

View File

@ -20,6 +20,7 @@ import datetime
from mycroft.util.format import nice_number
from mycroft.util.format import nice_time
from mycroft.util.format import pronounce_number
from mycroft.util.lang.format_de import nice_response_de
from mycroft.util.lang.format_de import pronounce_ordinal_de
# fractions are not capitalized for now
@ -56,6 +57,18 @@ NUMBERS_FIXTURE_DE = {
}
class TestNiceResponse(unittest.TestCase):
def test_replace_ordinal(self):
self.assertEqual(nice_response_de("dies ist der 31. mai"),
"dies ist der einunddreißigste mai")
self.assertEqual(nice_response_de("es fängt am 31. mai an"),
"es fängt am einunddreißigsten mai an")
self.assertEqual(nice_response_de("der 31. mai"),
"der einunddreißigste mai")
self.assertEqual(nice_response_de("10 ^ 2"),
"10 hoch 2")
class TestNiceNumberFormat(unittest.TestCase):
def test_convert_float_to_nice_number(self):
for number, number_str in NUMBERS_FIXTURE_DE.items():

View File

@ -35,6 +35,8 @@ class TestNormalize(unittest.TestCase):
"dies ist der Extra-Test")
def test_extractnumber(self):
self.assertEqual(extractnumber("dies ist der 1. Test",
lang="de-de"), 1)
self.assertEqual(extractnumber("dies ist der erste Test",
lang="de-de"), 1)
self.assertEqual(extractnumber("dies ist 2 Test", lang="de-de"), 2)