262 lines
13 KiB
Python
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()
|