mycroft-core/test/unittests/util/test_parse_pt.py

262 lines
13 KiB
Python

# -*- coding: utf-8 -*-
#
# Copyright 2017 Mycroft AI Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
import unittest
from datetime import datetime, time
from mycroft.util.parse import get_gender
from mycroft.util.parse import extract_datetime
from mycroft.util.parse import extract_number
from mycroft.util.parse import normalize
class TestNormalize(unittest.TestCase):
"""
Test cases for Portuguese parsing
"""
def test_articles_pt(self):
self.assertEqual(normalize(u"isto é o teste",
lang="pt", remove_articles=True),
u"isto teste")
self.assertEqual(
normalize(u"isto é a frase", lang="pt", remove_articles=True),
u"isto frase")
self.assertEqual(
normalize("e outro teste", lang="pt", remove_articles=True),
"outro teste")
self.assertEqual(normalize(u"isto é o teste extra",
lang="pt",
remove_articles=False), u"isto e o teste"
u" extra")
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_agressive_pruning_pt(self):
self.assertEqual(normalize("uma palavra", lang="pt"),
"1 palavra")
self.assertEqual(normalize("esta palavra um", lang="pt"),
"palavra 1")
self.assertEqual(normalize("o homem batia-lhe", lang="pt"),
"homem batia")
self.assertEqual(normalize("quem disse asneira nesse dia", lang="pt"),
"quem disse asneira dia")
def test_spaces_pt(self):
self.assertEqual(normalize(" isto e o teste", lang="pt"),
"isto teste")
self.assertEqual(normalize(" isto sao os testes ", lang="pt"),
"isto sao testes")
self.assertEqual(normalize(" isto e um teste", lang="pt",
remove_articles=False),
"isto e 1 teste")
def test_numbers_pt(self):
self.assertEqual(normalize(u"isto e o um dois três teste", lang="pt"),
u"isto 1 2 3 teste")
self.assertEqual(normalize(u"ê a sete oito nove test", lang="pt"),
u"7 8 9 test")
self.assertEqual(
normalize("teste zero dez onze doze treze", lang="pt"),
"teste 0 10 11 12 13")
self.assertEqual(
normalize("teste mil seiscentos e sessenta e seis", lang="pt",
remove_articles=False),
"teste 1000 600 e 66")
self.assertEqual(
normalize("teste sete e meio", lang="pt",
remove_articles=False),
"teste 7 e meio")
self.assertEqual(
normalize("teste dois ponto nove", lang="pt"),
"teste 2 ponto 9")
self.assertEqual(
normalize("teste cento e nove", lang="pt",
remove_articles=False),
"teste 100 e 9")
self.assertEqual(
normalize("teste vinte e 1", lang="pt"),
"teste 20 1")
def test_extractdatetime_pt(self):
def extractWithFormat(text):
date = datetime(2017, 6, 27, 0, 0)
[extractedDate, leftover] = extract_datetime(text, date,
lang="pt")
extractedDate = extractedDate.strftime("%Y-%m-%d %H:%M:%S")
return [extractedDate, leftover]
def testExtract(text, expected_date, expected_leftover):
res = extractWithFormat(text)
self.assertEqual(res[0], expected_date)
self.assertEqual(res[1], expected_leftover)
testExtract(u"que dia é hoje",
"2017-06-27 00:00:00", u"dia")
testExtract(u"que dia é amanha",
"2017-06-28 00:00:00", u"dia")
testExtract(u"que dia foi ontem",
"2017-06-26 00:00:00", u"dia")
testExtract(u"que dia foi antes de ontem",
"2017-06-25 00:00:00", u"dia")
testExtract(u"que dia foi ante ontem",
"2017-06-25 00:00:00", u"dia")
testExtract(u"que dia foi ante ante ontem",
"2017-06-24 00:00:00", u"dia")
testExtract("marca o jantar em 5 dias",
"2017-07-02 00:00:00", "marca jantar")
testExtract("como esta o tempo para o dia depois de amanha?",
"2017-06-29 00:00:00", "como tempo")
testExtract(u"lembra me ás 10:45 pm",
"2017-06-27 22:45:00", u"lembra")
testExtract("como esta o tempo na sexta de manha",
"2017-06-30 08:00:00", "como tempo")
testExtract(u"lembra me para ligar a mãe daqui "
u"a 8 semanas e 2 dias",
"2017-08-24 00:00:00", u"lembra ligar mae")
testExtract("Toca black metal 2 dias a seguir a sexta",
"2017-07-02 00:00:00", "toca black metal")
testExtract("Toca satanic black metal 2 dias para esta sexta",
"2017-07-02 00:00:00", "toca satanic black metal")
testExtract("Toca super black metal 2 dias a partir desta sexta",
"2017-07-02 00:00:00", "toca super black metal")
testExtract(u"Começa a invasão ás 3:45 pm de quinta feira",
"2017-06-29 15:45:00", "comeca invasao")
testExtract("na segunda, compra queijo",
"2017-07-03 00:00:00", "compra queijo")
testExtract(u"Toca os parabéns daqui a 5 anos",
"2022-06-27 00:00:00", "toca parabens")
testExtract(u"manda Skype a Mãe ás 12:45 pm próxima quinta",
"2017-06-29 12:45:00", "manda skype mae")
testExtract(u"como está o tempo esta sexta?",
"2017-06-30 00:00:00", "como tempo")
testExtract(u"como está o tempo esta sexta de tarde?",
"2017-06-30 15:00:00", "como tempo")
testExtract(u"como está o tempo esta sexta as tantas da manha?",
"2017-06-30 04:00:00", "como tempo")
testExtract(u"como está o tempo esta sexta a meia noite?",
"2017-06-30 00:00:00", "como tempo")
testExtract(u"como está o tempo esta sexta ao meio dia?",
"2017-06-30 12:00:00", "como tempo")
testExtract(u"como está o tempo esta sexta ao fim da tarde?",
"2017-06-30 19:00:00", "como tempo")
testExtract(u"como está o tempo esta sexta ao meio da manha?",
"2017-06-30 10:00:00", "como tempo")
testExtract("lembra me para ligar a mae no dia 3 de agosto",
"2017-08-03 00:00:00", "lembra ligar mae")
testExtract(u"compra facas no 13º dia de maio",
"2018-05-13 00:00:00", "compra facas")
testExtract(u"gasta dinheiro no maio dia 13",
"2018-05-13 00:00:00", "gasta dinheiro")
testExtract(u"compra velas a maio 13",
"2018-05-13 00:00:00", "compra velas")
testExtract(u"bebe cerveja a 13 maio",
"2018-05-13 00:00:00", "bebe cerveja")
testExtract("como esta o tempo 1 dia a seguir a amanha",
"2017-06-29 00:00:00", "como tempo")
testExtract(u"como esta o tempo ás 0700 horas",
"2017-06-27 07:00:00", "como tempo")
testExtract(u"como esta o tempo amanha ás 7 em ponto",
"2017-06-28 07:00:00", "como tempo")
testExtract(u"como esta o tempo amanha pelas 2 da tarde",
"2017-06-28 14:00:00", "como tempo")
testExtract(u"como esta o tempo amanha pelas 2",
"2017-06-28 02:00:00", "como tempo")
testExtract(u"como esta o tempo pelas 2 da tarde da proxima sexta",
"2017-06-30 14:00:00", "como tempo")
testExtract("lembra-me de acordar em 4 anos",
"2021-06-27 00:00:00", "lembra acordar")
testExtract("lembra-me de acordar em 4 anos e 4 dias",
"2021-07-01 00:00:00", "lembra acordar")
testExtract("dorme 3 dias depois de amanha",
"2017-07-02 00:00:00", "dorme")
testExtract("marca consulta para 2 semanas e 6 dias depois de Sabado",
"2017-07-21 00:00:00", "marca consulta")
testExtract(u"começa a festa ás 8 em ponto da noite de quinta",
"2017-06-29 20:00:00", "comeca festa")
def test_extractdatetime_default_pt(self):
default = time(9, 0, 0)
anchor = datetime(2017, 6, 27, 0, 0)
res = extract_datetime(
'marca consulta para 2 semanas e 6 dias depois de Sabado',
anchor, lang='pt-pt', default_time=default)
self.assertEqual(default, res[0].time())
def test_gender_pt(self):
self.assertEqual(get_gender("vaca", lang="pt"), "f")
self.assertEqual(get_gender("cavalo", lang="pt"), "m")
self.assertEqual(get_gender("vacas", lang="pt"), "f")
self.assertEqual(get_gender("boi", "o boi come erva", lang="pt"), "m")
self.assertEqual(get_gender("boi", lang="pt"), False)
self.assertEqual(get_gender("homem", "estes homem come merda",
lang="pt"), "m")
self.assertEqual(get_gender("ponte", lang="pt"), "m")
self.assertEqual(get_gender("ponte", "essa ponte caiu",
lang="pt"), "f")
if __name__ == "__main__":
unittest.main()