def test_extract_number(self): self.assertEqual(extract_number("dette er den første test", lang="da-dk"), 1) # self.assertEqual(extract_number("dette er den 1. test", # lang="da-dk"), # 1) self.assertEqual(extract_number("dette er den anden test", lang="da-dk"), 2) # self.assertEqual(extract_number("dette er den 2. test", # lang="da-dk"), # 2) self.assertEqual( extract_number("dette er den tredie test", lang="da-dk"), 3) self.assertEqual( extract_number("dette er test nummer fire", lang="da-dk"), 4) self.assertEqual( extract_number("en trediedel af en kop", lang="da-dk"), 1.0 / 3.0) self.assertEqual(extract_number("tre kopper", lang="da-dk"), 3) self.assertEqual(extract_number("1/3 kop", lang="da-dk"), 1.0 / 3.0)
def test_extract_number(self): self.assertEqual(extract_number("this is the first test", ordinals=True), 1) self.assertEqual(extract_number("this is 2 test"), 2) self.assertEqual(extract_number("this is second test", ordinals=True), 2) self.assertEqual(extract_number("this is the third test"), 1.0 / 3.0) self.assertEqual(extract_number("this is the third test", ordinals=True), 3.0) self.assertEqual(extract_number("this is test number 4"), 4) self.assertEqual(extract_number("one third of a cup"), 1.0 / 3.0) self.assertEqual(extract_number("three cups"), 3) self.assertEqual(extract_number("1/3 cups"), 1.0 / 3.0) self.assertEqual(extract_number("quarter cup"), 0.25) self.assertEqual(extract_number("1/4 cup"), 0.25) self.assertEqual(extract_number("one fourth cup"), 0.25) self.assertEqual(extract_number("2/3 cups"), 2.0 / 3.0) self.assertEqual(extract_number("3/4 cups"), 3.0 / 4.0) self.assertEqual(extract_number("1 and 3/4 cups"), 1.75) self.assertEqual(extract_number("1 cup and a half"), 1.5) self.assertEqual(extract_number("one cup and a half"), 1.5) self.assertEqual(extract_number("one and a half cups"), 1.5) self.assertEqual(extract_number("one and one half cups"), 1.5) self.assertEqual(extract_number("three quarter cups"), 3.0 / 4.0) self.assertEqual(extract_number("three quarters cups"), 3.0 / 4.0) self.assertEqual(extract_number("twenty two"), 22) self.assertEqual(extract_number("two hundred"), 200) self.assertEqual(extract_number("nine thousand"), 9000) self.assertEqual(extract_number("six hundred sixty six"), 666) self.assertEqual(extract_number("two million"), 2000000) self.assertEqual(extract_number("two million five hundred thousand " "tons of spinning metal"), 2500000) self.assertEqual(extract_number("six trillion"), 6000000000000.0) self.assertEqual(extract_number("six trillion", short_scale=False), 6e+18) self.assertEqual(extract_number("one point five"), 1.5) self.assertEqual(extract_number("three dot fourteen"), 3.14) self.assertEqual(extract_number("zero point two"), 0.2) self.assertEqual(extract_number("billions of years older"), 1000000000.0) self.assertEqual(extract_number("billions of years older", short_scale=False), 1000000000000.0) self.assertEqual(extract_number("one hundred thousand"), 100000) self.assertEqual(extract_number("minus 2"), -2) self.assertEqual(extract_number("negative seventy"), -70) self.assertEqual(extract_number("thousand million"), 1000000000) self.assertEqual(extract_number("sixth third"), 1 / 6 / 3) self.assertEqual(extract_number("sixth third", ordinals=True), 3) self.assertEqual(extract_number("thirty second"), 30) self.assertEqual(extract_number("thirty second", ordinals=True), 32) self.assertEqual(extract_number("this is the billionth test", ordinals=True), 1e09) self.assertEqual(extract_number("this is the billionth test"), 1e-9) self.assertEqual(extract_number("this is the billionth test", ordinals=True, short_scale=False), 1e12) self.assertEqual(extract_number("this is the billionth test", short_scale=False), 1e-12) # TODO handle this case # self.assertEqual( # extract_number("6 dot six six six"), # 6.666) self.assertTrue(extract_number("The tennis player is fast") is False) self.assertTrue(extract_number("fraggle") is False) self.assertTrue(extract_number("fraggle zero") is not False) self.assertEqual(extract_number("fraggle zero"), 0) self.assertTrue(extract_number("grobo 0") is not False) self.assertEqual(extract_number("grobo 0"), 0) self.assertEqual(extract_number("a couple of beers"), 2) self.assertEqual(extract_number("a couple hundred beers"), 200) self.assertEqual(extract_number("a couple thousand beers"), 2000)
def test_extractnumber_pt(self): self.assertEqual(extract_number("isto e o primeiro teste", lang="pt"), 1) self.assertEqual(extract_number("isto e o 2 teste", lang="pt"), 2) self.assertEqual(extract_number("isto e o segundo teste", lang="pt"), 2) self.assertEqual(extract_number(u"isto e um terço de teste", lang="pt"), 1.0 / 3.0) self.assertEqual(extract_number("isto e o teste numero quatro", lang="pt"), 4) self.assertEqual(extract_number(u"um terço de chavena", lang="pt"), 1.0 / 3.0) self.assertEqual(extract_number("3 canecos", lang="pt"), 3) self.assertEqual(extract_number("1/3 canecos", lang="pt"), 1.0 / 3.0) self.assertEqual(extract_number("quarto de hora", lang="pt"), 0.25) self.assertEqual(extract_number("1/4 hora", lang="pt"), 0.25) self.assertEqual(extract_number("um quarto hora", lang="pt"), 0.25) self.assertEqual(extract_number("2/3 pinga", lang="pt"), 2.0 / 3.0) self.assertEqual(extract_number("3/4 pinga", lang="pt"), 3.0 / 4.0) self.assertEqual(extract_number("1 e 3/4 cafe", lang="pt"), 1.75) self.assertEqual(extract_number("1 cafe e meio", lang="pt"), 1.5) self.assertEqual(extract_number("um cafe e um meio", lang="pt"), 1.5) self.assertEqual( extract_number("tres quartos de chocolate", lang="pt"), 3.0 / 4.0) self.assertEqual(extract_number(u"três quarto de chocolate", lang="pt"), 3.0 / 4.0) self.assertEqual(extract_number("sete ponto cinco", lang="pt"), 7.5) self.assertEqual(extract_number("sete ponto 5", lang="pt"), 7.5) self.assertEqual(extract_number("sete e meio", lang="pt"), 7.5) self.assertEqual(extract_number("sete e oitenta", lang="pt"), 7.80) self.assertEqual(extract_number("sete e oito", lang="pt"), 7.8) self.assertEqual(extract_number("sete e zero oito", lang="pt"), 7.08) self.assertEqual(extract_number("sete e zero zero oito", lang="pt"), 7.008) self.assertEqual(extract_number("vinte treze avos", lang="pt"), 20.0 / 13.0) self.assertEqual(extract_number("seis virgula seiscentos e sessenta", lang="pt"), 6.66) self.assertEqual(extract_number("seiscentos e sessenta e seis", lang="pt"), 666) self.assertEqual(extract_number("seiscentos ponto zero seis", lang="pt"), 600.06) self.assertEqual(extract_number("seiscentos ponto zero zero seis", lang="pt"), 600.006) self.assertEqual(extract_number("seiscentos ponto zero zero zero seis", lang="pt"), 600.0006)
def test_extractnumber_it(self): """ Test cases for Italian extract_number, lang='it' """ self.assertEqual(extract_number('questo è il primo test', lang='it'), 1) self.assertEqual(extract_number('questo è il 2 test', lang='it'), 2) self.assertEqual(extract_number('questo è il secondo test', lang='it', ordinals=True), 2) self.assertEqual(extract_number('questo è un terzo di test', lang='it'), 1.0 / 3.0) self.assertEqual(extract_number('questo è il terzo test', lang='it', ordinals=True), 3.0) self.assertEqual(extract_number('questo è il trentaseiesimo test', lang='it'), 36.0) self.assertEqual(extract_number('questo è il test numero 4', lang='it'), 4) self.assertEqual(extract_number('una tazza', lang='it'), 1) self.assertEqual(extract_number('un gatto', lang='it'), 1) self.assertEqual(extract_number('un terzo di tazza', lang='it'), 1.0 / 3.0) self.assertEqual(extract_number('2 quinti di tazza', lang='it'), 0.4) self.assertEqual(extract_number('due quinti di tazza', lang='it'), 0.4) self.assertEqual(extract_number('tre tazze', lang='it'), 3) self.assertEqual(extract_number('1/3 tazze', lang='it'), 1.0 / 3.0) self.assertEqual(extract_number('un quarto di tazza', lang='it'), 0.25) self.assertEqual(extract_number('1/4 tazza', lang='it'), 0.25) self.assertEqual(extract_number('2/3 tazza', lang='it'), 2.0 / 3.0) self.assertEqual(extract_number('3/4 tazza', lang='it'), 3.0 / 4.0) self.assertEqual(extract_number('1 e 1/4 tazza', lang='it'), 1.25) self.assertEqual(extract_number('1 tazza e mezzo', lang='it'), 1.5) self.assertEqual(extract_number('una tazza e mezzo', lang='it'), 1.5) self.assertEqual(extract_number('una e mezza tazza', lang='it'), 1.5) self.assertEqual(extract_number('una e una mezza tazza', lang='it'), 1.5) self.assertEqual(extract_number('tre quarti di tazza', lang='it'), 3.0 / 4.0) self.assertEqual(extract_number('ventidue', lang='it'), 22) self.assertEqual(extract_number('duecento', lang='it'), 200) self.assertEqual(extract_number('novemila', lang='it'), 9000) self.assertEqual(extract_number('duemilioni', lang='it', short_scale=False), 2000000) self.assertEqual(extract_number('duemilionicinquecentomila ' 'tonnellate di metallo', lang='it'), 2500000) self.assertEqual(extract_number('duemilioni cinquecentomila ' 'tonnellate di metallo', lang='it'), 2500000) self.assertEqual(extract_number('sei trilioni', lang='it'), 6000000000000000000.0) self.assertEqual(extract_number('sei trilioni', short_scale=True, lang='it'), 6e+18) self.assertEqual(extract_number('unmiliardounmilione', lang='it', short_scale=False), 1001000000) self.assertEqual(extract_number('unmiliardocento', lang='it', short_scale=False), 1000000100) self.assertEqual(extract_number('duemiliardiunmilionecentotrentadue', lang='it'), 2001000132) self.assertEqual(extract_number('venti diciassettesimi', lang='it'), 20.0/17.0) self.assertEqual(extract_number('uno punto cinque', lang='it'), 1.5) self.assertEqual(extract_number('tre punto quattordici', lang='it'), 3.14) self.assertEqual(extract_number('zero punto due', lang='it'), 0.2) self.assertEqual(extract_number('vecchio miliardi di anni', lang='it'), 1000000000.0) self.assertEqual(extract_number('vecchio trilioni di anni', short_scale=False, lang='it'), 1000000000000000000.0) self.assertEqual(extract_number('centomila', lang='it'), 100000) self.assertEqual(extract_number('millequattrocentonovantadue', lang='it'), 1492) self.assertEqual(extract_number('meno 2', lang='it'), -2) self.assertEqual(extract_number('meno settanta', lang='it'), -70) self.assertEqual(extract_number('mille milioni', lang='it'), 1000000000) self.assertEqual(extract_number('millecentouno', lang='it'), 1101) self.assertEqual(extract_number('un sesto terzo', lang='it'), 1 / 6 / 3) self.assertEqual(extract_number('trenta secondi', lang='it'), 30) self.assertEqual(extract_number('trenta secondi', lang='it', ordinals=True), 30) self.assertEqual(extract_number('sette e qualcosa', lang='it'), 7.0) self.assertEqual(extract_number('sette punto 5', lang='it'), 7.5) self.assertEqual(extract_number('sette punto 575', lang='it'), 7.575) self.assertEqual(extract_number('sette e mezzo', lang='it'), 7.5) self.assertEqual(extract_number('sette e ottanta', lang='it'), 7.80) self.assertEqual(extract_number('sette e otto', lang='it'), 7.8) self.assertEqual(extract_number('sette e zero otto', lang='it'), 7.08) self.assertEqual(extract_number('sette e zero zero zero otto gradi', lang='it'), 7.0008) self.assertEqual(extract_number('venti tredicesimi', lang='it'), 20.0 / 13.0) self.assertEqual(extract_number('venti tredicesimi', lang='it', short_scale=True), 20.0 / 13.0) self.assertEqual(extract_number('sei virgola sessantasei', lang='it'), 6.66) self.assertEqual(extract_number('sei virgola sessantasei', lang='it'), 6.66) self.assertEqual(extract_number('seicentosessantasei', lang='it'), 666) self.assertEqual(extract_number('seicento sessantasei', lang='it'), 666) self.assertEqual(extract_number('mille quattrocento novantadue', lang='it'), 1492) self.assertEqual(extract_number('millequattrocentonovantadue', lang='it'), 1492) self.assertEqual(extract_number('sei cento punto zero sei', lang='it'), 600.06) self.assertEqual(extract_number('seicento punto zero zero sei', lang='it'), 600.006) self.assertEqual(extract_number('seicento punto zero zero zero sei', lang='it'), 600.0006) self.assertEqual(extract_number('tre decimi ', lang='it'), 0.30000000000000004) self.assertEqual(extract_number('dodici centesimi', lang='it'), 0.12) # self.assertEqual(extract_number('cinque e quarantadue millesimi', # lang='it'), 5.042) self.assertEqual(extract_number('milleuno', lang='it'), 1001) self.assertEqual(extract_number('due mila ventidue dollari ', lang='it'), 2022) self.assertEqual(extract_number( 'centoquattordicimilaquattrocentoundici dollari ', lang='it', ordinals=True, short_scale=True), 114411) self.assertEqual(extract_number('ventitre dollari ', lang='it'), 23) self.assertEqual(extract_number('ventuno anni ', lang='it'), 21) self.assertEqual(extract_number('dodici e quarantacinque ', lang='it'), 12.45) self.assertEqual(extract_number('avvisa se qualcuno arriva ', lang='it'), False) self.assertTrue(extract_number('Il giocatore di tennis è veloce', lang='it') is False) self.assertTrue(extract_number('nessuno', lang='it') is False) self.assertTrue(extract_number('fraggle zero', lang='it') is not False) self.assertEqual(extract_number('fraggle zero', lang='it'), 0) self.assertTrue(extract_number('grobo 0', lang='it') is not False) self.assertEqual(extract_number('grobo 0', lang='it'), 0) self.assertEqual(extract_number('un paio di birre', lang='it'), 2) self.assertEqual(extract_number('un centinaio di birre', lang='it'), 100) self.assertEqual(extract_number('un paio di migliaia di birre', lang='it'), 2000) self.assertEqual(extract_number('una decina di monete', lang='it'), 10) self.assertEqual(extract_number('tre dozzine di uova', lang='it'), 36) self.assertEqual(extract_number('zero gatti', lang='it'), 0)
def test_extract_number(self): self.assertEqual(extract_number("dies ist der 1. Test", lang="de-de"), 1) self.assertEqual(extract_number("dies ist der erste Test", lang="de-de"), 1) self.assertEqual(extract_number("dies ist 2 Test", lang="de-de"), 2) self.assertEqual(extract_number("dies ist zweiter Test", lang="de-de"), 2) self.assertEqual( extract_number("dies ist der dritte Test", lang="de-de"), 3) self.assertEqual( extract_number("dies ist der Test Nummer 4", lang="de-de"), 4) self.assertEqual(extract_number("ein drittel einer Tasse", lang="de-de"), 1.0 / 3.0) self.assertEqual(extract_number("drei Tassen", lang="de-de"), 3) self.assertEqual(extract_number("1/3 Tasse", lang="de-de"), 1.0 / 3.0) self.assertEqual(extract_number("eine viertel Tasse", lang="de-de"), 0.25) self.assertEqual(extract_number("1/4 Tasse", lang="de-de"), 0.25) self.assertEqual(extract_number("viertel Tasse", lang="de-de"), 0.25) self.assertEqual(extract_number("2/3 Tasse", lang="de-de"), 2.0 / 3.0) self.assertEqual(extract_number("3/4 Tasse", lang="de-de"), 3.0 / 4.0) self.assertEqual(extract_number("1 und 3/4 Tassen", lang="de-de"), 1.75) self.assertEqual(extract_number("1 Tasse und eine halbe", lang="de-de"), 1.5) self.assertEqual( extract_number("eine Tasse und eine halbe", lang="de-de"), 1.5) self.assertEqual( extract_number("eine und eine halbe Tasse", lang="de-de"), 1.5) self.assertEqual(extract_number("ein und ein halb Tassen", lang="de-de"), 1.5) self.assertEqual(extract_number("drei Viertel Tasse", lang="de-de"), 3.0 / 4.0) self.assertEqual(extract_number("drei Viertel Tassen", lang="de-de"), 3.0 / 4.0)
def test_extractnumber_fr(self): self.assertEqual(extract_number("voici le premier test", lang="fr-fr"), 1) self.assertEqual(extract_number("c'est 2 tests", lang="fr-fr"), 2) self.assertEqual(extract_number("voici le second test", lang="fr-fr"), 2) self.assertEqual(extract_number("voici trois tests", lang="fr-fr"), 3) self.assertEqual(extract_number("voici le test numéro 4", lang="fr-fr"), 4) self.assertEqual(extract_number("un tiers de litre", lang="fr-fr"), 1.0 / 3.0) self.assertEqual(extract_number("3 cuillères", lang="fr-fr"), 3) self.assertEqual(extract_number("1/3 de litre", lang="fr-fr"), 1.0 / 3.0) self.assertEqual(extract_number("un quart de bol", lang="fr-fr"), 0.25) self.assertEqual(extract_number("1/4 de verre", lang="fr-fr"), 0.25) self.assertEqual(extract_number("2/3 de bol", lang="fr-fr"), 2.0 / 3.0) self.assertEqual(extract_number("3/4 de bol", lang="fr-fr"), 3.0 / 4.0) self.assertEqual(extract_number("1 et 3/4 de bol", lang="fr-fr"), 1.75) self.assertEqual(extract_number("1 bol et demi", lang="fr-fr"), 1.5) self.assertEqual(extract_number("un bol et demi", lang="fr-fr"), 1.5) self.assertEqual(extract_number("un et demi bols", lang="fr-fr"), 1.5) self.assertEqual(extract_number("un bol et un demi", lang="fr-fr"), 1.5) self.assertEqual(extract_number("trois quarts de bol", lang="fr-fr"), 3.0 / 4.0) self.assertEqual(extract_number("32.2 degrés", lang="fr-fr"), 32.2) self.assertEqual(extract_number("2 virgule 2 cm", lang="fr-fr"), 2.2) self.assertEqual(extract_number("2 virgule 0 2 cm", lang="fr-fr"), 2.02) self.assertEqual(extract_number("ça fait virgule 2 cm", lang="fr-fr"), 0.2) self.assertEqual(extract_number("point du tout", lang="fr-fr"), "point tout") self.assertEqual(extract_number("32.00 secondes", lang="fr-fr"), 32) self.assertEqual(extract_number("mange trente-et-une bougies", lang="fr-fr"), 31) self.assertEqual(extract_number("un trentième", lang="fr-fr"), 1.0 / 30.0) self.assertEqual(extract_number("un centième", lang="fr-fr"), 0.01) self.assertEqual(extract_number("un millième", lang="fr-fr"), 0.001) self.assertEqual(extract_number("un 20e", lang="fr-fr"), 1.0 / 20.0)
def handle_query_date(self, message, response_type="simple"): utt = message.data.get('utterance', "").lower() try: extract = extract_datetime(utt) except Exception: self.speak_dialog('date.not.found') return day = extract[0] if extract else now_local() # check if a Holiday was requested, e.g. "What day is Christmas?" year = extract_number(utt) if not year or year < 1500 or year > 3000: # filter out non-years year = day.year all_holidays = {} # TODO: How to pick a location for holidays? for st in holidays.US.STATES: holiday_dict = holidays.US(years=[year], state=st) for d, name in holiday_dict.items(): if name not in all_holidays: all_holidays[name] = d for name in all_holidays: d = all_holidays[name] # Uncomment to display all holidays in the database # self.log.info("Day, name: " +str(d) + " " + str(name)) if name.replace(" Day", "").lower() in utt: day = d break location = self._extract_location(utt) today = to_local(now_utc()) if location: # TODO: Timezone math! if (day.year == today.year and day.month == today.month and day.day == today.day): day = now_utc() # for questions ~ "what is the day in sydney" day = self.get_local_datetime(location, dtUTC=day) if not day: return # failed in timezone lookup speak_date = nice_date(day, lang=self.lang) # speak it if response_type == "simple": self.speak_dialog("date", {"date": speak_date}) elif response_type == "relative": # remove time data to get clean dates day_date = day.replace(hour=0, minute=0, second=0, microsecond=0) today_date = today.replace(hour=0, minute=0, second=0, microsecond=0) num_days = (day_date - today_date).days if num_days >= 0: speak_num_days = nice_duration(num_days * 86400) self.speak_dialog("date.relative.future", {"date": speak_date, "num_days": speak_num_days}) else: # if in the past, make positive before getting duration speak_num_days = nice_duration(num_days * -86400) self.speak_dialog("date.relative.past", {"date": speak_date, "num_days": speak_num_days}) # and briefly show the date self.answering_query = True self.show_date(location, day=day) time.sleep(10) mycroft.audio.wait_while_speaking() if self.platform == "mycroft_mark_1": self.enclosure.mouth_reset() self.enclosure.activate_mouth_events() self.answering_query = False self.displayed_time = None
def calculate_handler(self, message): self.log.info("boot") text = message.utterance_remainder() number = extract_number(text, lang=self.lang) #if type(number) is int: self.calculate_worker(message.data['utterance'], message)
def test_extract_number(self): self.assertEqual(extract_number("dies ist der 1. Test", lang="de-de"), 1) self.assertEqual( extract_number("dies ist der erste Test", lang="de-de"), 1) self.assertEqual(extract_number("dies ist 2 Test", lang="de-de"), 2) self.assertEqual(extract_number("dies ist zweiter Test", lang="de-de"), 2) self.assertEqual( extract_number("dies ist der dritte Test", lang="de-de"), 3) self.assertEqual( extract_number("dies ist der Test Nummer 4", lang="de-de"), 4) self.assertEqual( extract_number("ein drittel einer Tasse", lang="de-de"), 1.0 / 3.0) self.assertEqual(extract_number("drei Tassen", lang="de-de"), 3) self.assertEqual(extract_number("1/3 Tasse", lang="de-de"), 1.0 / 3.0) self.assertEqual(extract_number("eine viertel Tasse", lang="de-de"), 0.25) self.assertEqual(extract_number("1/4 Tasse", lang="de-de"), 0.25) self.assertEqual(extract_number("viertel Tasse", lang="de-de"), 0.25) self.assertEqual(extract_number("2/3 Tasse", lang="de-de"), 2.0 / 3.0) self.assertEqual(extract_number("3/4 Tasse", lang="de-de"), 3.0 / 4.0) self.assertEqual(extract_number("1 und 3/4 Tassen", lang="de-de"), 1.75) self.assertEqual( extract_number("1 Tasse und eine halbe", lang="de-de"), 1.5) self.assertEqual( extract_number("eine Tasse und eine halbe", lang="de-de"), 1.5) self.assertEqual( extract_number("eine und eine halbe Tasse", lang="de-de"), 1.5) self.assertEqual( extract_number("ein und ein halb Tassen", lang="de-de"), 1.5) self.assertEqual(extract_number("drei Viertel Tasse", lang="de-de"), 3.0 / 4.0) self.assertEqual(extract_number("drei Viertel Tassen", lang="de-de"), 3.0 / 4.0)
def test_extractnumber_pt(self): self.assertEqual(extract_number("isto e o primeiro teste", lang="pt"), 1) self.assertEqual(extract_number("isto e o 2 teste", lang="pt"), 2) self.assertEqual(extract_number("isto e o segundo teste", lang="pt"), 2) self.assertEqual( extract_number(u"isto e um terço de teste", lang="pt"), 1.0 / 3.0) self.assertEqual( extract_number("isto e o teste numero quatro", lang="pt"), 4) self.assertEqual(extract_number(u"um terço de chavena", lang="pt"), 1.0 / 3.0) self.assertEqual(extract_number("3 canecos", lang="pt"), 3) self.assertEqual(extract_number("1/3 canecos", lang="pt"), 1.0 / 3.0) self.assertEqual(extract_number("quarto de hora", lang="pt"), 0.25) self.assertEqual(extract_number("1/4 hora", lang="pt"), 0.25) self.assertEqual(extract_number("um quarto hora", lang="pt"), 0.25) self.assertEqual(extract_number("2/3 pinga", lang="pt"), 2.0 / 3.0) self.assertEqual(extract_number("3/4 pinga", lang="pt"), 3.0 / 4.0) self.assertEqual(extract_number("1 e 3/4 cafe", lang="pt"), 1.75) self.assertEqual(extract_number("1 cafe e meio", lang="pt"), 1.5) self.assertEqual(extract_number("um cafe e um meio", lang="pt"), 1.5) self.assertEqual( extract_number("tres quartos de chocolate", lang="pt"), 3.0 / 4.0) self.assertEqual( extract_number(u"três quarto de chocolate", lang="pt"), 3.0 / 4.0) self.assertEqual(extract_number("sete ponto cinco", lang="pt"), 7.5) self.assertEqual(extract_number("sete ponto 5", lang="pt"), 7.5) self.assertEqual(extract_number("sete e meio", lang="pt"), 7.5) self.assertEqual(extract_number("sete e oitenta", lang="pt"), 7.80) self.assertEqual(extract_number("sete e oito", lang="pt"), 7.8) self.assertEqual(extract_number("sete e zero oito", lang="pt"), 7.08) self.assertEqual(extract_number("sete e zero zero oito", lang="pt"), 7.008) self.assertEqual(extract_number("vinte treze avos", lang="pt"), 20.0 / 13.0) self.assertEqual( extract_number("seis virgula seiscentos e sessenta", lang="pt"), 6.66) self.assertEqual( extract_number("seiscentos e sessenta e seis", lang="pt"), 666) self.assertEqual( extract_number("seiscentos ponto zero seis", lang="pt"), 600.06) self.assertEqual( extract_number("seiscentos ponto zero zero seis", lang="pt"), 600.006) self.assertEqual( extract_number("seiscentos ponto zero zero zero seis", lang="pt"), 600.0006)
def handle_set_volume_percent(self, message): self._clear_mixer() percent = extract_number(message.data['utterance'].replace('%', '')) percent = int(percent) self._setvolume(percent) self.speak_dialog('set.volume.percent', data={'level': percent})
def handle_pysin_brion_set_rand(self, message): self.settings['randomness'] = extract_number( message.data.get('utterance')) self.speak_dialog( 'randomness.set', data={'rand': extract_number(message.data.get('utterance'))})
def handle_pysin_brion_set_max(self, message): self.settings['max_chunk'] = extract_number( message.data.get('utterance')) self.speak_dialog( 'maximum.set', data={'max': extract_number(message.data.get('utterance'))})
def test_extractnumber_it(self): self.assertEqual(extract_number(u"questo è il primo test", lang="it"), 1) self.assertEqual(extract_number(u"questo è il 2 test", lang="it"), 2) self.assertEqual(extract_number(u"questo è il secondo test", lang="it"), 2) self.assertEqual(extract_number(u"questo è un terzo di test", lang="it"), 1.0 / 3.0) self.assertEqual(extract_number(u"questo è test numero 4", lang="it"), 4) self.assertEqual(extract_number("un terzo di tazza", lang="it"), 1.0 / 3.0) self.assertEqual(extract_number("tre tazze", lang="it"), 3) self.assertEqual(extract_number("1/3 tazze", lang="it"), 1.0 / 3.0) self.assertEqual(extract_number("un quarto di tazza", lang="it"), 0.25) self.assertEqual(extract_number("1/4 tazza", lang="it"), 0.25) self.assertEqual(extract_number("2/3 tazza", lang="it"), 2.0 / 3.0) self.assertEqual(extract_number("3/4 tazza", lang="it"), 3.0 / 4.0) self.assertEqual(extract_number("1 e 1/4 tazza", lang="it"), 1.25) self.assertEqual(extract_number("1 tazza e mezzo", lang="it"), 1.5) self.assertEqual(extract_number("una tazza e mezzo", lang="it"), 1.5) self.assertEqual(extract_number("una e mezza tazza", lang="it"), 1.5) self.assertEqual(extract_number("una e una mezza tazza", lang="it"), 1.5) self.assertEqual(extract_number("tre quarti tazza", lang="it"), 3.0 / 4.0) self.assertEqual(extract_number("tre quarto tazza", lang="it"), 3.0 / 4.0) self.assertEqual(extract_number("sette punto cinque", lang="it"), 7.5) self.assertEqual(extract_number("sette punto 5", lang="it"), 7.5) self.assertEqual(extract_number("sette e mezzo", lang="it"), 7.5) self.assertEqual(extract_number("sette e ottanta", lang="it"), 7.80) self.assertEqual(extract_number("sette e otto", lang="it"), 7.8) self.assertEqual(extract_number("sette e zero otto", lang="it"), 7.08) self.assertEqual(extract_number("sette e zero zero otto", lang="it"), 7.008) self.assertEqual(extract_number("venti tredicesimi", lang="it"), 20.0 / 13.0) self.assertEqual(extract_number("sei virgola sessanta sei", lang="it"), 6.66) self.assertEqual(extract_number("sei virgola sessantasei", lang="it"), 6.66) self.assertEqual(extract_number("seicento sessanta sei", lang="it"), 666) self.assertEqual(extract_number("seicento punto zero sei", lang="it"), 600.06) self.assertEqual(extract_number("seicento punto zero zero sei", lang="it"), 600.006) self.assertEqual(extract_number("seicento punto zero zero zero sei", lang="it"), 600.0006) self.assertEqual(extract_number("tre decimi ", lang="it"), 0.30000000000000004) self.assertEqual(extract_number("dodici centesimi", lang="it"), 0.12) self.assertEqual(extract_number("cinque e quaranta due millesimi", lang="it"), 5.042) self.assertEqual(extract_number("mille e uno", lang="it"), 1001) self.assertEqual(extract_number("due mila venti due dollari ", lang="it"), 2022) self.assertEqual(extract_number( "cento quattordici mila quattrocento undici dollari ", lang="it"), 114411) self.assertEqual(extract_number("ventitre dollari ", lang="it"), 23) self.assertEqual(extract_number("quarantacinque minuti ", lang="it"), 45) self.assertEqual(extract_number("ventuno anni ", lang="it"), 21) self.assertEqual(extract_number("ventotto euro ", lang="it"), 28) self.assertEqual(extract_number("dodici e quarantacinque ", lang="it"), 12.45) self.assertEqual(extract_number("quarantotto euro ", lang="it"), 48) self.assertEqual(extract_number("novantanove euro ", lang="it"), 99) self.assertEqual(extract_number("avvisa se qualcuno arriva ", lang="it"), False)
def test_extract_number(self): self.assertEqual( extract_number("this is the first test", ordinals=True), 1) self.assertEqual(extract_number("this is 2 test"), 2) self.assertEqual(extract_number("this is second test", ordinals=True), 2) self.assertEqual(extract_number("this is the third test"), 1.0 / 3.0) self.assertEqual( extract_number("this is the third test", ordinals=True), 3.0) self.assertEqual(extract_number("this is test number 4"), 4) self.assertEqual(extract_number("one third of a cup"), 1.0 / 3.0) self.assertEqual(extract_number("three cups"), 3) self.assertEqual(extract_number("1/3 cups"), 1.0 / 3.0) self.assertEqual(extract_number("quarter cup"), 0.25) self.assertEqual(extract_number("1/4 cup"), 0.25) self.assertEqual(extract_number("one fourth cup"), 0.25) self.assertEqual(extract_number("2/3 cups"), 2.0 / 3.0) self.assertEqual(extract_number("3/4 cups"), 3.0 / 4.0) self.assertEqual(extract_number("1 and 3/4 cups"), 1.75) self.assertEqual(extract_number("1 cup and a half"), 1.5) self.assertEqual(extract_number("one cup and a half"), 1.5) self.assertEqual(extract_number("one and a half cups"), 1.5) self.assertEqual(extract_number("one and one half cups"), 1.5) self.assertEqual(extract_number("three quarter cups"), 3.0 / 4.0) self.assertEqual(extract_number("three quarters cups"), 3.0 / 4.0) self.assertEqual(extract_number("twenty two"), 22) self.assertEqual(extract_number("two hundred"), 200) self.assertEqual(extract_number("nine thousand"), 9000) self.assertEqual(extract_number("six hundred sixty six"), 666) self.assertEqual(extract_number("two million"), 2000000) self.assertEqual( extract_number("two million five hundred thousand " "tons of spinning metal"), 2500000) self.assertEqual(extract_number("six trillion"), 6000000000000.0) self.assertEqual(extract_number("six trillion", short_scale=False), 6e+18) self.assertEqual(extract_number("one point five"), 1.5) self.assertEqual(extract_number("three dot fourteen"), 3.14) self.assertEqual(extract_number("zero point two"), 0.2) self.assertEqual(extract_number("billions of years older"), 1000000000.0) self.assertEqual( extract_number("billions of years older", short_scale=False), 1000000000000.0) self.assertEqual(extract_number("one hundred thousand"), 100000) self.assertEqual(extract_number("minus 2"), -2) self.assertEqual(extract_number("negative seventy"), -70) self.assertEqual(extract_number("thousand million"), 1000000000) self.assertEqual(extract_number("sixth third"), 1 / 6 / 3) self.assertEqual(extract_number("sixth third", ordinals=True), 3) self.assertEqual(extract_number("thirty second"), 30) self.assertEqual(extract_number("thirty second", ordinals=True), 32) self.assertEqual( extract_number("this is the billionth test", ordinals=True), 1e09) self.assertEqual(extract_number("this is the billionth test"), 1e-9) self.assertEqual( extract_number("this is the billionth test", ordinals=True, short_scale=False), 1e12) self.assertEqual( extract_number("this is the billionth test", short_scale=False), 1e-12) # TODO handle this case # self.assertEqual( # extract_number("6 dot six six six"), # 6.666) self.assertTrue(extract_number("The tennis player is fast") is False) self.assertTrue(extract_number("fraggle") is False) self.assertTrue(extract_number("fraggle zero") is not False) self.assertEqual(extract_number("fraggle zero"), 0) self.assertTrue(extract_number("grobo 0") is not False) self.assertEqual(extract_number("grobo 0"), 0)
def test_extractnumber_fr(self): self.assertEqual(extract_number("voici le premier test", lang="fr-fr"), 1) self.assertEqual(extract_number("c'est 2 tests", lang="fr-fr"), 2) self.assertEqual(extract_number("voici le second test", lang="fr-fr"), 2) self.assertEqual(extract_number("voici trois tests", lang="fr-fr"), 3) self.assertEqual(extract_number("voici le test numéro 4", lang="fr-fr"), 4) self.assertEqual(extract_number("un tiers de litre", lang="fr-fr"), 1.0 / 3.0) self.assertEqual(extract_number("3 cuillères", lang="fr-fr"), 3) self.assertEqual(extract_number("1/3 de litre", lang="fr-fr"), 1.0 / 3.0) self.assertEqual(extract_number("un quart de bol", lang="fr-fr"), 0.25) self.assertEqual(extract_number("1/4 de verre", lang="fr-fr"), 0.25) self.assertEqual(extract_number("2/3 de bol", lang="fr-fr"), 2.0 / 3.0) self.assertEqual(extract_number("3/4 de bol", lang="fr-fr"), 3.0 / 4.0) self.assertEqual(extract_number("1 et 3/4 de bol", lang="fr-fr"), 1.75) self.assertEqual(extract_number("1 bol et demi", lang="fr-fr"), 1.5) self.assertEqual(extract_number("un bol et demi", lang="fr-fr"), 1.5) self.assertEqual(extract_number("un et demi bols", lang="fr-fr"), 1.5) self.assertEqual(extract_number("un bol et un demi", lang="fr-fr"), 1.5) self.assertEqual(extract_number("trois quarts de bol", lang="fr-fr"), 3.0 / 4.0) self.assertEqual(extract_number("32.2 degrés", lang="fr-fr"), 32.2) self.assertEqual(extract_number("2 virgule 2 cm", lang="fr-fr"), 2.2) self.assertEqual(extract_number("2 virgule 0 2 cm", lang="fr-fr"), 2.02) self.assertEqual(extract_number("ça fait virgule 2 cm", lang="fr-fr"), 0.2) self.assertEqual(extract_number("point du tout", lang="fr-fr"), "point tout") self.assertEqual(extract_number("32.00 secondes", lang="fr-fr"), 32) self.assertEqual(extract_number("mange trente-et-une bougies", lang="fr-fr"), 31) self.assertEqual(extract_number("un trentième", lang="fr-fr"), 1.0 / 30.0) self.assertEqual(extract_number("un centième", lang="fr-fr"), 0.01) self.assertEqual(extract_number("un millième", lang="fr-fr"), 0.001) self.assertEqual(extract_number("un 20e", lang="fr-fr"), 1.0 / 20.0)
def _get_alarm_matches(self, utt, alarm=None, max_results=1, dialog='ask.which.alarm', is_response=False): """Get list of alarms that match based on a user utterance. Arguments: utt (str): string spoken by the user alarm (list): list of alarm to match against max_results (int): max number of results desired dialog (str): name of dialog file used for disambiguation is_response (bool): is this being called by get_response Returns: (str): ["All", "Matched", "No Match Found", or "User Cancelled"] (list): list of matched alarm """ alarms = alarm or self.settings['alarm'] all_words = self.translate_list('all') next_words = self.translate_list('next') status = ["All", "Matched", "No Match Found", "User Cancelled", "Next"] # No alarms if alarms is None or len(alarms) == 0: self.log.error("Cannot get match. No active alarms.") return (status[2], None) # Extract Alarm Time when, utt_no_datetime = extract_datetime(utt) or (None, None) # Will return dt of unmatched string today = extract_datetime("today") today = today[0] # Check the time if it's midnight. This is to check if the user # said a recurring alarm with only the Day or if the user did # specify to set an alarm on midnight. If it's confirmed that # it's for a day only, then get another response from the user # to clarify what time on that day the recurring alarm is. is_midnight = self._check_if_utt_has_midnight(utt, when, self.threshold) if when == today and not is_midnight: when = None time_matches = None time_alarm = None if when: time_alarm = to_utc(when).timestamp() if is_midnight: time_alarm = time_alarm + 86400.0 time_matches = [ a for a in alarms if abs(a["timestamp"] - time_alarm) <= 60 ] # Extract Recurrence recur = None recurrence_matches = None for word in self.recurrence_dict: is_match = self._fuzzy_match(word, utt.lower(), self.threshold) if is_match: recur = self._create_day_set(utt) alarm_recur = self._create_recurring_alarm(when, recur) recurrence_matches = [ a for a in alarms if a["repeat_rule"] == alarm_recur["repeat_rule"] ] break utt = utt_no_datetime or utt # Extract Ordinal/Cardinal Numbers number = extract_number(utt, ordinals=True) if number and number > 0: number = int(number) else: number = None # Extract Name name_matches = [ a for a in alarms if a["name"] and self._fuzzy_match(a["name"], utt, self.threshold) ] # Match Everything alarm_to_match = None if when: if recur: alarm_to_match = alarm_recur else: alarm_to_match = {"timestamp": time_alarm, "repeat_rule": ""} # Find the Intersection of the Alarms list and all the matched alarms orig_count = len(alarms) if when and time_matches: alarms = [a for a in alarms if a in time_matches] if recur and recurrence_matches: alarms = [a for a in alarms if a in recurrence_matches] if name_matches: alarms = [a for a in alarms if a in name_matches] # Utterance refers to all alarms if utt and any(self._fuzzy_match(i, utt, 1) for i in all_words): return (status[0], alarms) # Utterance refers to the next alarm to go off elif utt and any(self._fuzzy_match(i, utt, 1) for i in next_words): return (status[4], [alarms[0]]) # Given something to match but no match found if ((number and number > len(alarms)) or (recur and not recurrence_matches) or (when and not time_matches)): return (status[2], None) # If number of alarms filtered were the same, assume user asked for # All alarms if (len(alarms) == orig_count and max_results > 1 and not number and not when and not recur): return (status[0], alarms) # Return immediately if there is ordinal if number and number <= len(alarms): return (status[1], [alarms[number - 1]]) # Return immediately if within maximum results elif alarms and len(alarms) <= max_results: return (status[1], alarms) # Ask for reply from user and iterate the function elif alarms and len(alarms) > max_results: desc = [] for alarm in alarms: desc.append(self._describe(alarm)) items_string = '' if desc: items_string = join_list(desc, self.translate('and')) reply = self.get_response(dialog, data={ 'number': len(alarms), 'list': items_string, }, num_retries=1) if reply: return self._get_alarm_matches(reply, alarm=alarms, max_results=max_results, dialog=dialog, is_response=True) else: return (status[3], None) # No matches found return (status[2], None)