scieee AI-readable full text Open interactive document viewer

Leitura automática de expressões matemáticas: audiomath

Helder Filipe Patrício Cabral Ferreira

Abstract

Nesta dissertação estuda-se o problema do ensino e da falta de acessibilidade dos documentos com conteúdos matemáticos na Internet por parte de pessoas com necessidades especiais, nomeadamente cegos e amblíopes. A solução proposta nesta dissertação baseia-se na análise, interpretação e conversão de documentos com fórmulas matemáticas em MathML para uma forma escrita por extenso, sendo posteriormente lida com recurso a um conversor texto-fala. Foram desenvolvidas três aplicações: AudioMathENGINE, AudioMathGUI e AudioMathWEB. AudioMathENGINE consiste num motor de análise, interpretação e conversão de documentos com conteúdos matemáticos, e que possui módulos de processamento para: numerais, abreviações, acrónimos, referências de rede, assim como, reconhecimento automático dos elementos a converter, interpretação e conversão de expressões matemáticas, e implementação de mecanismos de navegação nas mesmas. AudioMathGUI consiste numa aplicação gráfica que permite a aplicação do motor de análise, interpretação e conversão de expressões matemáticas, assim como a demonstração de um mecanismo de navegação contextualizado das fórmulas. AudioMathWEB consiste num serviço público on-line de conversão de documentos com MathML, que se encontra disponível no sítio web da tese. Neste trabalho apresenta-se também um estudo detalhado sobre a prosódia matemática e a forma como os humanos lêem e entendem a leitura das expressões matemáticas. Ao longo da dissertação são apresentados resultados de trabalhos de pesquisa em diversas áreas, incluindo: engenharia, psicologia, matemática e linguística, com a finalidade de adquirir conhecimentos, conceitos e teorias, que permitem escolher as tecnologias e técnicas mais adequadas à concretização deste trabalho. O trabalho de dissertação termina com um conjunto de testes objectivos e subjectivos para a determinação da qualidade dos resultados obtidos; assim como um conjunto de conclusões sobre esses mesmos resultados. Mais informações sobre a dissertação, incluindo publicações e um serviço público de conversão de MathML, encontram-se disponíveis no sítio web da tese em: http://lpf-esi.fe.up.pt/~audiomath.

Full text

FACULDADE DE ENGENHARIA DA UNIVERSIDADE DO PORTO DEPARTAMENTO DE ENGENHARIA ELECTROTÉCNICA E DE COMPUTADORES LEITURA AUTOMÁTICA DE EXPRESSÕES MATEMÁTICAS – AUDIOMATH HELDER FILIPE PATRÍCIO CABRAL FERREIRA LICENCIADO EM ENGENHARIA ELECTROTÉCNICA E DE COMPUTADORES PELA FACULDADE DE ENGENHARIA UNIVERSIDADE DO PORTO DISSERTAÇÃO SUBMETIDA PARA SATISFAÇÃO PARCIAL DOS REQUISITOS DO GRAU DE MESTRE EM ENGENHARIA INFORMÁTICA DISSERTAÇÃO REALIZADA SOB A SUPERVISÃO DE PROFESSOR DOUTOR DIAMANTINO RUI DA SILVA FREITAS, DO DEPARTAMENTO DE ENGENHARIA ELECTROTÉCNICA E DE COMPUTADORES DA FACULDADE DE ENGENHARIA UNIVERSIDADE DO PORTO PORTO, SETEMBRO DE 2005 2 Página em branco. 3 Para a minha avó Antonieta, pela sua simplicidade e pelo seu carinho. Para o meu amigo Helder, pelo seu carácter, amizade e coragem. 4 Página em branco. 5 Resumo Nesta dissertação estuda-se o problema do ensino e da falta de acessibilidade dos documentos com conteúdos matemáticos na Internet por parte de pessoas com necessidades especiais, nomeadamente cegos e amblíopes. A solução proposta nesta dissertação baseia-se na análise, interpretação e conversão de documentos com fórmulas matemáticas em MathML para uma forma escrita por extenso, sendo posteriormente lida com recurso a um conversor texto-fala. Foram desenvolvidas três aplicações: AudioMathENGINE, AudioMathGUI e AudioMathWEB. AudioMathENGINE consiste num motor de análise, interpretação e conversão de documentos com conteúdos matemáticos, e que possui módulos de processamento para: numerais, abreviações, acrónimos, referências de rede, assim como, reconhecimento automático dos elementos a converter, interpretação e conversão de expressões matemáticas, e implementação de mecanismos de navegação nas mesmas. AudioMathGUI consiste numa aplicação gráfica que permite a aplicação do motor de análise, interpretação e conversão de expressões matemáticas, assim como a demonstração de um mecanismo de navegação contextualizado das fórmulas. AudioMathWEB consiste num serviço público on-line de conversão de documentos com MathML, que se encontra disponível no sítio web da tese. Neste trabalho apresenta-se também um estudo detalhado sobre a prosódia matemática e a forma como os humanos lêem e entendem a leitura das expressões matemáticas. Ao longo da dissertação são apresentados resultados de trabalhos de pesquisa em diversas áreas, incluindo: engenharia, psicologia, matemática e linguística, com a finalidade de adquirir conhecimentos, conceitos e teorias, que permitem escolher as tecnologias e técnicas mais adequadas à concretização deste trabalho. O trabalho de dissertação termina com um conjunto de testes objectivos e subjectivos para a determinação da qualidade dos resultados obtidos; assim como um conjunto de conclusões sobre esses mesmos resultados. Mais informações sobre a dissertação, incluindo publicações e um serviço público de conversão de MathML, encontram-se disponíveis no sítio web da tese em: http://lpf-esi.fe.up.pt/~audiomath. 6 Página em branco. 7 Abstract This dissertation focus itself the problem of teaching and the lack of accessibility in documents with mathematical contents over the Internet, aiming people with several types of visual impairment, like blindness. The proposed solution in this thesis consists in the analysis, interpretation and conversion of documents containing mathematical formulae in MathML into a full written form, prepared to be read by a text-to-speech engine later on. Three applications have been mainly developed: AudioMathENGINE, AudioMathGUI and AudioMathWEB. AudioMathENGINE is the engine responsible for the analysis, interpretation and conversion of documents with mathematical contents. This engine includes processing modules for: numerals, abbreviations, acronyms, network references, and also, automatic recognition of certain elements to be converted, interpretation and conversion of mathematical expressions, and the implementation of a navigation mechanism for the existing mathematical expressions. AudioMathGUI is a graphical user interface that allows the usage of the analysis, interpretation and conversion engine, and also the demonstration of the contextualized navigation mechanism for the mathematical expressions. AudioMathWEB consists in a public on-line service, available on the thesis website, which converts documents with MathML. On this thesis a detailed study is presented concerning math prosody and the way humans read and perceive mathematical expressions. Along this dissertation several research results are presented in numerous areas, including: engineering, psychology, mathematics and linguistics, with the aim of acquiring knowledge, concepts and theories that guided in choosing technologies and techniques that are more adequate to this work’s implementation. The dissertation work ends with a set of objective and subjective tests about the quality of results; as well as a set of conclusions concerning these same results. More information about the thesis, including publications and the public on-line conversion service of MathML, is available in the thesis website at: http://lpf-esi.fe.up.pt/~audiomath. 8 Página em branco. 9 Agradecimentos Agradeço aos meus pais, Alfredo e Lurdes, por todo o esforço e dedicação ao longo da minha vida, sem os quais nunca teria sido possível realizar esta dissertação. Estou-lhes eternamente agradecido pela educação, amor e carinho. À Ana por me fazer sentir especial, pelo amor e carinho, e pela inesgotável paciência e compreensão. Ao professor Diamantino pela oportunidade de realização deste trabalho, pelo seu apoio e orientação durante a minha vida académica, e por sempre me ter mostrado como ser melhor profissional. À Magda pelos seus esforços, amizade e partilha de conhecimentos na área da psicologia. Aos meus colegas de investigação, Daniela, Luís, Filipe, António, Fernando, João Paulo e Avelino, pelo seu companheirismo. Um agradecimento especial à Maria João, cuja sugestão há 5 anos atrás deu origem a este projecto. Ao Thomas Giegold, Thomas Hladschik e Robert Mauerer pelo seu companheirismo, motivação e boa disposição. Às professoras Margarida e Maria do Rosário do DEEC pelo tempo disponibilizado para uma demonstração da aplicação e pelos seus comentários e palavras de motivação. Ao meus colegas e amigos, Inês, Sofia e Jorge, pela disponibilidade e ajuda durante a fase de testes. Assim como à Maria da Luz Ribeiro, João Fernandes, Daniel Serra e Domingos Ferreira, pelo tempo disponibilizado para testar e comentar o AudioMath. Aos meus colegas da Infineon e Critical Software pelo apoio, companheirismo e motivação. Aos meus professores e colegas do Mestrado em Engenharia Informática, por terem contribuído tão eficazmente para o meu desenvolvimento como aluno, colega e profissional. 16 Figura 7.2 - Arquitectura de “alto nível” do AudioMathENGINE (componente .NET).....120 Figura 7.3 - Interacção entre AudioMathGUI, AudioMathENGINE e ficheiros AKML........122 Figura 7.4 - Arquitectura base do AKML............................................................124 Figura 7.5 - Exemplo de um documento AKML....................................................124 Figura 7.6 - Estrutura AKML para configurações do AudioMathENGINE. .....................125 Figura 7.7 - Exemplo de AKML de Configuração para o AudioMathENGINE..................127 Figura 7.8 - Estrutura AKML para Dicionários do AudioMathENGINE..........................128 Figura 7.9 - Exemplo de Dicionário de Abreviações em AKML.................................129 Figura 7.10 - Estrutura AKML para apresentação de Resultados. .............................129 Figura 7.11 - Exemplo do resultado de uma conversão em AKML.............................131 Figura 7.12 - Estrutura AKML para Navegação. ...................................................131 Figura 7.13 - Exemplo de uma navegação em AKML.............................................132 Figura 7.14 - Interacção (simplificada) dos módulos no AudioMathENGINE. ................133 Figura 7.15 - Exemplo de Dicionário de Acrónimos em AKML..................................147 Figura 7.16 - Relação entre os módulos de reconhecimento e conversões.................153 Figura 7.17 – Exemplos de expressões regulares no reconhecimento automático. .......155 Figura 7.18 – Análise, Interpretação, Conversão e Navegação de MathML. .................157 Figura 7.19 – Exemplo de pré-processamento de código Presentation Markup. ...........162 Figura 7.20 – Exemplo de processamento de uma fórmula matemática – PARTE 1........163 Figura 7.21 – Exemplo de processamento de uma fórmula matemática – PARTE 2........164 Figura 7.22 – Exemplo de conversão de merror..................................................165 Figura 7.23 – Exemplo de conversão de mtext e ms.............................................165 Figura 7.24 – Exemplo de conversão de mglyph..................................................165 Figura 7.25 – Exemplo de conversão de mn. .......................................................166 Figura 7.26 – Exemplo de conversão de mi. .......................................................166 Figura 7.27 – Exemplo de conversão de mo. .......................................................166 Figura 7.28 – Exemplos de conversão de mfrac..................................................167 Figura 7.29 – Exemplo de conversão de msup.....................................................168 Figura 7.30 – Exemplo de conversão de msqrt e mroot........................................169 Figura 7.31 – Exemplo de conversão de mtable, mtr e mtd...................................170 Figura 7.32 – Exemplo de conversão com índices. ...............................................171 Figura 7.33 – Exemplo de conversão de integral..................................................172 Figura 7.34 – Exemplo de conversão de somatório...............................................172 Figura 7.35 – Exemplos de conversões do AudioMathENGINE. .................................175 Figura 7.36 - Aplicação de <submat> para navegação...........................................175 Figura 7.37 – Conversão do <submat> em <node>. ..............................................176 Figura 8.1 – Exemplo da aplicação AudioMathGUI. ...............................................177 Figura 8.2 – Diagrama de classes simplificado do AudioMathGUI. .............................178 Figura 8.3 – Actividades de inicialização no AudioMathGUI.....................................180 Figura 8.4 – Actividades de conversão no AudioMathGUI. ......................................180 Figura 8.5 – Modos de utilizador usados por defeito no AudioMathGUI. .....................181 Figura 8.6 – Configurações iniciais usadas por defeito no AudioMathGUI....................182 Figura 8.7 – Aspecto visual do AudioMathGUI......................................................183 Figura 8.8 - Visualização gráfica de documentos no AudioMathGUI. .........................184 17 Figura 8.9 - Vista Resultado no AudioMath.........................................................185 Figura 8.10 - Vista Estatísticas no AudioMath. ....................................................185 Figura 8.11 – Vista de Navegação no AudioMathGUI..............................................186 Figura 8.12 – Segunda vista de navegação no AudioMathGUI...................................187 Figura 8.13 – Definição dos modos de utilizador no AudioMathGUI...........................187 Figura 8.14 – Integração C# e AudioMathENGINE. ................................................188 Figura 8.15 – Selecção de conversores texto-fala SAPI4. .......................................188 Figura 8.16 – Selecção de conversores texto-fala SAPI5. .......................................189 Figura 8.17 – Exemplos de controlo de velocidade, f0 e volume em SAPI4 e SAPI5.......189 Figura 9.1 - Página principal do sítio web..........................................................192 Figura 9.2 - sMArTH on-line. .........................................................................193 Figura 9.3 - Página de demonstração e serviço público de conversão on-line. ............194 Figura 9.4 - Diagrama de Actividade - Conversão on-line com AudioMathWEB.............195 Figura 9.5 - Amostra das fichas de trabalho on-line. ............................................195 Figura 9.6 - Resultado de uma conversão on-line. ...............................................196 Figura 10.1 - Aparelho fonador humano. (82).....................................................198 Figura 10.2 – Diferença entre vozeado e não vozeado. (125).................................199 Figura 10.3 - Modelo do Tracto Vocal (82).........................................................200 Figura 10.4 - Modelo de produção de fala. (83)...................................................201 Figura 10.5 – Exemplo de codificação SAMPA. ....................................................202 Figura 10.6 – Composição do ouvido humano. (130).............................................203 Figura 10.7 – Limiares de audição do ouvido humano. (81)....................................204 Figura 10.8 - Sinal de áudio etiquetado no Praat.................................................207 Figura 10.9 – Sinal de fala de álgebra simples.....................................................209 Figura 10.10 – Sinal de fala de uma fracção. ......................................................210 Figura 10.11 – Sinal de fala de uma raiz............................................................212 Figura 10.12 – Sinal de fala de uma potência......................................................213 Figura 10.13 – Sinal de fala de trigonometria. ....................................................214 Figura 10.14 – Sinal de fala de um sistema de equações........................................216 Figura 10.15 – Sinal de fala de um integral. .......................................................217 Figura 10.16 – Sinal de fala de uma derivada......................................................218 Figura 10.17 – Sinal de fala de um somatório. ....................................................220 Figura 11.1 - Modelo de processamento de informação num ser humano. (132) ........222 Figura 11.2 - Diferentes áreas que constituem a memória humana. (132) .................223 Figura 11.3 - Necessidade de recordar versus o tempo de retenção. (134)................223 Figura 11.4 - Probabilidade de reconhecimento de palavras em memória. (134).........224 Figura 11.5 - Influência da prática no reconhecimento de conceitos. (135) ...............225 Figura 11.6 - Interpretação de uma expressão matemática. (64).............................226 Figura 11.7 - Exemplo da árvore de navegação de uma expressão matemática. ..........227 Figura 11.8 - Navegação no AudioMathENGINE....................................................228 Figura 11.9 - Exemplo de entrada MathML para navegação. ..................................229 Figura 11.10 - Exemplo de sub expressões com AKML para navegação......................229 Figura 11.11 - Exemplo de árvore de navegação. ................................................230 Figura 11.12 - Navegação através do AudioMathGUI - Vista 1..................................231 Figura 11.13 - Navegação através do AudioMathGUI - Vista 2..................................232 18 Índice de tabelas Tabela 2.1 - Comparação entre editores de MathML...............................................36 Tabela 4.1 - Matemática: mesmo conceito, diferentes notações................................58 Tabela 4.2 - Matemática: mesma notação, diferentes conceitos................................58 Tabela 4.3 - Tipos de Token Elements (Presentation Markup)..................................65 Tabela 4.4 - Tipos de Layout Schemata (Presentation Markup). ...............................65 Tabela 4.5 - Argumentos para cada elemento de Presentation Markup.......................66 Tabela 4.6 - Elementos do conjunto de etiquetas de marcação Content Markup. ..........68 Tabela 4.7 - Exemplo de códigos Unicode para notações e símbolos matemáticos. (79)..75 Tabela 4.8 - Browsers que suportam MathML (76). ................................................76 Tabela 5.1 – Lista de alguns conversores texto-fala disponíveis no mercado.................90 Tabela 5.2 - Exemplos da linguagem de marcação do SAPI 4. (86)..............................92 Tabela 5.3 - Exemplos da linguagem de marcação do SAPI 5. (87)..............................92 Tabela 5.4 - Exemplos da linguagem de marcação do SSML......................................93 Tabela 5.5 - Exemplo de um documento STML......................................................94 Tabela 5.6 - Exemplo de um documento SABLE. (95)..............................................95 Tabela 5.7 - Exemplos de ACSS.........................................................................97 Tabela 5.8 - Exemplo de SALT..........................................................................98 Tabela 5.9 - Exemplo de um documento VoiceXML................................................98 Tabela 6.1 - Exemplos simples de identificação de padrões. (109)...........................103 Tabela 6.2 - Exemplos de uso de meta-caracteres em expressões regulares. (109)......104 Tabela 6.3 - Exemplo de case-insensitive numa expressão regular. (109)..................104 Tabela 6.4 - Exemplo da negação de uma classe de caracteres. (109).......................105 Tabela 6.5 - Abreviaturas de padrões numa expressão regular. (109).......................105 Tabela 6.6 – Aplicação de expressões regulares na prática: “Procura e Substitui”. ......106 Tabela 6.7 - Aplicação de expressões regulares na prática: “Validação”. ..................107 Tabela 6.8 - Comparação entre autómatos finitos dos tipos DFA e NFA.....................112 Tabela 6.9 - Alguns programas e seus motores FSA. (116) .....................................113 Tabela 6.10 - Autómato finito equivalente da expressão regular /a/ ........................113 Tabela 6.11 - Autómato finito equivalente da expressão regular // .........................114 Tabela 6.12 - Autómato finito equivalente da expressão regular /P|Q/ ....................114 Tabela 6.13 - Autómato finito equivalente da expressão regular /PQ/ ......................114 Tabela 6.14 - Autómato finito equivalente da expressão regular /perl/ ....................115 Tabela 6.15 - Autómato finito equivalente da expressão regular /P+/ ......................115 Tabela 6.16 - Autómato finito equivalente da expressão regular /P*/ . .....................115 Tabela 7.1 - API do Componente .NET..............................................................122 Tabela 7.2 - Lista de funções de numerais.pm ...................................................134 Tabela 7.3 – Números cardinais em português europeu (120).................................135 Tabela 7.4 - Exemplos de conversão de cardinais................................................136 Tabela 7.5 - Números ordinais em português (120)..............................................137 Tabela 7.6 - Exemplos de conversão de ordinais. ................................................137 Tabela 7.7 - Números fraccionários em português europeu....................................138 19 Tabela 7.8 – Exemplos de conversão de fraccionários...........................................139 Tabela 7.9 - Exemplos de conversão de decimais. ...............................................139 Tabela 7.10 - Exemplos de conversão de números romanos...................................140 Tabela 7.11 - Exemplos de conversão de números de telefone. ..............................140 Tabela 7.12 - Exemplos de conversão de datas...................................................141 Tabela 7.13 - Exemplos de conversão de horas...................................................142 Tabela 7.14 - Exemplo de conversão de escalas ou apostas....................................142 Tabela 7.15 - Exemplos de conversão de resultados desportivos.............................143 Tabela 7.16 - Exemplos de conversão de percentagens.........................................143 Tabela 7.17 - Exemplos de conversão de quantidades monetárias. ..........................144 Tabela 7.18 - Exemplos de conversão no formato de engenharia.............................144 Tabela 7.19 - Exemplo de conversão de potências...............................................145 Tabela 7.20 - Lista de funções de acronimos.pm ................................................146 Tabela 7.21 - Exemplos de conversão de acrónimos.............................................147 Tabela 7.22 – Lista de funções de abreviacoes.pm ..............................................148 Tabela 7.23 - Exemplos de conversão de abreviaturas..........................................150 Tabela 7.24 - Lista de funções de referenciasrede.pm .........................................150 Tabela 7.25 - Exemplos de conversão de endereços de Internet. ............................151 Tabela 7.26 - Exemplos de conversão de endereços de correio electrónico. ..............151 Tabela 7.27 - Exemplos de conversão de endereços de rede do tipo IP.....................152 Tabela 7.28 - Lista de funções de autorecon.pm ................................................156 Tabela 7.29 – Exemplos de Entidades MathML e respectivos códigos Unicode. ............158 Tabela 7.30 – Exemplos de operadores MathML e respectivas descrições...................159 Tabela 7.31 – Exemplos de funções MathML e respectivas descrições.......................159 Tabela 7.32 – Exemplos de códigos Unicode e respectivas descrições.......................159 Tabela 7.33 – Comparação entre XSLT para converter Content em Presentation. ........161 Tabela 11.1 – Movimento dos olhos durante leitura de ficção e matemática...............226 Tabela 12.1 - Estatísticas: testes finais de conversão. ..........................................235 Tabela 12.2 – Estatísticas: conversão do corpus matemático. .................................236 Tabela 12.3 – Estatísticas: conversão de fichas matemáticas..................................237 Tabela 12.4 – Estatísticas: conversão de documentos on-line. ................................238 20 Página em branco. 21 Abreviaturas e Acrónimos AKML AudioMath Knowledge Markup Language API Application Programming Interface ASCII American Standard Code for Information Interchange CSS Cascading Style Sheets DLL Dynamic Link Library DOM Document Object Model DTB Digital Talking Book DTD Document Type Definition GUI Graphical User Interface HTML HyperText Markup Language ICEVI International Council for Education of People with Visual Impairment MathML Mathematical Markup Language OMS Organização Mundial de Saúde PDF Portable Document Format PERL Practical Extraction and Report Language RTF Rich Text Format SAPI Speech API SAX Simple API for XML SGML Standard Generalized Markup Language SSML Speech Synthesis Markup Language SVG Scalable Vector Graphics URI Universal Resource Identifier URL Universal Resource Locator W3C World Wide Web Consortium WCAG Web Content Accessibility Guidelines WYSIWYG What You See Is What You Get XHTML eXtensible HyperText Markup Language XML eXtensible Markup Language XSD XML Schema Definition XSLT eXtensible Style Language Transformation 22 Página em branco. 23 Glossário API Application Programming Interface – Conjunto de funções e rotinas para uso do programador e do utilizador, de modo a permitir o uso da aplicação numa forma fácil, estável e consistente. Applet Programa em Java que pode ser utilizado num documento on-line através do uso da etiqueta de marcação <OBJECT>. Braille Trata-se de um processo de escrita em relevo para a leitura táctil, inventado por Luís Braille (1809-1852). Compõe-se de 63 sinais formados por pontos, a partir de um conjunto matricial idêntico a uma sena de dominó, ao alto. Com o Braille representam-se diversos alfabetos, assim como a matemática, a geometria, a química, a fonética, a informática e a música. Browser Aplicação apropriada para aceder aos e interagir com os conteúdos da Internet. Navegador de páginas on-line. Por exemplo: Internet Explorer, Netscape, Opera ou Mozilla. Corpus Compilação de documentos ou informações relativos a uma disciplina ou tema; conjunto finito de enunciados representativos de uma determinada estrutura. GUI Graphical User Interface – Aplicação com capacidade de apresentação de conteúdos multimédia. A entrada de dados faz-se geralmente com recurso ao teclado e ao rato. Leitor de ecrã Aplicação que acede ao texto apresentado visualmente no ecrã do computador, gerando a partir dessa informação saídas de voz sintetizada. 24 Markup Anotação, conjunto de etiquetas de marcação, ou complemento sintáctico do conteúdo, veiculando-lhe significado estrutural, tornando-o activo ou invocando conteúdo que o substituirá. Parser Analisador de uma determinada linguagem, com capacidade para interpretar a sua estrutura, permitir a sua navegação e executar acções consoante a semântica dessa linguagem. Plug-in Mecanismo ou aplicação externa que se adiciona a uma aplicação já existente, com o objectivo de lhe conferir novas funcionalidades. Por exemplo, o MathPlayer é um plug-in que permite a visualização de fórmulas matemáticas em MathML no Internet Explorer 6.0. Standard Norma ou normalização de algo. Unicode Norma internacional que permite codificar os caracteres de um documento, atribuindo-lhe um nome e um número. Suporta quase todas as línguas do mundo. Web Sistema de acesso à informação, apresentada sob a forma de hipertexto, na Internet. WYSIWYG What You See Is What You Get - Diz-se que uma ferramenta é do tipo WYSIWYG se o resultado final, aquando da visualização ou impressão, for exactamente igual aquilo que o criador viu durante a fase de produção do documento. 25 1 Introdução e Motivação “Engenharia não é meramente saber e ter conhecimento, como uma enciclopédia; engenharia não é meramente análise; engenharia não é meramente possuir a capacidade de descobrir soluções elegantes para problemas; engenharia é colocar em prática a arte organizada de forçar as mudanças tecnológicas... os engenheiros operam na interface entre a ciência e a sociedade...”1 - Dean Gordon Brown (1907-1996). Desde os primórdios dos tempos que o homem sente necessidade de se exprimir e de comunicar. A linguagem permite ao homem estruturar o seu pensamento, traduzir o que sente, registar o que conhece e comunicar-se com outros homens. É uma capacidade que pode ser exprimida de variadas formas, tais como a escrita, a leitura, o desenho, ou até as emoções. No mundo da ciência e da comunidade técnica e cientifica, a comunicação, a educação, a distribuição e a partilha de conhecimento é realizada através de canais tais como: livros, revistas, artigos ou até mesmo da Internet desde o seu aparecimento em 1973 (1). A quantidade de documentos técnicos ou conteúdos científicos on-line tem crescido substancialmente nos últimos trinta anos, e o paradigma da educação começa a mudar em direcção da era digital (2). Em Junho de 2005 foi estabelecido que 14,6% da população mundial (cerca de 938 milhões de pessoas) utiliza activamente a Internet (3). No entanto, apesar do vasto acesso à informação electrónica, existe um grupo considerável de pessoas com necessidades especiais, para as quais este acesso é pouco facilitado e nalguns casos impossibilitado. São caso disso os cegos ou os amblíopes. Segundo um estudo realizado em 2002, o ICEVI2 e a OMS3 concluíram que 35 milhões de pessoas no mundo são cegas e outras 124 milhões de pessoas sofrem de um qualquer tipo de deficiência visual (4). Geralmente o acesso à educação e à informação técnica é bastante limitado nas pessoas com deficiências visuais (5)(6)(7). Este acesso é feito, tipicamente, com recurso a documentação em Braille, gravações áudio de livros e revistas ou, em casos mais 1 http://www.quotationspage.com/quotes/Dean_Gordon_Brown/ 2 International Council for Education of People with Visual Impairment - http://www.icevi-europe.org/ 3 Organização Mundial de Saúde - http://www.who.int/en/ 32 • Uso de HTML e Fontes de Símbolos; • Uso de XHTML (20) e CSS (21); • Uso de linguagens de marcação: MINSE (22), MathML (23), SVG (24) e outros. 2.1.1 Uso de imagens na representação de expressões matemáticas A maioria de documentos técnicos é publicada na Internet sob a forma de documentos HTML ou XHTML, em que as fórmulas matemáticas existentes nos documentos são transformadas e convertidas em imagens. Esta é a abordagem de programas como, por exemplo, LaTeX2HTML (25) e TeX4ht6 (26). No entanto, este processo tem duas grandes desvantagens: a fraca resolução das imagens, e a introdução de um problema de acessibilidade nas mesmas, uma vez que estas terão de possuir uma descrição que permita ler a expressão matemática (12) para que possam ser interpretadas por um cego. A grande vantagem é que o utilizador não necessita de instalar um mecanismo externo (plug-in) no navegador de páginas web (browser), uma vez que o HTML é suportado nativamente. 2.1.2 Uso de formatos alternativos: PDF, TeX, Postscript, Word ou RTF É frequente a publicação de documentos técnicos sob a forma de ficheiros numa página on-line, disponíveis para descarregamento (download) por qualquer pessoa. Alguns dos formatos utilizados são: PDF, TeX, Postscript, Microsoft Word ou RTF. No entanto, a visualização destes documentos só é possível se o navegador de páginas on-line possuir mecanismos visualizadores externos para cada tipo de formato, ou então usando um editor próprio após o descarregamento do documento. Existem duas grandes desvantagens no uso destes formatos alternativos: a necessidade de possuir um mecanismo externo instalado, e a falta de acessibilidade na leitura destes documentos, uma vez que a sua navegação depende de um visualizador onde não existe um controlo eficiente por parte de tecnologias assistidas, como por exemplo os leitores de ecrã. Contudo, a Adobe tem feito alguma pesquisa e investimento com o objectivo de tornar o formato PDF mais acessível (27). As vantagens deste método consistem no facto de estes formatos se encontrarem largamente difundidos e aceites pelos utilizadores; assim como a qualidade de impressão dos mesmos. 6 Recentemente foi implementado um módulo de MathML no TeX4ht, como alternativa às imagens. 33 2.1.3 Uso de applets de Java para gerar representações gráficas de equações Um applet é um programa escrito em Java que pode ser incluído num documento HTML, conferindo interactividade e dinâmica aos seus conteúdos. Esta abordagem é adoptada pelo WebEQ (28), constituído por um servidor de applets que recebe como parâmetro um conjunto de marcações que representam uma expressão matemática. Actualmente o WebEQ recebe expressões matemáticas especificadas numa linguagem de marcações denominada WebTeX (29). Os blocos de WebTeX são embebidos no documento HTML, que são transformados nas suas representações gráficas pelo WebEQ. Este processo possui as mesmas vantagens e desvantagens que o uso de imagens que contêm expressões matemáticas. No entanto, o uso de um applet torna o acesso ao documento mais lento. 2.1.4 Uso de plug-ins para gerar representações gráficas de equações O uso de mecanismos externos (plug-ins) para gerar representações gráficas de expressões matemáticas possui características idênticas ao uso de applets de Java. Um exemplo desta abordagem é o TechExplorer (30) da IBM e o MathPlayer (31) da Design Science. Ambos os programas suportam a linguagem de marcação da W3C para expressões matemáticas: MathML (Mathematical Markup Language). 2.1.5 Uso de HTML e fontes de símbolos Esta abordagem tem como objectivo fornecer o documento HTML o mais simples possível, comprometendo geralmente o aspecto estético do documento. Um exemplo desta abordagem é o translator TtH7 (32) que converte um documento codificado em TeX para HTML utilizando: fontes de símbolos suportadas pelo HTML 4.0 para representar glifos matemáticos, e etiquetas de marcação de HTML 3.2 para estruturar as fórmulas matemáticas. A grande vantagem deste método encontra-se na simplicidade e na rapidez. A grande desvantagem está na falta de acessibilidade da informação que é produzida em HTML, uma vez que são usadas tabelas para a criação da estrutura das expressões. 7 Recentemente foi implementado um módulo que converte para MathML. 34 2.1.6 Uso de XHTML e CSS Um dos métodos recentemente usados para visualizar expressões matemáticas em documentos on-line consiste no uso de XHTML com CSS. Este processo possui algumas desvantagens: existe uma acentuada curva de aprendizagem das linguagens de estilo, nem todos os navegadores de páginas on-line (browsers) suportam todas as versões de CSS, e a complexidade das equações representadas é limitada, devido ao actual suporte do CSS. As vantagens são: a simplicidade, a rapidez e o facto de não ser necessário instalar nenhum mecanismo externo (plug-in) adicional. Actualmente a W3C encontra-se a estudar o uso do CSS 3 para as fórmulas matemáticas, nomeadamente a nível de interpretação oral (33). 2.1.7 Uso de Linguagens de Marcação: MINSE, MathML, SVG e outros Existem diversas linguagens de marcação para a publicação de expressões matemáticas na Internet. Alguns exemplos são: MINSE, MathML8, WebTeX, TeX, OpenMath (34) e SVG. Contudo, a maioria delas encontra-se ainda numa fase de experimentação e com falhas em diversas áreas. A aplicação de MINSE consiste no recurso a um mecanismo externo que converte a notação da fórmula matemática, codificada em MINSE, para uma imagem, o que já foi referido provoca problemas de acessibilidade. O uso de SVG para a representação gráfica de expressões matemáticas também provoca problemas de acessibilidade, uma vez que as expressões deixam de possuir semântica para apresentarem apenas um conjunto de linhas, polígonos e caracteres. Apenas o TeX, o MathML e o OpenMath têm conseguido proliferar junto da comunidade científica. Actualmente, as alternativas de conversão de documentos em TeX e LaTeX passam pela transformação e produção de documentos on-line XHTML com MathML. O mesmo se passa com o OpenMath que é uma codificação publicada e incluída na codificação MathML. Sendo assim, o futuro da publicação on-line de documentos técnicos e científicos com expressões matemáticas passa pela linguagem de marcação matemática – MathML. Por esse motivo, esta foi a tecnologia eleita para o desenvolvimento do trabalho realizado no âmbito desta dissertação. 8 A linguagem de marcação matemática MathML é abordada num capítulo próprio desta dissertação. 35 2.1.8 Programas para produção e publicação Actualmente, os dois grandes formatos de produção de conteúdos técnicos e científicos são: o LaTeX/TeX e o Microsoft Word. A publicação destes materiais, de uma forma directa, na Internet exige uma conversão e transformação dos documentos originais em documentos on-line usando HTML ou XHTML (discutido nas secções anteriores). Concluiu-se também que de entre todas as tecnologias apresentadas, o MathML aparece como a referência para a publicação de expressões matemáticas na Internet. Sendo assim, de seguida são apresentados exemplos de aplicações que permitem a produção de conteúdos matemáticos em MathML: • MathType (35) o Propriedade da DesignScience. o Versão profissional do conhecido Microsoft Equation Editor e como tal, integrado no Microsoft Word. o Produz documentos com os formatos: HTML+Imagens e XHTML+ MathML. o Os documentos gerados por esta aplicação necessitam do mecanismo externo MathPlayer, para poderem ser correctamente visualizados no Internet Explorer 6.0. o Foi a aplicação maioritariamente utilizada nas experiências realizadas no âmbito desta dissertação. • WebEQ o Propriedade da DesignScience. o Subdivide-se nos produtos: WebEQ Editor e WebEQ Publisher. o Produz documentos com os formatos: HTML+Imagens, HTML+Applets e XHTML+MathML. • Mathematica (36) e Publicon (37) o Propriedade da Wolfram Research. o Produzem documentos com os formatos: XHTML+MathML, XML, TeX e HTML. • Scientific Word (38) o Propriedade da Mackichan Software. o Produz documentos com os formatos: XHTML+MathML e LaTeX. 36 • SciWriter (39) o Propriedade da Soft4Science. o Produz documentos com os formatos: XHTML+MathML e LaTeX. A Tabela 2.1 compara as aplicações enumeradas anteriormente, em relação ao: tipo de linguagem de marcação de MathML usado; codificação MathML em fórmulas individuais ou documentos completos; e tipo de aplicação (comercial ou gratuita). Tabela 2.1 - Comparação entre editores de MathML. Produto Presentation MathML Content MathML Fórmulas individuais Documentos completos Comercial? MathType Sim Não Sim Não Sim WebEQ Sim Sim Sim Não Sim Mathematica Sim Sim Sim Sim Sim Publicon Sim Sim Sim Sim Sim Scientific Word Sim Não Não Sim Sim SciWriter Sim Não Não Sim Sim Existem também soluções para os autores que produzem documentos técnicos em LaTeX ou TeX. Alguns exemplos são: • Itex2mml (40) o Programa em C, gratuito, que converte fórmulas matemáticas escritas num dialecto de TeX (IteX), em MathML. o Produz documentos no formato: XHTML+MathML. o Usa MathML Presentation Markup. • TeX2MML (41) o Conversor on-line que transforma equações matemáticas codificadas em LaTeX para MathML. o Usa MathML Presentation Markup. 37 • TeX4ht o Converte documentos em LaTeX ou TeX, em documentos HTML. o Produz documentos com os formatos: HTML+Imagens, XHTML, XHTML+MathML. o Usa MathML Presentation Markup. • TtM (42) o Programa comercial que converte documentos codificados em LaTeX e TeX, em documentos com o formato XHTML+MathML. o Usa MathML Presentation Markup. • LaTeX2HTML o Programa que converte documentos codificados em LaTeX, em documentos HTML. Recomenda-se a consulta da lista oficial de aplicações que processam MathML (43), na página on-line da linguagem de marcação matemática – MathML. O trabalho desenvolvido no âmbito desta dissertação também se encontra aí listado (44). 2.2 Leitura de Expressões Matemáticas Apesar da existência de diversas tecnologias, como por exemplo Braille ou leitores de ecrã, que permitem um cego “ler” um documento on-line, poucas são as que conseguem processar conteúdos matemáticos. Na realidade existem escassos projectos que abordam a temática da leitura de expressões matemáticas. Tanto quanto se conhece, os únicos trabalhos de referência nesta área são: • ASTER de T.V. Raman; • MathTalk de Robert Stevens; • MathSpeak de Abraham Nemeth; • MathGenie de Arthur Karshmer; • MathPlayer da Design Science; • Projecto LAMBDA; • E por fim, o projecto de investigação AudioMath. 38 2.2.1 ASTER ASTER (45) (Audio System for Technical Readings) é uma aplicação desenvolvida por T.V. Raman em 1994 durante a preparação da sua tese de doutoramento (46) cuja finalidade consiste na reprodução oral de documentos com conteúdos matemáticos em LaTeX. Trata-se de uma aplicação LINUX que usa o programa Emacs9. O ASTER é constituído por três componentes: • Analisador de LaTeX – cuja finalidade é a criação de uma representação interna do documento e das fórmulas matemáticas, para facilitar a manipulação e a interpretação; • Linguagem de marcação áudio – AFL (Audio Formatting Language) – cuja finalidade é a marcação do texto convertido para a reprodução áudio; • Navegador – usado para navegação nos documentos. O trabalho desenvolvido por Raman é ainda hoje considerado uma referência na leitura das expressões matemáticas. 2.2.2 MathTalk MathTalk (47)(48) é uma aplicação desenvolvida por Robert Stevens em 1996 durante a preparação da sua tese de doutoramento (49) cuja finalidade consiste na aplicação de conceitos relacionados com a memória e o controlo de fluxo da informação, para a reprodução áudio de expressões algébricas codificadas em LaTeX. O trabalho realizado por Stevens inclui o estudo da prosódia de expressões de álgebra simples e a implementação de um método de auxílio à navegação. Este método consiste numa leitura de alto nível da fórmula matemática, antes da leitura detalhada. Apesar das fórmulas matemáticas terem sido estudadas de forma simplista, o trabalho de Stevens foi um dos primeiros a apresentar resultados sobre a prosódia da matemática. 9 GNU Emacs - http://www.gnu.org/software/emacs/emacs.html 39 2.2.3 MathSpeak O projecto MathSpeak (50) foi inicialmente desenvolvido por Abraham Nemeth, o inventor do código Braille Nemeth (51)(52), em 2000. O objectivo do MathSpeak consiste na especificação de um conjunto de regras de discurso oral para a leitura de fórmulas matemáticas, facilitando a transcrição de documentos matemáticos para Braille. Usando o dialecto de MathSpeak, a fracção 12 seria lida como: “B-frac 1 over 2 E-frac”, sendo que B-frac significa “begin-fraction” (inicio de fracção) e E-frac significa “end-fraction” (fim de fracção). Em 2004, foi iniciado um projecto de integração do MathSpeak na especificação DTB (Digital Talking Books) (53) onde foi desenvolvido um conversor de MathML para a linguagem MathSpeak. 2.2.4 MathGenie Os estudos realizados por Karshmer e sua equipa (54)(55)(56)(57) baseiam-se na forma como a matemática é percepcionada pelo ser humano, e na interacção multimodal para utilizadores com necessidades especiais. Com base nesses projectos de investigação, Karshmer disponibilizou, em Março de 2005, uma aplicação denominada MathGenie (58), cujos objectivos consistem na: • leitura não ambígua de expressões matemáticas usando uma notação normalizada e publicada pelo projecto MathSpeak; • identificação de níveis semânticos numa expressão matemática; • possibilidade de navegação entre esses níveis. A aplicação MathGenie, desenvolvida para o sistema WINDOWS, recebe como fonte de informação uma expressão matemática em MathML e converte-a na notação MathSpeak. Posteriormente esta é reproduzida oralmente através de um conversor texto-fala. 40 2.2.5 MathPlayer MathPlayer é um mecanismo externo (plug-in) desenvolvido pela Design Science, em 2002, com o objectivo de permitir a visualização de expressões matemáticas codificadas em MathML Presentation Markup, no Internet Explorer 6.0. Em 2004 surge o MathPlayer 2.0 (59) com capacidades de interpretação oral de uma fórmula matemática através de um conversor texto-fala, assim como um sistema de ampliação visual das expressões matemáticas. Esta aplicação faz uso do Microsoft Standard Accessibility Interface (MSAA), o que lhe permite a integração com diversos leitores de ecrã (screen-readers). O MathPlayer é actualmente um dos principais mecanismos de visualização e leitura de fórmulas matemáticas em MathML. Encontram-se em desenvolvimento mecanismos de navegação e pesquisa de fórmulas matemáticas. 2.2.6 Projecto Lambda LAMBDA (Linear Access to Mathematics for Braille Device and Audio synthesis) (60)(61) é um projecto financiado pela União Europeia e com o objectivo de criar uma ferramenta de escrita e leitura de textos matemáticos para cegos, com inicio em 2002 e fim em 2005. Até ao momento da escrita desta dissertação, ainda não tinham sido publicadas as conclusões da investigação. As aplicações desenvolvidas no âmbito deste projecto utilizam um código intermédio, denominado código Lambda, para transformar as expressões matemáticas em MathML ou LaTeX, e vice-versa. São utilizados como periféricos dispositivos Braille e dispositivos de síntese de fala. 2.2.7 Projecto AudioMath Em 2003, na conclusão da licenciatura e como projecto final de curso do autor desta dissertação, foi desenvolvida uma ferramenta com capacidade de conversão de documentos de texto em voz. A esta ferramenta deu-se o nome de AudioMath (62)(63)(64)(65)(66). Neste projecto foram adquiridos conhecimentos de: metalinguagens, XML, MathML, conceitos de expressões regulares e noções de autómatos. 41 A aplicação desenvolvida consistiu numa biblioteca (DLL10) do tipo ActiveX integrada no módulo de pré-processamento de um conversor texto-fala. Esta DLL era capaz de interpretar parcialmente expressões matemáticas simples, codificadas em MathML Presentation Markup, convertendo-as para texto por extenso, sendo posteriormente sintetizadas em fala. Tanto quanto se conhece, AudioMath foi a primeira aplicação a usar MathML para a interpretação oral das fórmulas matemáticas. No entanto, alguns dos objectivos ficaram por cumprir, como por exemplo: a implementação de um sistema de navegação das fórmulas matemáticas, o estudo da prosódia da leitura das expressões matemáticas, o suporte completo de MathML, e o aperfeiçoamento dos algoritmos de conversão utilizados. Esta dissertação é a continuação deste trabalho desenvolvido pelo autor no seu projecto final de curso. 10 DLL – Dynamic Link Library 48 A Figura 3.11 demonstra a declaração de entidades de XML. <!ENTITY parametro “(#PCDATA)”> - define parâmetros dentro de um DTD. <!ELEMENT nome %parametro; > - usa a definição anterior de parâmetro. <!ENTITY nome_autor “Helder”> - define uma entidade. <nome>&nome_autor</nome>- aplicação da entidade numa marcação. <!ENTITY nome SYSTEM “endereço”> - declaração de uma entidade externa. <!ENTITY vogal SYSTEM “vogal.xml”> - aplicação da declaração. Figura 3.11 – Declaração de entidades num DTD. A declaração de atributos é demonstrada na Figura 3.12. <!ATTLIST nome_elemento nome_atributo tipo valor_predefinido> Figura 3.12 – Declaração de atributos num DTD. Os atributos podem ser dos seguintes tipos: • CDATA: designa um atributo constituído por texto, normalmente colocado entre aspas, e excluindo os caracteres que possam ser confundidos com os caracteres de controlo do XML. • ENTITY e ENTITIES: este tipo de atributo consiste numa forma de ligação do documento XML a um ficheiro que é exterior ao documento e que seja constituído por dados que não são XML. • ENUMERATED: conjunto de atributos, no qual se pode seleccionar os atributos a usar. • ID: usado no XML para identificar um elemento de forma unívoca e clara. • IDREF e IDREFS: atributos cujo valor é o ID de outro elemento no documento. • NMTOKEN e NMTOKENS: restringe o conteúdo de um atributo a um nome que seja válido em XML. • NOTATION: referência a uma entidade externa que não seja um documento XML. 49 O valor_predefinido de um atributo é o valor que este assume se não for inicializado explicitamente ao ser utilizado no documento XML. Este campo pode ser substituído por uma palavra reservada que tome um determinado valor, consoante as situações. Por exemplo: • #REQUIRED: quando o valor do atributo for obrigatório. • #IMPLIED: quando o valor do atributo for facultativo. • #FIXED: o valor do atributo não pode ser mudado. A Figura 3.13 apresenta um exemplo de um DTD e respectivo documento XML. Declaração do DTD: doc.dtd <!ELEMENT documento (cabecalho, corpo)> <!ELEMENT cabecalho (titulo, assunto)> <!ELEMENT titulo (#PCDATA)> <!ELEMENT assunto (#PCDATA)> <!ELEMENT corpo (titulo_corpo, texto, assinatura)> <!ELEMENT titulo_corpo (#PCDATA)> <!ATTLIST titulo_corpo estilo (Bold|Italico) #REQUIRED> <!ELEMENT texto (#PCDATA)> <!ELEMENT assinatura (#PCDATA)> Documento XML: doc.xml <?xml version=”1.0” encoding=”ISO-8859-1”?> <!DOCTYPE documento SYSTEM “doc.dtd”> <documento> <cabecalho> <titulo>Memorando</titulo> <assunto>Mudança do número de telefone</assunto> </cabecalho> <corpo> <titulo_corpo estilo=”Bold”>Informação</titulo_corpo> <texto>O novo número é agora o 1765.</texto> <assinatura>O Director Geral.</assinatura> </corpo> </documento> Figura 3.13 – Exemplo de DTD e uso num documento XML. 50 3.3 XML Schema Definition - XSD Para além de um DTD, existe outra forma de especificar as regras de uma linguagem do tipo XML, através de um XML Schema que surgiu pela primeira vez em 2001. Um XML Schema, ou XML Schema Definition (XSD) pode ser visto como um sucessor de um DTD, uma vez que possui as seguintes vantagens em relação aos anteriores: • Suporte a tipos de dados comuns; • Sistema de classes que favorece a reutilização de estruturas dentro do Schema; • Suporte nativo de XML Namespaces (73); • Facilidade para tratar elementos de conteúdo misto; • Melhor especificação de restrições aos conteúdos do documento XML. A Figura 3.14 exemplifica a estrutura XML com a qual é definido um XSD. <?xml version="1.0"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://lpf-esi.fe.up.pt" xmlns="http://lpf-esi.fe.up.pt" elementFormDefault="qualified"> ... </xs:schema> Figura 3.14 – Estrutura XML de um Schema. A Figura 3.15 exemplifica a definição de um elemento num XSD. <element name=”nome” type=”string”/> - define um elemento. Se não for incluído o atributo type, significa que o elemento é vazio. Figura 3.15 – Definição de um elemento no XSD. Um elemento pode ser de vários tipos. Os mais comuns são: xs:string, xs:decimal, xs:integer, xs:boolean, xs:date e xs:time. 51 Existem dois tipos de elementos num XSD: • Simples – simpleType - só podem conter texto; • Complexos – complexType - podem conter outros elementos ou atributos. <xs:element name=”numero”> <xs:simpleType> <xs:restriction base=”xs:integer”> <xs:maxInclusive value=”100”/> </xs:restriction> </xs:simpleType> </xs:element> <xs:element name=”capa_da_tese”> <xs:complexType> <xs:sequence> <xs:element name=”titulo”/> <xs:element name=”autor”/> <xs:element name=”orientador”/> <xs:element name=”data”/> </xs:sequence> </xs:complexType> </xs:element> Figura 3.16 – Exemplos de elementos de tipos Simples e Complexos no XSD. A Figura 3.17 exemplifica a definição de um atributo num XSD, onde: • name – indica o nome do atributo; • type – indica tipos de dados já referidos no exemplo do elemento; • use – pode ser optional (opcional) ou required (obrigatório); • default – valor por defeito do atributo. <attribute name=”” type=”” use=”” default=”” /> Figura 3.17 – Definição de um elemento no XSD. 52 A Figura 3.18 exemplifica o uso de um XML Schema num documento XML. XML Schema: <?xml version="1.0"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.w3schools.com" xmlns="http://www.w3schools.com" elementFormDefault="qualified"> <xs:element name="note"> <xs:complexType> <xs:sequence> <xs:element name="to" type="xs:string"/> <xs:element name="from" type="xs:string"/> <xs:element name="heading" type="xs:string"/> <xs:element name="body" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> </xs:schema> Documento XML: <?xml version="1.0"?> <note xmlns="http://www.w3schools.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3schools.com note.xsd"> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>Don't forget me this weekend!</body> </note> Figura 3.18 – Exemplo de um XML Schema e respectivo documento XML. 53 3.4 Análise, Interpretação e Conversão de XML - Parsers O processamento de documentos XML é feito por analisadores de XML (parsers). Existem dois tipos de analisadores: • Analisadores baseados em árvores – DOM12 (74) • Analisadores baseados em eventos – SAX13 (75) Os analisadores do tipo DOM mapeiam os documentos numa árvore XML, onde é possível navegar através de funções pré-implementadas. Estes analisadores são bastante versáteis e fornecem uma visão de alto nível do documento. No entanto, uma vez que a árvore é construída com recurso a estruturas de dados, esta abordagem pode consumir bastantes recursos em memória se o documento for de grande dimensão. Os analisadores do tipo SAX reportam eventos relacionados com o inicio e fim dos elementos XML, sendo processados sempre que um evento é chamado. Estes analisadores são bastante simples de se usar e possuem uma visão de baixo nível do documento. São especialmente úteis nos casos em que os documentos a processar requerem uma estrutura de dados própria, que não a de uma árvore XML. Existem diversos analisadores de documentos XML que podem ser adaptados pelos programadores. Por exemplo: • Xerces14 - Suporta DOM e SAX. Possui uma versão JAVA e outra em C++. • XP15 - Suporta apenas SAX. Funciona em JAVA. • Microsoft XML Parser16 - Suporta apenas DOM. Funciona em C++. • XML::Parser17 –Suporta apenas SAX. Funciona em PERL. A maioria dos analisadores XML deriva do analisador Expat, desenvolvido por Clark Cooper em 1999. Para as aplicações desenvolvidas no âmbito desta dissertação, foi utilizado o analisador XML::Parser. 12 DOM – Document Object Model 13 SAX – Simple API for XML 14Java - http://xml.apache.org/xerces-j/index.html; C++ - http://xml.apache.org/xerces-c/index.html 15 http://jclark.com/xml/xp/index.html 16 http://msdn.microsoft.com/xml/default.asp 17 http://search.cpan.org/dist/XML-Parser/ 54 Página em branco. 55 4 Introdução à Linguagem de Marcação Matemática - MathML MathML, linguagem de marcação matemática (Mathematical Markup Language)18, é uma aplicação do XML, desenvolvida pelo W3C para a codificação de expressões matemáticas na web. A primeira versão desta linguagem, MathML 1.0, foi publicada como recomendação do W3C em Abril de 1998. A versão adoptada durante a realização desta dissertação, MathML 2.019, foi publicada em 21 de Outubro de 2001. Esta linguagem fornece uma sintaxe simples e concisa para codificar a estrutura visual e o significado semântico de uma expressão matemática. A utilização de MathML permite desenvolver páginas web com matemática, e adicionar interacção às suas expressões, tais como: aumento visual de uma expressão (zoom), navegação entre sub expressões, descrições na barra de estados de um visualizador de páginas web (browser), e inserção de comentários numa fórmula. Também, e uma vez que os conteúdos são marcados e identificados por esta metalinguagem, a criação de uma base de dados de documentos científicos com MathML tornaria os seus conteúdos facilmente pesquisáveis, indexáveis ou arquiváveis.(23) Ao nível de acessibilidade na web e acesso à informação, o MathML desempenha um papel importante, uma vez que o desenvolvimento de programas de conversão textofala com suporte para MathML permitirão uma interpretação auditiva das expressões matemáticas (76), sendo este um dos principais objectivos do presente trabalho. O facto de o MathML ser uma aplicação XML facilita o processamento por parte de qualquer editor ou analisador (parser) de XML; como se trata apenas de texto puro, duas vantagens são-lhe conferidas: a portabilidade e a independência de plataformas. O uso de MathML aplica-se a cinco categorias principais: • Visualização de conteúdos matemáticos em páginas web. • Criação de conteúdos dinâmicos e interactivos on-line. • Publicação de informação técnica em formato electrónico. • Troca de dados matemáticos entre aplicações. • Interpretação de expressões matemáticas em meios não visuais. 18 Página oficial do MathML em: http://www.w3.org/Math/ . 19 MathML 2.0 2nd Edition, W3C Recommendation: http://www.w3.org/TR/MathML2/ . 56 Fórmula: () 2 ba + MathML Presentation Markup: <math> <mrow> <msup> <mfenced> <mrow> <mi>a</mi><mo>+</mo><mi>b</mi> </mrow> </mfenced> <mn>2</mn> </msup> </mrow> </math> MathML Content Markup: <math> <mrow> <apply> <power/> <apply> <plus/> <ci>a</ci><ci>b</ci> </apply> <cn>2</cn> </apply> </mrow> </math> Figura 4.1 - Exemplo de uma expressão matemática em MathML. Neste capítulo pretende-se apresentar sumariamente alguns conceitos básicos sobre o MathML, descrever os diferentes conjuntos de etiquetas de marcação, apresentar questões relacionadas com Unicode e caracteres especiais nos documentos MathML, comentar sobre os métodos de publicação de MathML, e por fim abordar o uso desta tecnologia para a interpretação áudio de fórmulas matemáticas (área onde o trabalho desta dissertação foi desenvolvido). Actualmente existem diversas ferramentas que lidam com o MathML. Uma listagem com as ferramentas mais conhecidas pode ser encontrada na página de Internet do MathML - http://www.w3.org/Math/Software/mathml_software_by_name.html. 57 4.1 Etiquetas de Marcação de MathML Uma vez que o MathML é uma aplicação XML, as regras apresentadas no capítulo anterior dedicado ao XML aplicam-se ao vocabulário do MathML. No entanto foram introduzidas regras adicionais que encaixam nas seguintes categorias: • Restrições ao tipo de valor que um atributo de MathML pode conter. • Restrições quanto ao número de filhos de um elemento, e associação de diferentes significados consoante a ordem pela qual esses filhos são apresentados. Geralmente, nestes casos, os filhos são denominados de argumentos. Embora um analisador (parser) de XML não reconheça as violações a estes dois pontos, o não cumprimento destas regras deverá ser reconhecido como erro por um analisador de MathML. O MathML, tal como o XML, também é sensível ao uso de maiúsculas e minúsculas (case-sensitive), no entanto todos os elementos e atributos foram declarados no seu DTD (77) como sendo usados em minúsculas. O elemento raiz do MathML é <math></math>. Todas as expressões matemáticas isoladas deverão estar incluídas dentro deste elemento raiz. Existem dois conjuntos de etiquetas de marcação no MathML: Presentation Markup e Content Markup. Mais adiante, neste capítulo, serão aprofundados os seus conceitos e propriedades. O MathML possui características importantes em relação aos espaços em branco nos conteúdos das suas marcações e nas suas próprias marcas: • Todos os espaços em branco, espaçamentos e símbolos de espaçamento ou mudança de linha (tab, new line e carriage return) são ignorados. • Os espaços em branco dentro das etiquetas de marcação são eliminados no principio e no fim da etiqueta. • Quando existe uma sequência de espaços brancos dentro de uma etiqueta, estes são substituídos por um só espaço. Quando é propositado o uso de uma sequência de espaços brancos, deverão ser usados códigos de formatação próprios, como por exemplo: ou . 64 relações, cálculo e cálculo vectorial, teoria de conjuntos, sequências e séries, funções elementares clássicas, estatística e álgebra linear. Falta apenas referir um aspecto relevante: a maioria dos programas de edição e criação de documentos técnicos com MathML utiliza Presentation Markup para a publicação dos seus documentos, embora alguns possam utilizar Content Markup na troca de dados entre aplicações. Isto deve-se ao facto de serem editores do tipo WYSIWYG25 onde é valorizada a apresentação visual da expressão matemática, com prioridade relativamente ao conceito ou significado da mesma. 4.1.2 Descrição sumária das etiquetas de marcação de MathML Presentation Markup O conjunto de etiquetas de marcação de Presentation Markup possui cerca de 30 elementos e 50 atributos que descrevem a notação e a representação visual de uma expressão matemática. A maioria dos elementos de Presentation Markup podem ser divididos em duas categorias: token elements e layout schemata. Existem ainda outros elementos que não pertencem a nenhuma das duas categorias: none e prescripts (que são elementos vazios); e maction (que é usado para adicionar interactividade às equações matemáticas). Token elements são marcas que representam os mais pequenos blocos de construção de notação matemática, isto é, números, operadores e identificadores que representam nomes de variáveis ou funções. Também podem ser usados para representar texto, espaços brancos ou glifos. Este tipo de elementos são os únicos neste conjunto de etiquetas de marcação, que podem conter directamente dados, sejam caracteres de Unicode ou referências para entidades MathML. 25 What You See Is What You Get ( “o que vê é o que vai obter” ) 65 Tabela 4.3 - Tipos de Token Elements (Presentation Markup). Elemento Papel desempenhado mn número mo operador, separador ou barreira mi identificador mtext texto mspace espaço em branco ms string mglyph glifo Layout schemata são marcas que especificam modelos para construir expressões a partir de pequenos blocos de construção de notação matemática. Este tipo de elementos só podem conter outros elementos. As regras de interpretação destes elementos são mais complexas do que os token elements uma vez que especificam formas de construir uma estrutura bidimensional a partir de expressões mais pequenas. Tabela 4.4 - Tipos de Layout Schemata (Presentation Markup). Elemento Papel desempenhado mrow agrupa expressões pequenas na linha horizontal mfrac fracção msqrt raiz quadrada mroot raiz mstyle aplica estilos mphantom torna o conteúdo invisível mfenced agrupa os conteúdos com alguma forma de barreira, ex.: parêntesis mpadded ajusta espaços em volta dos conteúdos menclose aplica símbolo de agrupamento de conteúdos merror mensagem de erro msub adiciona um subscript à base msup adiciona um superscript à base msubsup adiciona um par subscript-superscript à base munder adiciona um underscript à base 66 mover adiciona um overscript à base. munderover adiciona um par underscript-overscript à base mmultiscripts adiciona múltiplos prescripts e postscripts à base mtable tabela ou matriz mtr linha de uma tabela mlabeledtr linha de uma tabela com nome mtd célula de uma tabela maligngroup grupo de alinhamento malignmark marca de alinhamento Anteriormente foi referido que o MathML impunha, como regras extras às do XML, o número de filhos de um elemento, denominados argumentos. A Tabela 4.5 resume o número de argumentos de determinados elementos do Presentation Markup: Tabela 4.5 - Argumentos para cada elemento de Presentation Markup. Elemento Nº de argumentos Papel desempenhado pelo argumento mrow 0 ou mais mfrac 2 numerador denominador msqrt 1* mroot 2 base raiz mstyle 1* merror 1* mpadded 1* mphantom 1* mfenced 0 ou mais menclose 1* msub 2 base subscript msup 2 base superscript msubsup 3 base subscript superscript munder 2 base underscript mover 2 base overscript munderover 3 base underscript overscript 67 mmultiscripts 1 ou mais base (underscript overscript)* [<mprescripts/>(underscript overscript)*] mtable 0 ou mais elementos mtr ou elementos mlabeledtr mtr 0 ou mais elementos mtd mlabeledtr 2 etiquetas ou elementos mtd mtd 1* maction 1 ou mais depende do atributo actiontype O sinal 1* possui uma propriedade especial: significa que o elemento em questão actua como se existisse uma marca mrow a envolver uma expressão mais pequena. Por exemplo: <math><msqrt><mo>-</mo><mn>1</mn></msqrt></math> é equivalente a: <math><msqrt><mrow><mo>-</mo><mn>1</mn></mrow></msqrt></math> Figura 4.5 - Exemplo do uso de <mrow> em Presentation Markup. No Anexo A são apresentados exemplos de Presentation Markup. 4.1.3 Descrição sumária das etiquetas de marcação de MathML Content Markup O conjunto de etiquetas de marcação de Content Markup possui cerca de 150 elementos e 12 atributos que descrevem o conceito e significado de uma expressão matemática. A maioria dos elementos de Content Markup pode ser dividido nas seguintes categorias: • Token elements – são os únicos elementos a conter dados. Todos os outros podem conter apenas outros elementos. Existem três elementos: cn (contém números), ci (contém identificadores) e csymbol (contém símbolos definidos pelo autor). • Elementos de construção – são elementos que constroem expressões matemáticas combinando dados com operadores ou funções. Por exemplo: apply. 68 • Operadores e Funções – tal como o nome indica, estes elementos correspondem a operadores e funções. Por exemplo: int (integral), sin (seno de) e plus (adição). • Qualifier elements – são elementos que contribuem para fornecer informação adicional ao significado de outros elementos. Por exemplo: uplimit, lowlimit e bvar são elementos usados para especificar o limite superior, o limite inferior e a variável de integração, de um integral definido pelo elemento int. • Constantes e Símbolos – tal como o nome indica, estes elementos correspondem a constantes e símbolos. Por exemplo: pi (número pi), exponentiale (número de neper) e infinity (símbolo do infinito). • Elementos de mapeamento semântico – são elementos utilizados para fornecer informação adicional sob a forma de anotações ou comentários. Exemplo: annotation. Tabela 4.6 - Elementos do conjunto de etiquetas de marcação Content Markup. Categoria Elementos Token elements ci, cn, csymbol Elementos de construção básicos apply, lambda, declare, reln, fn, set, list, vector, matrix, matrixrow, interval, piecewise, piece, otherwise, domaIn codomaIn image, inverse, ident Aritmética, Álgebra e Lógica plus, minus, times, divide, power, root, quotient, rem, exp, factorial, Max, mIn gcd, abs, conjugate, arg, real, imaginary, lcm, floor, ceiling, and, or, xor, not, implies, forall, exists Relações eq, neq, gt, lt, geq, leq, equivalent, approx, factorof, tendsto, In notIn subset, prsubset, notsubset, notprsubset Funções elementares exp, ln, log, sin cos, tan, sec, cosec, cot, sinh, cosh, tanh, 69 sech, cosech, coth, arcsin arccos, arctan, arcsec, arccosec, arccot, arcsinh, arccosh, arctanh, arcsech, arccosech, arccoth Teoria de Conjuntos set, list, union, intersect, setdiff, card, cartesianproduct Sequências e Séries sum, product, limit Álgebra Linear determinant, transpose, selector, vectorproduct, scalarproduct, outerproduct Calculus int, diff, partialdiff, grad, divergence, curl, laplacian Estatística mean, median, mode, var, sdev Qualifier elements bvar, lowlimit, uplimit, degree, logbase, domainofapplication, momentabout Constantes e Símbolos pi, exponentiale, eulergamma, infinity, imaginaryi, true, false, emptyset, notanumber, integers, reals, rationals, complexes, primes, naturalnumbers Elementos de mapeamento semântico semantics, annotation, annotation-xml Como se pode observar pela Tabela 4.6, o conjunto de etiquetas de marcação de Content Markup cobre poucas áreas da matemática (ensino básico, secundário e alguns casos do ensino superior). Cada um dos elementos de marcação de Content Markup possui um significado semântico, no entanto existem dois atributos importantes que permitem mudar o conceito de um elemento: • definitionURL – indica um endereço web onde se encontra a informação acerca do significado do elemento; • encoding – especifica em que formato se encontra a informação. 70 Por exemplo, o elemento times representa, por defeito, a operação multiplicação entre dois números. No entanto, é possível modificar a semântica deste elemento para que ele represente o produto interno de dois vectores: B A× <apply> <times encoding=”text” definitionURL=”http://www.exemplo.com/produtointerno.html”/> <ci type=”vector”>A</ci> <ci type=”vector”>B</ci> </apply> Figura 4.6 - Exemplo do uso de definitionURL em Content Markup. Contudo, o uso do atributo definitionURL é problemático, uma vez que não é conhecido o que se encontra no endereço especificado, nem existe uma normalização sobre a forma como se deve apresentar essa informação adicional. No Anexo B são apresentados exemplos de Content Markup. 4.2 Unicode & MathML Todos os computadores lidam com números, e gravam letras e outros caracteres na memória designando um número para cada um deles. Antes de o Unicode ser inventado, havia centenas de sistemas diferentes de codificação. No entanto, nenhum desses sistemas de codificação poderia conter caracteres suficientes. Por exemplo, a União Europeia por si só requer vários sistemas de codificação diferentes para cobrir todas as línguas. Mesmo para uma única língua como o inglês não havia sistema de codificação adequado para todas as letras, pontuação e símbolos técnicos em uso corrente. No entanto, estes sistemas também podem entrar em conflito entre si, uma vez que dois codificadores podem usar o mesmo número para dois caracteres diferentes, ou usar números diferentes para o mesmo caracter. Além disso, cada computador precisa 71 de suportar diversos sistemas de codificação diferentes, o que pode fazer com que alguns dados partilhados entre eles, possam ser corrompidos. O Unicode veio mudar tudo isso fornecendo um número único para cada caracter, independentemente da plataforma, programa ou língua. Isto possibilita que um único programa ou sítio web seja utilizado em qualquer computador sem necessidade de reengenharia, permitindo que os dados sejam partilhados sem serem corrompidos. (78) Sendo assim, fazia todo o sentido para a W3C usar a codificação Unicode para a notação de funções e símbolos matemáticos, assim como para todos os caracteres de MathML. 4.2.1 Unicode Apesar de ser modelado a partir do conjunto de caracteres ASCII26, o Unicode vai mais longe permitindo a codificação de todos os caracteres usados em todas as línguas do mundo. Tem capacidade de codificação para mais de 1 milhão de caracteres. O Unicode trata-os de modo idêntico, o que permite uma enorme flexibilidade na mistura de todo o tipo de caracteres diferentes, sejam eles alfabéticos, símbolos ou ideográficos. Figura 4.7 - Comparação entre tabela de ASCII e tabela de Unicode. (71) O standard de Unicode (71) especifica um valor numérico e um nome para cada um dos caracteres. Juntamente com o código e nome é fornecida informação adicional, como por exemplo, se é maiúsculo ou minúsculo, a direccionalidade do caracter e outras propriedades alfabéticas. 26 ASCII - American Standard Code for Information Interchange – http://www.asciitable.com/ 72 Existem três formas principais de codificação Unicode (UTF – Unicode Transformation Format): • UTF-32 – codificação de 32 bits. • UTF-16 – codificação de 16 bits usada por defeito • UTF-8 – codificação de 8 bits usada para permitir compatibilidade com o ASCII. Para além de permitir compatibilidade com os sistemas baseados em ASCII, o Unicode Standard 4.0 (71) é equivalente ao ISO/IEC 10646, bastando por isso estar em conformidade com o standard Unicode, para estar também em conformidade com a norma ISO. Actualmente o standard de Unicode 4.0 suporta 96.382 caracteres de todo o mundo, e possui ainda reservadas 131.068 posições para novos caracteres. O Unicode foi desenhado e projectado para ser: • Universal – possui um repositório de caracteres de todo o mundo, em todas as línguas e representações possíveis. • Eficiente – actualmente é simples processar um texto. A sincronização entre caracteres deve ser rápida e não ambígua. • Uniforme – um carácter deve ter sempre o mesmo código para que seja facilmente identificado, visualizado e editado. • Não ambíguo - um determinado código de 16-bits representa sempre o mesmo símbolo. Exemplo de que como o Unicode é aplicado no processamento de texto: Quando um utilizador usa um processador de texto e pressiona a letra ‘T’, o computador recebe a informação de que uma tecla correspondente ao símbolo ‘T’ foi pressionada, e codifica o sinal com o código U+0054 (Unicode). De seguida, o processador de texto guarda esse código em memória e passa uma referência para a aplicação que se encarrega da visualização da letra. Essa aplicação usa o número como um índice para encontrar uma imagem de ‘T’, que posteriormente desenha no visor do monitor. Este processo é repetido à medida que o utilizador vai pressionando teclas. 73 Figura 4.8 – Sistema de alocação de códigos Unicode. (71) 4.2.2 Unicode no MathML As notações e símbolos matemáticos são muito importantes em todas as ciências, e têm evoluído bastante ao longo da existência do ser humano; actualmente existem enormes colecções de notações e símbolos. No entanto, se estes símbolos ou glifos não estiverem disponíveis para codificação ou uso num documento, torna-se difícil a produção de conteúdos matemáticos portáveis e facilmente distribuídos, ou apresentados visualmente. Sendo assim, o MathML faz uso do standard Unicode para representar a maior parte dos seus caracteres matemáticos. Todos os caracteres de MathML podem ser definidos como caracteres Unicode legais em documentos XML ou como elementos mglyph. Este último tipo só é usado para representar caracteres que ainda não tenham sido aprovados pelo standard Unicode, e que como tal ainda não possuem uma codificação Unicode. O uso deste tipo é raro, uma vez que a maior parte dos símbolos e glifos são suportados. 80 4.4 Interpretação do MathML para leitura oral de expressões matemáticas Tanto quanto se conhece, o trabalho desenvolvido em (64), e durante esta dissertação, foi o primeiro a fazer um estudo que visava a determinação de elementos e atributos que deveriam de ser usados na conversão áudio de expressões matemáticas em MathML. Nem todos os elementos e atributos do MathML necessitam de ser interpretados e processados na conversão áudio. Por exemplo, atributos visuais ou de estilo nem sempre fornecem informações úteis em relação à expressão e raramente contribuem para um maior enriquecimento da conversão áudio. No entanto, existem casos em que sem os atributos visuais não seria possível compreender a semântica da expressão: 3 2 ⎛⎞ ⎜⎟ ⎝⎠ Elemento: mfrac Atributo: linethickness <> 0 É uma fracção. 3 2 ⎛⎞ ⎜⎟ ⎝⎠ Elemento: mfrac Atributo: linethickness = 0 É um número combinatório. Figura 4.15 - Influência de um atributo visual no significado da fórmula. Nesta secção serão exploradas as hipóteses de escolha de um conjunto de marcação para conversão áudio; e serão apresentados comentários relativos aos elementos e atributos a serem interpretados. 4.4.1 Escolha do conjunto de etiquetas de marcação para conversão áudio O primeiro desafio que se coloca na interpretação oral do MathML é a escolha do conjunto de etiquetas de marcação que se pretende converter. Foi referido na secção 4.1.1 que o MathML se dividia em dois subconjuntos de marcação: Presentation Markup e Content Markup. 81 Embora este último pareça mais adequado à conversão áudio de MathML (uma vez que exprime a semântica de uma expressão matemática), possui dois grandes problemas: • Apenas cobre os níveis básicos da matemática. O dicionário de operadores não é vasto, empobrecendo o seu suporte à matemática.28 • A maioria dos documentos on-line publicados estão codificados com Presentation Markup. Assim sendo, actualmente o uso de MathML Presentation Markup apresenta-se como a melhor escolha para a interpretação oral de expressões matemáticas em MathML. No entanto o uso de Presentation Markup possui um problema de ambiguidade na semântica das fórmulas matemáticas. Por exemplo, a expressão 3 2 A é codificada em Presentation Markup como usando “3” e “2” como índices. Isto torna difícil a interpretação da expressão, uma vez que esta pode ser lida como: “á de índice dois ao cubo” ou como “arranjos de três elementos dois a dois”. Este problema só pode ser resolvido com algoritmos de análise e interpretação mais poderosos e eficazes, o que implica mais esforço de interpretação e conversão. O ideal seria a implementação de uma aplicação capaz de interpretar Parallel Markup, sendo que o significado semântico da fórmula estaria disponível para quebrar a ambiguidade na interpretação. No entanto, são raros os casos em que se encontram documentos codificados com Parallel Markup. 4.4.2 Interpretação de elementos e atributos de Presentation Markup Nesta secção é abordada a necessidade de interpretação e processamento de certos elementos ou atributos do conjunto de etiquetas de marcação de Presentation Markup, para a conversão áudio. Os atributos especiais: class, style, id, xref, xlink:href e other, não são tipicamente processados uma vez que estão maioritariamente associados a propriedades de estilos visuais. 28 O grupo OpenMath referido na secção 4.1.1 está a realizar um trabalho mais extenso e possui um dicionário bastante vasto. 82 Também os atributos dos token elements: mathbackground, mathsize, fontsize, fontweight e fontfamily não são geralmente processados pelos mesmos motivos anteriormente referidos. O processamento do atributo: mathcolor pode ser interessante se tivermos em conta que algumas informações poderão estar codificadas na cor que é utilizada na fórmula matemática. Por exemplo: “a expressão a azul comprime a informação da expressão vermelha”. Na leitura de ambas as expressões, a aplicação precisa de referir a cor das mesmas (caso esteja presente o atributo mathcolor), para que o utilizador seja capaz de co-relacionar as informações da expressão com o texto anterior. O atributo mathvariant é relevante no processamento de MathML. Se for usado com o valor “italic” estará a representar, muito provavelmente, uma função. Se for usado com o valor “bold” estará a representar um vector. Se “fraktur” for usado, então poderá estar a representar álgebra linear. Em relação aos elementos de MathML Presentation Markup, em (64) foi possível reunir as seguintes conclusões: • maction – não é processado em geral. No entanto pode ser interessante se for pretendido que o utilizador obtenha conhecimento acerca das possíveis acções com aquela expressão matemática. • maligngroup, malignmark – não são processados (expressão de informação visual). • menclose – processado, pois identifica um operador. • merror – não é processado. Antes de uma fórmula ser processada, deve ser testada a sua validade. • mfenced – é importante para que se conheçam os delimitadores da expressão matemática. • mfrac – processado, pois identifica um operador. o possui atributo: linethickness – importante porque identifica se expressão é fracção ou número combinatório. • mglyph – processado pois simboliza um ou mais caracteres. o possui atributo: alt – contém a descrição do símbolo. • mi e mn – são processados pois identificam dados. 83 • mlabeledtr – é usado para exprimir o titulo da tabela. • multiscripts – é processado pois identifica operadores. No entanto os seus atributos podem ser descartados. • mo – é processado pois identifica operadores. o possui atributos: moveablelimits, fence, separator e accent – são processados pois implicam mudanças de comportamentos no mo. • mover – é processado pois identifica a posição de limites. • mpadded – não é usado, apenas exprime estilo visual. • mphantom – todos os conteúdos dentro deste elemento devem ser ignorados. • mprescripts – processado uma vez que identifica posições de limites. • mroot – identifica um operador, logo é processado. • mrow – é um dos elementos mais importantes, uma vez que fornece pistas em relação às sub expressões que compõem uma fórmula matemática (útil na colocação de pausas, por exemplo). • ms – identifica um conjunto de caracteres e como tal é processado. • mspace – não é processado. • msqrt – identifica um operador, logo é processado. • mstyle – usado apenas pelo seu atributo displaystyle, uma vez que este atributo pode modificar o comportamento de mo. • msub, msubsup e msup – identificam operadores e são processados. • mtable, mtr e mtd – identificam operadores e são processados. No entanto os seus atributos podem ser descartados. • mtext - identifica um conjunto de caracteres e como tal é processado. • munder e munderover – identificam operadores que posicionam limites, logo são processados. • none – não é processado. 84 4.4.3 Interpretação de elementos e atributos de Content Markup Nesta secção é abordada a necessidade de interpretação e processamento de certos elementos ou atributos do conjunto de etiquetas de marcação de Content Markup, para a conversão áudio. À semelhança do Presentation Markup, os atributos especiais: class, style, id, xref, xlink:href e other, não são tipicamente processados. O atributo encoding – usado para identificar o tipo de codificação de um determinado elemento – é processado tendo em conta que pode ter influência na interpretação do elemento. O atributo definitionURL é uma incógnita. Apesar de ter sido implementado como uma solução que permite a expansibilidade do dicionário de elementos do Content Markup, nunca se sabe que tipo de informação se pode encontrar no endereço em causa. A forma como é interpretado no formato oral é imprevisível. Por isso não é recomendado. Em relação aos elementos de MathML Content Markup, em (64) foi possível reunir as seguintes conclusões: • annotation, annotation-xml e semantics – podem ser processados na conversão áudio, desde que o analisador possua capacidades de interpretação de outras linguagens que não o MathML. • apply – é processado, uma vez que é importante para definir os limites de actuação de um operador. • Todos os elementos que representam operadores devem ser processados e interpretados. 4.4.4 Interpretação de caracteres especiais de MathML Existem algumas entidades ou caracteres especiais em MathML que contribuem positivamente na conversão áudio das expressões matemáticas. Por exemplo: • ⁡ • ⁢ • ⁣ 85 A entidade ⁡ tem como objectivo clarificar a existência de uma função. Por exemplo, na expressão ( ) f x, se for utilizada a entidade ⁡ a conversão áudio será: “éfe de chis”. Sem a entidade, será lida como: “éfe chis”. A entidade ⁢ tem uma função semelhante. Por exemplo, na expressão x y, se for utilizada a entidade ⁢ a conversão será: “chis vezes ípsilon”. Sem a entidade, será lida como: “chis ípsilon”. A entidade ⁣ tem, à semelhança das anteriores, o objectivo de separar logicamente os conteúdos. Por exemplo, na expressão 12 m, se for utilizada a entidade ⁣ a conversão será lida: “éme de índice um virgula dois”. Sem a entidade, será lida como: “éme de índice doze”. Isto é, verifica-se que a aplicação de cada uma destas entidades confere mais significado ou semântica à expressão matemática em causa, e torna-a menos ambígua. 86 Página em branco. 87 5 Conversores Texto-Fala e Linguagens de Marcação Neste capítulo pretende-se apresentar sumariamente alguns conceitos básicos sobre síntese de fala e conversores texto-fala; assim como uma breve introdução a diversas linguagens de marcação usadas em tecnologias de fala, tais como: conversores texto- -fala ou aplicações de reconhecimento de fala. 5.1 Síntese da Fala e Conversores Texto-Fala As primeiras máquinas de produção de fala, muito primitivas, remontam a 1779, por C.G. Kratezenstein. Alguns anos mais tarde, em 1791, W.R. von Kempelen demonstrou uma máquina mais sofisticada, capaz de reproduzir fala contínua. Em 1835, Wheatstone melhorou a máquina de von Kempelen e construiu um dos primeiros vocoders, ainda manual e analógico. Figura 5.1 - Máquina Falante de Wheatstone (81). Em 1939, Homer Dudley inventa o primeiro vocoder eléctrico e demonstra-o na feira mundial em Nova York. Ainda em 1939, Dudley propõe que os vocoders passem a representar os sinais de fala no domínio da frequência modelando-os através de um conjunto de filtros passa-banda. Este conjunto de filtros é excitado por ruído nas zonas não vozeadas (zonas em que as cordas vocais não vibram) e por pulsos periódicos nas zonas vozeadas (zonas em que o ar liberto pelos pulmões é colocado em vibração pela acção das cordas vocais). Actualmente, ainda existem muitos sistemas que fazem uso deste princípio básico. Com o aparecimento dos computadores, o processamento da fala desenvolveu-se rapidamente e surgiram diversas tecnologias ao serviço da engenharia da fala. 88 Actualmente, existem três grandes técnicas de síntese da fala, enunciadas por ordem crescente de qualidade: • Síntese por Formantes • Síntese por Predição Linear (82)(83) • Síntese por Concatenação (exemplo: TD-PSOLA, PSOLA (81)(84)) • Síntese por HTS29 (85) O desenvolvimento destas técnicas de síntese de fala, conjugadas com a evolução dos sistemas informáticos, conduziu ao aparecimento dos conversores texto-fala30. Poder-se- -ia definir um conversor texto-fala como um sistema baseado em computador capaz de processar um texto e reproduzi-lo auditivamente. Um modelo arquitectural genérico para um conversor texto-fala é apresentado de seguida: Figura 5.2 - Arquitectura básica de um conversor texto-fala. O módulo de Pré-Processamento tem como objectivo aplicar filtros de tratamento do texto capazes de transformar os símbolos31, que não se encontram explicitamente por extenso, na sua forma extensível. É o caso dos numerais, abreviações, acrónimos e referências de rede. Por exemplo: o numeral “3,45%” deveria de ser convertido em 29 Hidden Markov Model Speech Synthesis System 30 Na literatura inglesa, um sistema de conversão texto-fala é referenciado como um sistema TTS (Textto-Speech). 31 Entenda-se símbolo como um elemento constituinte de um texto, por exemplo: uma palavra ou um conjunto de caracteres alfanuméricos. Texto de entrada Informação para o módulo acústico Pré-Processamento Análise Linguística Análise Sintáctica e Prosódica Transcrição Fonética Processamento Prosódico 89 “três vírgula quarenta e cinco por cento”; a abreviação “Prof.” deveria de ser convertida em “Professor”; o acrónimo “FEUP” deveria de ser transformado em “Faculdade de Engenharia Universidade do Porto”; e o e-mail “[email protected]” deveria de ser transformado em “agá efe í éle í pê é arroba éfe é ponto ú pê ponto pê tê”. O resultado final será um texto formatado e tratado. O módulo de Análise Linguística possui uma função gramatical. Consiste num conjunto de algoritmos capazes de, para cada elemento do texto, identificarem os artigos, verbos, substantivos, adjectivos e outros elementos gramaticais. Por exemplo, na frase “A Ana estuda matemática.”, o módulo de análise linguística identificaria e marcava “A” como artigo definido feminino singular; “Ana” como substantivo próprio feminino; “estuda” como verbo no indicativo presente; e “matemática” como substantivo comum feminino singular. As ambiguidades que restarem serão resolvidas no módulo seguinte. O módulo de Análise Sintáctica e Prosódica consiste na aplicação de um conjunto de algoritmos que visam a marcação do texto com marcas prosódicas, nomeadamente, pausas, formantes e frequência fundamental. Exemplo: “A Ana [pausa] estuda matemática”. Trata-se de dividir o texto em frases e definir uma forma de o ler. O conjunto destes três módulos constitui o processamento linguístico de um conversor texto-fala. O módulo de Transcrição Fonética tem como objectivo a transformação dos caracteres alfabéticos em símbolos fonéticos. Trata-se de uma conversão grafemafonema, onde são aplicados símbolos fonéticos IPA32 ou SAMPA33. Por exemplo, em SAMPA, a frase “A Ana estuda matemática” seria transcrita na seguinte frase: “6 6n6 iStud6 m6t@matik6”. O módulo de Processamento Prosódico consiste na consulta das marcações prosódicas, e sua utilização e ajuste na frase já transcrita fonéticamente. Posteriormente a frase marcada com variáveis de controlo prosódico é enviada para o módulo acústico que a reproduzirá sob a forma de áudio. O conjunto destes dois últimos módulos constitui a fase de processamento acústico. 32 IPA – International Phonetic Alphabet - http://www.arts.gla.ac.uk/ipa 33 SAMPA – Speech Assessment Methods Phonetic Alphabet - http://www.phon.ucl.ac.uk/home/sampa 96 5.2.6 ACSS & CSS 3 As Cascading Style Sheets (CSS)49 surgiram pela primeira vez em 1996, CSS 1.0, através da W3C. O seu objectivo era o de criar um mecanismo simples para adicionar propriedades de estilo (fontes, cores, espaçamento, ...) a documentos na Internet. A grande vantagem destas folhas de estilo prende-se com o facto de permitirem uma separação total entre a apresentação e o conteúdo de um documento on-line. O seu funcionamento é bastante simples e consiste num modelo de hierarquias. Por exemplo, se a um elemento que representa um parágrafo são atribuídas determinadas propriedades, todos os elementos dentro do parágrafo, que não estejam definidos na CSS, assumirão as propriedades do parágrafo como suas. Em 1998 surge uma nova especificação, CSS 2.0, e mais tarde em 2005, CSS 2.1, que inclui um conjunto de propriedades que podem ser utilizadas como linguagem de marcação de tecnologias de fala, para controlar a informação contida no documento caso esta seja processada por um conversor texto-fala. Este conjunto de propriedades foi denominado de Aural CSS – ACSS (96). Para a especificação destas propriedades foi desenvolvido um modelo empírico de uma caixa auditiva (Figura 5.3). Este modelo permite a especificação de propriedades 3D assim como temporais. Figura 5.3 - Modelo auditivo de ACSS. (97) É também possível variar a qualidade da fala sintetizada através de propriedades como: o tipo de voz a usar, a frequência, nível de stress, volume e velocidade. 49 W3C Cascading Style Sheets Homepage - http://www.w3.org/Style/CSS/ 97 Em Dezembro de 2004, a W3C deu inicio a um novo módulo da especificação CSS 3, denominado CSS 3 Speech Module (97). Este novo módulo pretende reunir diversas propriedades identificadas pela ACSS e permitir a integração com SSML. Tabela 5.7 - Exemplos de ACSS. h1, h2, h3, h4, h5, h6 { voice-family: paul; voice-stress: moderate; cue-before: url(ping.au) pause: 20ms /* pause-before: 20ms; pause-after: 20ms */ } p.heidi { voice-balance: left; voice-family: female } p.peter { voice-balance: right; voice-family: male } p.goat { voice-volume: soft } a { cue-before: url(bell.aiff); cue-after: url(dong.wav) } h1 { cue-before: url(pop.au) 80; cue-after: url(pop.au) 50% } div.caution { cue-before: url(caution.wav) loud } @phonetic-alphabet "ipa"; #tomato { phonemes: "t\0252 m\0251 to\028a " } ul::before { content: "Start list: " } ul::after { content: "List end. " } li::before { content: "List item: " } 5.2.7 SALT SALT (98) – Speech Application Language Tags – é uma linguagem de marcação para tecnologias de fala desenvolvida por um fórum de diversas empresas e universidades, em 2001. Não é uma linguagem usada em conversores texto-fala, mas sim para aplicações baseadas em telefone, serviços de Web, tablet PC’s e redes sem fios (wireless). É constituída por um conjunto de marcas que estende as funcionalidades de HTML50, XHTML51 e XML52, e permite um acesso multimodal facilitando a interacção através de fala, teclado, rato, música, vídeo ou gráficos. 50 W3C HTML 4.01 Specification - http://www.w3.org/TR/html4/ 51 W3C XHTML 1.1 Specification - http://www.w3.org/TR/xhtml11/ 52 W3C XML 1.1 Specification - http://www.w3.org/TR/2004/REC-xml11-20040204/ 98 A SALT procura responder a três grandes desafios: • Interacção com dispositivos sem fios. • Desenvolvimento de cada vez mais aplicações com tecnologias de fala. • Auxiliar o acesso a aplicações e serviços de Internet através do telefone. Tabela 5.8 - Exemplo de SALT. <prompt id=”bar” onbookmark=”f()” ...> Traveling to New York? <bookmark name=”imp_confirm” /> There are <emph>3</emph> available flights... </prompt> 5.2.8 VoiceXML À semelhança da SALT, a W3C desenvolveu em 2000 uma linguagem de marcação – VoiceXML (99)(100) - para a criação de diálogos utilizando: síntese da fala, áudio digitalizado, reconhecimento de fala, reconhecimento de tons DTMF53 e telefone. Não é uma linguagem para conversores texto-fala, mas contribui eficazmente para a construção de soluções baseadas em tecnologias de fala, onde a interacção multimodal é a regra, e onde um comando falado pode estar associado a uma acção através de um URI (Universal Resource Identifier). Tabela 5.9 - Exemplo de um documento VoiceXML. <?xml version="1.0" encoding="ISO-8859-1"?> <vxml xmlns="http://www.w3.org/2001/vxml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3.org/2001/vxml http://www.w3.org/TR/voicexml20/vxml.xsd" version="2.0"> <form> <field name="drink"> <prompt>Deseja tomar café, leite, chá ou nada?</prompt> <grammar src="drink.grxml" type="application/srgs+xml"/> </field> <block> <submit next="http://www.drink.example.com/drink2.asp"/> </block> </form> </vxml> 53 DTMF – Dual-Tone Multi-Frequency 99 O exemplo da Tabela 5.9 poderia ter a seguinte interacção: • C (computador): Deseja tomar café, leite, chá ou nada? • H (humano): sumo de laranja • C: Não compreendi o que disse. (mensagem por defeito) • C: Deseja tomar café, leite, chá ou nada? • H: Chá • C: (continua no documento drink2.asp) 100 Página em branco. 101 6 Análise, Interpretação e Conversão de padrões num texto Um documento técnico é geralmente composto por palavras, números, abreviaturas, siglas, expressões matemáticas, endereços de rede, esquemas, gráficos, tabelas e outros tipos de elementos. A análise e a interpretação de um texto deste género ou de outros, exige um elevado conhecimento lexical, uma análise da sua estrutura, a identificação de determinados tipos de elementos que possam ser interpretados e transformados, e uma análise semântica. A definição de padrões de pesquisa por estes elementos, é concretizada sob a forma de expressões regulares (uma das técnicas mais utilizadas na identificação de padrões num texto) (101) Neste capítulo pretende-se abordar sumariamente alguns dos conceitos básicos sobre autómatos e transdutores de estados finitos; assim como os conceitos de expressões regulares, sendo que estas foram a base dos algoritmos desenvolvidos no âmbito desta dissertação. 6.1 Linguagens e Processadores de Linguagens As expressões regulares são um dos mecanismos que permitem a definição de uma linguagem. Sendo assim, e para se conhecer o mundo das expressões regulares e dos autómatos é necessário primeiro compreender o contexto que os envolve, isto é, compreender o que é uma linguagem e para que servem os processadores de linguagens. Entende-se por definição de uma linguagem: “Uma linguagem L sobre um alfabeto, também designado, frequentemente por vocabulário, V, é um conjunto de frases, em que cada frase é uma sequência de símbolos pertencentes a V.” 54 (102), em que para se restringirem as combinações de símbolos nas frases aplicam-se regras de dois tipos: • Sintácticas – regras focadas na estrutura da frase. • Semânticas – regras focadas no significado da frase. No entanto estas regras só podem ser aplicadas a linguagens formais, uma vez que as linguagens naturais não obedecem inteiramente a regras – tipicamente recorrem-se a excepções para as processar. 54 CRESPO, Rui – Processadores de linguagens: da concepção à implementação, pág. 7. 102 As linguagens são analisadas por processadores de linguagens que se definem como: “Seja LG a linguagem gerada por uma gramática G; um processador para essa linguagem, PLG, é um programa que, tendo conhecimento da gramática G: • Lê um texto (sequência de caracteres); • Verifica se esse texto é uma frase válida de LG; • Executa uma acção qualquer em função do significado da frase reconhecida.”55 Um processador de uma linguagem divide-se em dois grandes módulos: • Módulo de Análise: o Análise léxical – reconhecimento e classificação de palavras e vocábulos o Análise sintáctica – verifica se uma frase está sintacticamente correcta o Análise semântica – determina o significado da frase • Módulo de Síntese – em que se reage ao significado identificado, produzindo um determinado resultado. São exemplos de processadores de linguagens: • Compiladores – traduzem linguagens de programação de alto nível para código máquina. • Interpretadores – executam os programas sem os compilar. • Tradutores – transformam uma linguagem noutra linguagem. • Filtros – retornam na saída o texto de entrada com alguns elementos transformados. É nesta categoria que encaixam a grande maioria dos algoritmos de análise, interpretação e conversão desenvolvidos nesta dissertação. 6.2 Expressões Regulares Uma expressão regular é uma notação algébrica que caracteriza um conjunto de caracteres e, como tal, podem ser usadas para procurar e identificar elementos num texto, assim como definir uma linguagem de modo formal. (103) Na Figura 6.1 encontram-se resumidas as propriedades algébricas que permitem criar associações entre expressões regulares (assumem-se , e α βγ como expressões regulares). 55 CRESPO, Rui – Processadores de linguagens: da concepção à implementação, pág. 10. 103 Figura 6.1Identidades algébricas entre expressões regulares.56 As expressões regulares são consideradas essenciais para que os algoritmos de processamento de texto sejam potentes, eficientes e flexíveis. A aplicação de expressões regulares permite a descrição e análise de texto, assim como, remoção, adição e manipulação de blocos de frases. (104) Como já foi referido anteriormente, grande parte dos algoritmos de conversão desenvolvidos nesta dissertação fazem uso das expressões regulares, onde estas foram usadas sob a forma de linguagem de especificação de analisadores léxicais. 6.2.1 Breve introdução à sintaxe das expressões regulares Para demonstrar algumas das regras e características das expressões regulares, adoptou- -se a sintaxe da linguagem PERL57 (105)(106)(107)(108), que foi a linguagem maioritariamente usada no desenvolvimento deste trabalho. O uso de expressões regulares requer a existência de um padrão que queremos identificar, e um texto onde procurar. Tabela 6.1 - Exemplos simples de identificação de padrões. (109) Padrão a identificar Aplicação prática Comentários /Helder/ Bom dia Helder! encontrou 1 ocorrência Bom dia Helder! encontrou 1 ocorrência /e+/ Preencheu tudo? encontrou 1 ocorrência /E/ Bom dia Helder! não existe E maiúsculo 56 CRESPO, Rui – Processadores de linguagens: da concepção à implementação, pág. 33. 57 PERL - Practical Extraction and Report Language – http://www.perl.org 104 Para aumentar a potencialidade das expressões regulares, estas foram complementadas com meta-caracteres. Entende-se um meta-caracter como um símbolo de uma expressão regular que possui um significado próprio, e que pretende definir conceitos estruturais da expressão regular. Tabela 6.2 - Exemplos de uso de meta-caracteres em expressões regulares. (109) Meta-caracter Descrição Exemplo Aplicação prática ^ início de linha /^Bom/ Bom dia Helder! $ fim de linha /Bom$/ Hoje é um dia bom Hoje é um dia bom. | ou /a|b/ Hoje é um bom dia. . qualquer caracter /Bo./ Bom dia Helder! + um ou mais /ra.+/ Coisa rara não é? /carro*/ Bom dia Helder! * zero ou mais /carro*/ Belo carro! /B(o)?m/ Bom carro. ? um opcional /B(o)?m/ É um Bmw? /B(o|a)m?/ Bom dia. Captura: “o”. (...) captura padrão /B(o|a)m?/ Belo barco. Captura: “a”. As expressões regulares são sensíveis ao uso de maiúsculas e minúsculas (case- -sensitive). Caso se pretendesse encontrar todas as ocorrências de “e”, independentemente da forma como é escrito, ter-se-ia de usar um operador denominado classe de caracteres ( “[ ]” ). Tabela 6.3 - Exemplo de case-insensitive numa expressão regular. (109) Padrão a identificar Aplicação prática Comentários /[E|e]+/ Bom dia Helder! encontrou 1 ocorrência O uso de operadores de classe de caracteres é muito importante nas expressões regulares, pois apresenta características muito próprias; por exemplo, os meta-caracteres apresentados anteriormente possuem comportamentos diferentes dentro de uma classe de caracteres. Por exemplo, o símbolo “.” significa “qualquer caracter” fora de uma classe de caracteres; dentro de uma classe de caracteres significa simplesmente “ponto”. 105 Existe também a possibilidade de se negar os conteúdos de uma classe de caracteres com recurso ao meta-caracter “^”. Tabela 6.4 - Exemplo da negação de uma classe de caracteres. (109) Padrão a identificar Aplicação prática Comentários /[^e]+/ Boneca! ignora o “e” . A Tabela 6.5 apresenta alguns exemplos em que se usam abreviaturas de padrões, nomeadamente “\d” e “\w”, numa expressão regular. Note-se que o espaço é também um caracter. Tabela 6.5 - Abreviaturas de padrões numa expressão regular. (109) Padrão a identificar Aplicação prática Comentários /[0-9]+/ Hoje é dia 25. reconhece todos os dígitos. /[a-z]+/ Bom dia Helder! reconhece caracteres alfa minúsculos. /[a-zA-Z ]+/ Bom dia Helder! reconhece caracteres alfa sejam minúsculos ou maiúsculos. /[a-zA-Z0-9]+/ Bom dia Helder! Foram 5. reconhece caracteres alfanuméricos. /\d+/ Hoje é dia 25. é equivalente a /[0-9]+/ . /\w+/ Bom dia Helder! é equivalente a /[a-zA-Z ]+/ . Existem ainda outros meta-caracteres, quantificadores e modificadores58 que são usados na compilação de uma expressão regular em PERL, no entanto, não serão referidos neste documento59. 58 Os quantificadores e modificadores são utilizados por uma expressão regular como informação pré- -compilação, para modificar o comportamento de alguns meta-caracteres ou mesmo o comportamento do autómato finito implementado pela expressão regular. 59 Podem encontrar-se boas referências para o estudo de expressões regulares em (104)(105)(107)(108). 112 Tabela 6.8 - Comparação entre autómatos finitos dos tipos DFA e NFA. DFA NFA Diferenças na pré-compilação • Antes de iniciar o processo de pesquisa, o algoritmo é compilado. • Antes de iniciar o processo de pesquisa, o algoritmo é compilado. • Mais lento que NFA, exige mais memória. • A compilação é mais rápida que um DFA e requer menos memória. Diferenças na rapidez de identificação (match) • Tão rápido como NFA em condições normais. • Tão rápido como DFA em condições normais. • A rapidez não depende da expressão regular usada. • A rapidez depende bastante da expressão regular usada. É por isso aconselhável a construção de uma expressão regular eficiente. Diferenças em como é feita a identificação (match) • Procura o maior caminho que seja sucesso para uma identificação. • Procura o maior caminho que seja sucesso para uma identificação. Diferenças de capacidades • Possui menos capacidades que um NFA. • Suporta muitas capacidades que um DFA não possui, tais como: 1. Captura de texto para guardar como referência, assim como registar a posição de captura. 2. Possui capacidades de “observar o que está para trás e o que está para a frente”. 3. Possui quantificadores de expressões regulares para implementar algoritmos não-gananciosos. Diferenças na facilidade de implementação • Simples de implementar. • Simples de implementar. 113 A Tabela 6.9 reúne um conjunto de programas e os respectivos tipos de autómatos que esses programas utilizam: Tabela 6.9 - Alguns programas e seus motores FSA. (116) Tipo de autómato Programas DFA awk, egrep, flex, lex, MySQL, Procmail NFA Tradicional GNU Emacs, Java, grep, less, more, .NET, PCRE, PERL, PHP, Python, Ruby, sed, vi POSIX NFA mawk, GNU Emacs, Mortice Kern Híbrido NFA/DFA GNU awk, GNU grep/egrep, TCL 6.3.1 Conversão de uma expressão regular num autómato finito O algoritmo de criação de um autómato finito do tipo NFA a partir de uma expressão regular foi publicado pela primeira vez por Thompson (111) em 1968. A relação entre expressões regulares e autómatos finitos é possível através de uma classe de linguagens denominadas de regulares. O facto destas duas notações (expressões regulares e autómatos) representarem a mesma classe de linguagens, permite a conversão de expressões regulares em autómatos finitos. O inverso é mais complicado e nem sempre possível (116). Vejamos alguns exemplos: Tabela 6.10 - Autómato finito equivalente da expressão regular /a/ . Expressão regular: /a/ Tem como objectivo identificar o caracter “a”. Autómato finito equivalente 114 Tabela 6.11 - Autómato finito equivalente da expressão regular // . Expressão regular: // Tem como objectivo identificar uma sequência de caracteres vazia. Autómato finito equivalente Tabela 6.12 - Autómato finito equivalente da expressão regular /P|Q/ . Expressão regular: /P|Q/ Tem como objectivo executar a expressão P ou a expressão Q. Autómato finito equivalente Tabela 6.13 - Autómato finito equivalente da expressão regular /PQ/ . Expressão regular: /PQ/ Tem como objectivo executar a expressão P e Q. Autómato finito equivalente 115 Tabela 6.14 - Autómato finito equivalente da expressão regular /perl/ . Expressão regular: /perl/ Tem como objectivo identificar a sequência de caracteres “perl”. Autómato finito equivalente Tabela 6.15 - Autómato finito equivalente da expressão regular /P+/ . Expressão regular: /P+/ Tem como objectivo executar pelo menos uma vez a expressão P. Autómato finito equivalente Tabela 6.16 - Autómato finito equivalente da expressão regular /P*/ . Expressão regular: /P*/ Tem como objectivo não executar P ou executá-lo uma vez ou mais do que uma vez. Autómato finito equivalente A partir destes modelos básicos torna-se possível construir autómatos finitos equivalentes a expressões regulares complexas. 116 Página em branco. 117 7 Motor de Análise, Interpretação e Conversão - AudioMathENGINE Um conversor texto-fala em geral não está preparado para ler números em formatos além do básico, converte poucas abreviações e acrónimos, e não conhece quaisquer expressões matemáticas nem tão pouco a semântica destes elementos; isto é, limita-se a reproduzir em áudio os caracteres que reconhece, quer estes façam sentido ou não. Foi já discutido, num capítulo anterior, a necessidade de existência de um módulo de pré-processamento capaz de tratar o texto a ser sintetizado, de modo a torná-lo “legível” para um conversor texto-fala. O seu comportamento consiste na aplicação de filtros de tratamento de texto capazes de transformar os símbolos que não se encontram explicitamente por extenso, na sua forma por extenso. A frase: “O Prof. João dá aulas, às 9h00 na sala 123, na FEUP.” Possui uma abreviação social (“Prof.”), um numeral temporal (“9h00”), um numeral cardinal (“123”) e uma sigla (“FEUP”). Estes elementos seriam tratados e convertidos, transformando a frase em: “O Professor João dá aulas, às nove horas na sala cento e vinte e três, na Faculdade de Engenharia Universidade do Porto”. Figura 7.1 - Exemplo de pré-processamento. No entanto, a maioria dos conversores texto-fala possui módulos de pré-processamento ineficazes ou de comportamento simples e básico. Também não existem, até à escrita desta dissertação, módulos de pré-processamento capazes de lidar com expressões matemáticas. Sendo assim, procurou-se exteriorizar o módulo de pré-processamento de um conversor texto-fala, e desenvolver uma aplicação capaz de fazer um tratamento eficaz num documento contendo diversos elementos, tais como: numerais, abreviações, acrónimos, referências de rede e expressões matemáticas. A esta aplicação deu-se o nome de AudioMathENGINE. 118 O AudioMathENGINE possui as seguintes características técnicas: • Desenvolvido em PERL – módulos disponíveis para ambientes LINUX/UNIX e WINDOWS. • Disponível sob quatro formas distintas: o ActiveX DLL65– para aplicações em Visual Basic ou C/C++. o Componente .NET – para aplicações .NET (usado durante o trabalho realizado no âmbito desta dissertação). o Interface CGI – para aplicações on-line, ou em ambientes LINUX/UNIX, através do uso de PERL. o Executável EXE – para aplicações de linha de comando em WINDOWS. • Arquitectura modular, extensível e configurável – permite facilmente o uso das suas bibliotecas noutras aplicações ou sistemas, se tal for requerido; assim como a implementação de novas funcionalidades sem grandes custos de manutenção. • Diversos módulos lógicos para: o Numerais, Abreviações, Acrónimos, Referências de Rede o Expressões Matemáticas e sua Navegação o Reconhecimento Automático o HTML e páginas on-line o Dicionários e Bibliotecas auxiliares • Disponível para a língua: Português Europeu (espera-se de futuro a implementação de outras línguas). • Especificação, configuração e modos de utilizador implementados parcialmente com recurso a uma linguagem de marcação – AKML (AudioMath Knowledge Markup Language)66. • Suporte nativo de MathML Presentation Markup • Suporte de MathML Content Markup, através de uma folha de estilo de transformação XML (XSLT). • Suporte parcial de Unicode. 65 Dynamic Link Library 66 Ver secção 7.2 119 As aplicações de uma ferramenta como o AudioMathENGINE são diversas, tais como: • Integração em sistemas informáticos, promovendo a sua acessibilidade; • Utilização como ferramenta didáctica da matemática e das ciências exactas; • Aplicação isolada de pré-tratamento de documentos para conversores texto-fala; • Desenvolvimento de serviços de acessibilidade. Apesar deste trabalho ser a continuação de um projecto iniciado no estágio de licenciatura do autor, diversos melhoramentos e novas funcionalidades67 foram introduzidas: a implementação de uma linguagem de marcação própria (AudioMath Knowledge Markup Language – AKML) para a definição e o tratamento de dados no motor de análise, interpretação e conversão de texto; a reestruturação da interface de ligação com aplicações externas; o melhoramento dos dicionários internos (abreviações e acrónimos); o suporte para tratamento de páginas on-line; o suporte para Presentation Markup e Content Markup; a implementação de algoritmos de navegação das fórmulas matemáticas; e a reestruturação completa dos algoritmos de reconhecimento automático, assim como do módulo de interpretação e conversão de expressões matemáticas. 7.1 Arquitectura e Desenho Foi já referido na secção anterior que a aplicação AudioMathENGINE se encontra estruturada numa arquitectura modular, composta por camadas ou estruturas lógicas distintas. De facto, o estilo de arquitectura utilizado baseia-se numa hibridez entre o estilo em camadas (layered) e o estilo de função principal e sub rotinas (main program & subroutines) (117). Uma redefinição da arquitectura utilizada para uma abordagem orientada a objectos (object-oriented) foi considerada, mas não implementada por restrições temporais e práticas (custos elevados na reestruturação), uma vez que o código se baseava num projecto antigo bastante extenso e estável. Apesar disso, a arquitectura actual do AudioMathENGINE apresenta características semelhantes, de reusabilidade, modularidade e flexibilidade, às de um sistema orientado por objectos. 67 Foram implementadas mais de oito mil linhas de código em relação ao trabalho desenvolvido anteriormente. 120 Módulo de Numerais Módulo de Abreviações Módulo de Acrónimos Módulo de Referências de Rede Módulo de Reconhecimento Automático Módulo de Expressões Matemáticas Módulo de XHTML Módulo de Navegações Biblioteca AudioMathENGINE Dicionário de MathML Dicionário de Unicode «interface» AudioMathENGINE.NET Biblioteca de Funções Figura 7.2 - Arquitectura de “alto nível” do AudioMathENGINE (componente .NET). A Figura 7.2 mostra a arquitectura de “alto nível” do AudioMathENGINE, onde se podem verificar os diferentes módulos deste motor de análise, identificação e conversão; assim como as dependências entre eles. Estes módulos encontram-se compilados no componente .NET desenvolvido neste trabalho, sendo eles: • Módulo de Numerais - numerais.pm – conjunto de algoritmos para identificação e conversão de numerais de diversos tipos. • Módulo de Abreviações – abreviacoes.pm – conjunto de algoritmos para identificação e conversão de abreviaturas. • Módulo de Acrónimos – acronimos.pm – conjunto de algoritmos para identificação e conversão de siglas ou acrónimos. • Módulo de Referências de Rede – referenciasrede.pm – conjunto de algoritmos para identificação e conversão de diversos tipos de referências de rede. • Módulo de Expressões Matemáticas – pmathmlPT.pm – análise, interpretação e conversão de MathML. 121 • Módulo de Reconhecimento Automático – autorecon.pm – conjunto de algoritmos de reconhecimento automático de diversos elementos constituintes de um texto. • Módulo de Navegação – navegacao.pm – conjunto de algoritmos que identificam os pontos de navegação de uma expressão matemática. • Módulo de XHTML – xhtml.pm – algoritmo que lida com textos de páginas on-line. • Dicionário de Unicode – mathml_to_unicode.pm – conjunto de definições que converte entidades MathML em Unicode. • Dicionário de MathML – mathml_dictionary.pm – conjunto de definições que converte referências de Unicode, operadores e funções MathML, em frases ou palavras, em Português Europeu. • Biblioteca AudioMathENGINE – audiomathlib.pm – define a arquitectura principal do AudioMath. • Biblioteca de funções – tabela.pm e biblioteca.pm – tabelas de conversão e conjuntos de funções auxiliares. • Interface AudioMathENGINE.NET – AudioMathEngineNET.pm – definição da interface do componente .NET. • Interface AudioMathENGINEWEB – AudioMathEngineWeb.pm - definição da interface para aplicações CGI. • Interface AudioMathENGINEDLL – AudioMathEngineDLL.pm – definição da interface do componente ActiveX. • Interface AudioMathENGINE – AudioMathEngine.pl – definição da interface para aplicações de linha de comando. A interface .NET implementada no AudioMathENGINE foi definida segundo o padrão de desenho Singleton (apenas é permitida uma instância da classe) (118), de forma a salvaguardar as propriedades do motor enquanto instanciado por uma aplicação. Além dos módulos que constituem a arquitectura do AudioMathENGINE, esta aplicação também interage com ficheiros no sistema operativo (AKML), e com a aplicação gráfica (AudioMathGUI68). 68 Esta aplicação é descrita no capítulo seguinte. 128 7.2.2 Etiquetas de marcação para Dicionário A marcas de dicionário do AKML foram definidas de modo genérico, possibilitando assim o seu uso para diferentes tipos de dicionários. Figura 7.8 - Estrutura AKML para Dicionários do AudioMathENGINE. Segue-se uma descrição dos elementos e atributos utilizados: <dictionary name=”” lang=””>...</dictionary> Define um bloco do tipo dicionário. O atributo name tem como objectivo identificar o tipo de dicionário que é definido e pode ter como valor: acronym ou abbreviation. O atributo type indica uma sub classificação do dicionário especificado. Por exemplo, um dicionário de abreviações faz com que type possa ter como valores: social (abreviações sociais), money (abreviações monetárias), physics (unidades físicas), chemistry (símbolos químicos) ou others (outros tipos de abreviações). O atributo lang permite identificar a língua na qual o dicionário se encontra definido. <definition alias=””>...</definition> Definição de um determinado termo do dicionário. O atributo alias é usado para indicar a leitura por extenso que o AudioMathENGINE utiliza no algoritmo de conversão. 129 <akml version="1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchemainstance" xsi:noNamespaceSchemaLocation="../schema/AKML.xsd"> <dictionary name="abbreviation" type="social" lang="pt"> <definition alias="Engenheiro">Eng.</definition> <definition alias="Engenheira">Eng.ª</definition> </dictionary> <dictionary name="abbreviation" type="money" lang="pt"> <definition alias="euro">€</definition> <definition alias="libra">£</definition> </dictionary> <dictionary name="abbreviation" type="physics" lang="pt"> <definition alias="quilate">ql</definition> <definition alias="ano-luz">a.l.</definition> </dictionary> <dictionary name="abbreviation" type="chemistry" lang="pt"> <definition alias="Actínio">Ac</definition> <definition alias="Alumínio">Al</definition> </dictionary> <dictionary name="abbreviation" type="others" lang="pt"> <definition alias="antes de Cristo">a.c.</definition> <definition alias="depois de Cristo">d.c.</definition> </dictionary> </akml> Figura 7.9 - Exemplo de Dicionário de Abreviações em AKML. 7.2.3 Etiquetas de marcação para Conversão e Resultados O resultado da conversão de um documento, via AudioMathENGINE, é outro documento marcado com AKML. Neste documento de resultado é possível encontrar informação estatística sobre a conversão, assim como uma separação lógica entre as expressões matemáticas e o texto normal; e até informação sobre navegação. Figura 7.10 - Estrutura AKML para apresentação de Resultados. 130 Segue-se uma descrição dos elementos e atributos utilizados: <stats>...</stats> Define um bloco de estatísticas sobre a conversão realizada pelo AudioMathENGINE. <stat name=”” value=”” /> Indica um resultado de uma estatística. O atributo name indica o nome da estatística que foi recolhida. Na versão actual do AudioMathENGINE, o atributo name apenas pode conter os seguintes valores: numeral (número de numerais identificados e convertidos), abbreviation (número de abreviações identificadas e convertidas), acronym (número de acrónimos identificados e convertidos), network (número de referências de rede identificadas e convertidas), math (número de expressões matemáticas identificadas e convertidas) e convtime (tempo de conversão dado em segundos e com precisão de três casas decimais). <doc>...</doc> Identifica um bloco de resultado final, sem pontos de navegação. <txt value=””>...</txt> Identifica um bloco de texto normal convertido (sem expressões matemáticas). O atributo opcional value é apenas utilizado para efeitos de navegação e serve como texto introdutório a um nó de navegação. <abr>...</abr>,<acr>...</acr>,<num>...</num>,<net>...</net> Identificam respectivamente: abreviações, acrónimos, numerais e referências de rede no texto. <mat value=””>...</mat> Identifica um bloco de expressões matemáticas. O atributo value tem o mesmo propósito que no elemento <txt>...</txt>. Dentro do elemento mat podem surgir elementos node (usados na navegação) e elementos num (numerais identificados na expressão matemática). 131 <?xml version="1.0" encoding="ISO-8859-1"?> <akml version="1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchemainstance" xsi:noNamespaceSchemaLocation="schema/AKML.xsd"> <result> <stats> <stat name="numeral" value="2"/> <stat name="abbreviation" value="3"/> <stat name="acronym" value="0"/> <stat name="network" value="0"/> <stat name="math" value="1"/> <stat name="convtime" value="0.121"/> </stats> <doc> <txt>O <abr>professor</abr> Helder e a <abr>senhora</abr> Ana encontraram a <abr>página</abr> que mostrava a expressão: </txt><mat> chis mais <num>cinco</num> igual a <num>zero</num> </mat> </doc> <nav> <txt value="Texto:">O professor Helder e a senhora Ana encontraram a página que mostrava a expressão: </txt><mat value="Fórmula:"><node value=" chis mais cinco igual a zero "><node value=" chis "></node><node value=" mais "></node><node value=" cinco "></node><node value=" igual a "></node><node value=" zero "></node></node></mat> </nav> </result> </akml> Figura 7.11 - Exemplo do resultado de uma conversão em AKML. 7.2.4 Etiquetas de marcação para Navegação O conjunto de etiquetas de marcação para navegação é um subconjunto das etiquetas de resultado apresentadas na secção anterior. Figura 7.12 - Estrutura AKML para Navegação. 132 Segue-se uma descrição dos elementos e atributos utilizados: <nav>...</nav> Identifica um bloco de resultado final, preparado para navegação. Dentro deste bloco pode-se encontrar os elementos txt e mat que possuem as mesmas definições atribuídas na secção anterior. <node value=””>...</node> Indica um nó de navegação. É a hierarquia de nós que constrói a árvore de navegação. O atributo value contém o texto que cada nó tem atribuído quando se navega na árvore. <?xml version="1.0" encoding="ISO-8859-1"?> <akml version="1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchemainstance" xsi:noNamespaceSchemaLocation="schema/AKML.xsd"> <result> <stats> <stat name="numeral" value="2"/> <stat name="abbreviation" value="3"/> <stat name="acronym" value="0"/> <stat name="network" value="0"/> <stat name="math" value="1"/> <stat name="convtime" value="0.121"/> </stats> <doc> <txt>O <abr>professor</abr> Helder e a <abr>senhora</abr> Ana encontraram a <abr>página</abr> que mostrava a expressão: </txt> <mat> chis mais <num>cinco</num> igual a <num>zero</num> </mat> </doc> <nav> <txt value="Texto:">O professor Helder e a senhora Ana encontraram a página que mostrava a expressão: </txt> <mat value="Fórmula:"> <node value=" chis mais cinco igual a zero "> <node value=" chis "></node> <node value=" mais "></node> <node value=" cinco "></node> <node value=" igual a "></node> <node value=" zero "></node> </node> </mat> </nav> </result> </akml> Figura 7.13 - Exemplo de uma navegação em AKML. 133 7.3 Algoritmos de Análise, Interpretação e Conversão Como se pode observar da Figura 7.14, quando um documento é fornecido ao AudioMathENGINE, este realiza uma série de operações de pré-tratamento do texto, incluindo suporte para páginas on-line e Unicode. Após este tratamento, o documento é separado em blocos lógicos de texto normal ou expressões matemáticas. Cada um destes blocos é processado separadamente, onde são aplicados diversos algoritmos de análise, interpretação e conversão. À junção dos blocos processados inclui-se pontos de navegação, e constrói-se o resultado como um documento AKML. Módulo de Navegação Dicionários e Biblioteca de Funções Auxiliares Algoritmos de Análise e Conversão Módulo de Expressões Matemáticas Módulo de Reconhecimento Automático Biblioteca AudioMathENGINE Pré-tratamento do texto Tratamento XHTML Substituição no Texto Conversão da Fórmula Resolução de Unicode Identifica elementos Interpreta Fórmula Resultado AKML Separa:Texto-Matemática Algoritmo de conversão Adiciona Navegação Elementos por converter? Sim Não [Texto] [Matemática] Figura 7.14 - Interacção (simplificada) dos módulos no AudioMathENGINE. Nesta secção são apresentados cada um dos módulos que contêm algoritmos de análise, interpretação e conversão do AudioMathENGINE, com excepção dos algoritmos de reconhecimento automático e de conversão de expressões matemáticas que serão analisados em secções separadas dada a sua relevância no AudioMathENGINE. 134 7.3.1 Módulo de Numerais Embora seja comum a confusão entre um numeral e um número, existe uma diferença ténue entre ambas as definições: • numeral – “Referente a número, designativo de número. Palavra que designa o número, a ordem numa série ou a proporcionalidade numérica.” (119) • número – “Expressão de quantidade que permite enumerar e expressar grandezas. Unidade.” (119) O módulo de análise, interpretação e conversão de numerais é implementado por numerais.pm. Esta biblioteca suporta quinze classes diferentes de numerais, sendo elas: cardinais, ordinais, fraccionários, decimais, romanos, telefones, datas, horas, escalas, apostas, resultados desportivos, percentagens, valores monetários, números no formato de engenharia e potências. Tabela 7.2 - Lista de funções de numerais.pm . Funções exportadas pelo módulo: &c_cardinais(numero, genero, usermode); &c_ordinais(numero, genero, quantidade, usermode); &c_fraccionarios(numero, genero, usermode); &c_decimais(numero, genero, usermode); &c_romanos(numero, genero, tipo, usermode); &c_telefones(numero, usermode); &c_datas(data, usermode); &c_horas(horas, usermode); &c_escalas(escala_ou_aposta, usermode); &c_resultados_desportivos(resultado, usermode); &c_percentagens(numero, genero, usermode); &c_monetarios(numero, usermode); &c_engenharia(numero, usermode); &c_potencias(numero, usermode); Funções internas do módulo: Usadas para conversão de cardinais: &c_dezenas(numero, genero); &c_centenas(numero, genero); &c_milhares4(numero, genero); &c_milhares5(numero, genero); &c_milhares6(numero, genero); &c_milhoes7(numero, genero); &c_milhoes8(numero, genero); &c_milhoes9(numero, genero); &c_milhoes10(numero, genero); &c_milhoes11(numero, genero); &c_milhoes12(numero, genero); &c_bignum(numero, genero); Usadas para conversão de ordinais: &c_ordinais2(numero, genero); &c_ordinais3(numero, genero); &c_ordinais4(numero, genero); Usadas para conversão de romanos: &isroman(numero); &arabic(numero); &Roman; &roman; Usadas para conversão de datas: &testa_data(data); 135 Conversão de cardinais O algoritmo de conversão de cardinais implementado possui as seguintes características: • Converte números até 29 10 (30 algarismos). Números com mais de 12 algarismos são arredondados em biliões, triliões e quatriliões usando o termo “cerca de...”. Acima dos 30 algarismos o número é soletrado. • Permite o uso dos sinais “+”, “-“ ou combinação dos dois, precedendo o número a converter. • É suportado o uso de pontos para separar as ordens de grandeza. Por exemplo: 1.234 é convertido em “mil duzentos e trinta e quatro”. • Possui como parâmetros de entrada auxiliares: género e modo de utilizador. • O género pode ser: masculino (m) ou feminino (f). Por defeito, o algoritmo assume o masculino (m). • O modo de utilizador pode ser: 0 (Leitura por extenso) ou 1 (Leitura soletrada). Por defeito, o algoritmo assume o modo 0. • Se a entrada não for um número cardinal válido, então a saída será a leitura soletrada da entrada. Este algoritmo faz uso de regras gramaticais (Tabela 7.3) para a concatenação de conversões parciais. Tabela 7.3 – Números cardinais em português europeu (120). Nº Por extenso Nº Por extenso Nº Por extenso 0 zero 70 setenta xx00 X mil e 1 um 7x setenta e x1xx X mil cento e 2 dois 80 oitenta x2xx X mil duzentos e 3 três 8x oitenta e 1000000 um milhão 4 quatro 90 noventa 1000xxx um milhão e 5 cinco 9x noventa e 10xx000 um milhão e 6 seis 100 cem 1x00000 um milhão e 7 sete 1xx cento e 1xxxxxx um milhão 8 oito 200 duzentos x000000 X milhões 9 nove 2xx duzentos e x000xxx X milhões e 10 dez 300 trezentos x0xx000 X milhões e 11 onze 3xx trezentos e xx00000 X milhões e 12 doze 400 quatrocentos xxxxxxx X milhões 13 treze 4xx quatrocentos e 1000000000000 um bilião 14 catorze 500 quinhentos xxxxxxxxxxxxx X biliões 136 15 quinze 5xx quinhentos e 1018 um trilião 16 dezasseis 600 seiscentos 1024 um quatrilião 17 dezassete 6xx seiscentos e 18 dezoito 700 setecentos 19 dezanove 7xx setecentos e 20 vinte 800 oitocentos 2x vinte e 8xx oitocentos e 25 vinte e cinco 900 novecentos 30 trinta 9xx novecentos e 3x trinta e 1000 mil 40 quarenta 10xx mil e 4x quarenta e 1x00 mil e 50 cinquenta 11xx mil cento e 5x cinquenta e 12xx mil duzentos e 60 sessenta x000 X mil 6x sessenta e x0xx X mil e Tabela 7.4 - Exemplos de conversão de cardinais. Sintaxe Conversão &c_cardinais(número, género, modo de utilizador); &c_cardinais(“122”,”m”,0); cento e vinte e dois &c_cardinais(“122”,”f”,0); cento e vinte e duas &c_cardinais(“+1.345”,”m”,0); mais mil trezentos e quarenta e cinco &c_cardinais(“-23”,”m”,0); menos vinte e três &c_cardinais(“-23”,”m”,1); menos dois três &c_cardinais(“+-1000”,”m”,1); mais menos um zero zero zero &c_cardinais(“63923659254945395”,”m”,0); cerca de sessenta e três mil novecentos e vinte e três biliões Conversão de ordinais O algoritmo de conversão de ordinais implementado possui as seguintes características: • Converte números até 199971, acima disso soletra. • Suporta o uso dos símbolos: “º”, “ª”, “ºs” e “ªs”. • Suporta números romanos para serem lidos como ordinais. Por exemplo: “D. Afonso II”, lê-se “Dom Afonso Segundo” e não “Dom Afonso Dois”. • Possui como parâmetros de entrada auxiliares: género, quantidade e modo de utilizador. 71 Em português europeu só existe forma escrita por extenso de ordinais até ao número 1999. 137 • O género pode ser: masculino (m) ou feminino (f). Por defeito, o algoritmo assume o masculino (m). Se o número vier acompanhado de um dos símbolos acima mencionados, o género do símbolo prevalece em relação ao género indicado na função. • A quantidade pode ser: singular (s) ou plural (p). Por defeito, o algoritmo assume o singular (s). • Só existe um modo de utilizador: 0 (Leitura por extenso). • Se a entrada não for um número ordinal válido, então a saída será a leitura soletrada da entrada. Este algoritmo faz uso de regras gramaticais (Tabela 7.5) para a concatenação de conversões. Tabela 7.5 - Números ordinais em português (120). Nº Por extenso Nº Por extenso 1 primeiro 80 octogésimo 2 segundo 90 nonagésimo 3 terceiro 100 centésimo 4 quarto 200 ducentésimo 5 quinto 300 tricentésimo 6 sexto 400 quadringentésimo 7 sétimo 500 quingentésimo 8 oitavo 600 sexcentésimo 9 nono 700 septingentésimo 10 décimo 800 octingentésimo 20 vigésimo 900 nongentésimo 30 trigésimo 1000 milésimo 40 quadragésimo 50 quinquagésimo 60 sexagésimo 70 septuagésimo Tabela 7.6 - Exemplos de conversão de ordinais. Sintaxe Conversão &c_ordinais(número, género, quantidade, modo de utilizador); &c_ordinais(“12”,”m”,”s”,0); décimo segundo &c_ordinais(“12”,”f”,”s”,0); décima segunda &c_ordinais(“2ª”,”m”,”p”,0); segundas &c_ordinais(“1023”,”m”,”s”,0); milésimo vigésimo terceiro &c_ordinais(“5º”,”f”,”p”,0); quintos &c_ordinais(“2013”,”m”,”s”,0); dois zero um três 144 • Suporta singular e plural nas unidades monetárias73. • Apenas possui como parâmetro de entrada auxiliar: modo de utilizador. • Só tem um modo de utilizador: 0 (Leitura por extenso). • Se a entrada não for um valor monetário válido, então a saída será a leitura soletrada da entrada. No entanto, realiza-se um teste para verificar se a entrada é um cardinal. Em caso afirmativo, converte o cardinal. Tabela 7.17 - Exemplos de conversão de quantidades monetárias. Sintaxe Conversão &c_monetarios(valor, modo de utilizador); &c_monetarios(“3€”,0); três euros &c_monetarios(“2$00”,0); dois escudos &c_monetarios(“£4.45”,0); quatro ponto quarenta e cinco libras &c_monetarios(“$100,56”,0); cem vírgula cinquenta e seis dólares Conversão de números no formato de engenharia O algoritmo de conversão de números no formato de engenharia implementado possui as seguintes características: • Formato: +/-xE+/-y . • É limitado apenas pelas propriedades dos cardinais e dos decimais. • Suporta o uso dos símbolos: “+” e “-“. • Suporta o símbolo: “E” ou “e” como “vezes dez elevado a...” • Apenas possui como parâmetro de entrada auxiliar: modo de utilizador. • Só tem um modo de utilizador: 0 (Leitura por extenso). • Se a entrada não for um número no formato de engenharia válido, então a saída será a leitura soletrada da entrada. No entanto, ele realiza um teste para verificar se a entrada é um cardinal. Em caso afirmativo, ele converte o cardinal. Tabela 7.18 - Exemplos de conversão no formato de engenharia. Sintaxe Conversão &c_engenharia(número, modo de utilizador); &c_engenharia(“2e3”,0); dois vezes dez elevado a três &c_engenharia(“-3,5E5”,0); menos três vírgula cinco vezes dez elevado a cinco 73 Em português correcto, não se usa o plural nas unidades. Por exemplo: 2€ lê-se dois euro. No entanto, por razões de maior inteligibilidade e de habituação ao discurso oral, foi implementado o plural neste algoritmo. Por esse motivo, o exemplo anterior seria lido: dois euros. 145 Conversão de potências O algoritmo de conversão de potências implementado possui as seguintes características: • Formato: +/-x^+/-y . • É limitado apenas pelas propriedades dos cardinais e dos decimais. • Suporta o uso dos símbolos: “+” e “-“. • Suporta o símbolo: “^” como designação de “elevado a...” • Apenas possui como parâmetro de entrada auxiliar: modo de utilizador. • Só tem um modo de utilizador: 0 (Leitura por extenso). • Se a entrada não for uma potência válida, então a saída será a leitura soletrada da entrada. No entanto, realiza-se um teste para verificar se a entrada é um cardinal. Em caso afirmativo, converte o cardinal. Tabela 7.19 - Exemplo de conversão de potências. Sintaxe Conversão &c_potencias(número, modo de utilizador); &c_potencias(“+3.5^2”,0); mais três ponto cinco elevado a dois &c_potencias(“3^34”,0); três elevado a trinta e quatro &c_potencias(“-1.2^3,67”,0); menos um ponto dois elevado a três vírgula sessenta e sete 7.3.2 Módulo de Acrónimos Embora seja comum a confusão entre sigla e acrónimo, existe uma diferença bastante distinta entre ambas as definições: • sigla – “(Gramática) expressão formada pelas letras iniciais de diversas palavras, sendo estas letras geralmente pronunciadas uma a uma e não com articulação silábica.” (119) • acrónimo – “(Gramática) palavra formada pelas letras ou sílabas iniciais de várias outras palavras, e que se pronuncia sílaba a sílaba e não letra a letra.” (119) No AudioMathENGINE não há distinção. O AKML de dicionário permite um uso genérico. Qualquer sigla ou acrónimo que se encontre definida será convertida no valor contido no atributo alias. 146 No entanto a conversão de siglas e acrónimos possui alguns desafios: • A existência de siglas idênticas que denominam conceitos diferentes. Por exemplo: ACP pode significar “Automóvel Clube de Portugal”, mas também pode significar “Associação de Comerciantes do Porto”. • A existência de siglas idênticas que denominam conceitos diferentes, em línguas diferentes. Por exemplo: AM pode significar “Assembleia Municipal”, mas também pode significar “Amplitude Modulation”. • A decisão de leitura de uma sigla entre: fazer articulação silábica, ler letra a letra ou substituir por um conjunto de palavras. O processo de desambiguação poderia ser implementado analisando o contexto da frase. No entanto isto não é possível ou suficiente para todos os casos. No AudioMathENGINE optou-se por incluir no dicionário um conjunto de definições que se julgam únicas. Por defeito, o algoritmo de conversão procura a definição neste dicionário e substitui o acrónimo encontrado pela definição. Os acrónimos não definidos são soletrados. No entanto, o utilizador pode alterar este comportamento modificando a configuração de modo de utilizador para os acrónimos. Quanto à detecção de uma sigla ou acrónimo, esta não é relevante no processo descrito anteriormente. No entanto, em (121) desenvolveu-se um algoritmo de detecção de siglas ou acrónimos, baseado numa árvore de decisão em que os parâmetros levados em conta são: o número de letras envolvidas e as diferentes possibilidades de combinação das sequências de letras, no que diz respeito a vogais ou consoantes. O módulo de conversão de siglas e acrónimos é implementado por acronimos.pm. Tabela 7.20 - Lista de funções de acronimos.pm . Funções exportadas pelo módulo: &c_acron(sigla, usermode); &init_acr(); Estrutura de dados exportada pelo módulo: %acr; Existe uma fase de inicialização antecedente ao algoritmo de análise, interpretação e conversão de acrónimos. Nesta fase, a função init_acr lê o dicionário AKML de acrónimos e preenche uma estrutura de dados interna do AudioMathENGINE. Este passo é realizado apenas uma vez, durante a inicialização do componente. 147 A função c_acron é uma função de pesquisa que procura um determinado acrónimo na estrutura interna do AudioMathENGINE. O algoritmo de conversão de siglas e acrónimos implementado possui as seguintes características: • A estrutura interna onde são guardadas as definições de acrónimos é desenvolvida sob uma Hash. • Possui os seguintes modos de utilizador: 0 (Leitura soletrada) e 1 (Leitura por extenso). • Se a entrada não for uma sigla ou acrónimo válido, ou se não existir conversão para a entrada, então a saída será a leitura soletrada da entrada. • Neste momento não é suportado o módulo de distinção entre sigla e acrónimo. Considerando que o dicionário de acrónimos da Figura 7.15 foi lido pelo AudioMathENGINE, a Tabela 7.21 apresenta exemplos de possíveis conversões. <akml version="1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchemainstance" xsi:noNamespaceSchemaLocation="../schema/AKML.xsd"> <dictionary name="acronym" lang="pt"> <definition alias="Faculdade de Engenharia Universidade do Porto">FEUP</definition> <definition alias=" Faculdade de Ciências Universidade do Porto ">FCUP</definition> </dictionary> </akml> Figura 7.15 - Exemplo de Dicionário de Acrónimos em AKML. Tabela 7.21 - Exemplos de conversão de acrónimos. Sintaxe Conversão &c_acron(sigla, modo de utilizador); &c_acron(“FEUP”, 1); Faculdade de Engenharia Universidade do Porto &c_acron(“FEUP” ,0); éfe é u pê &c_acron(“OVNI” ,1); ó vê éne í &c_acron(“OVNI” ,0); ó vê éne í 148 7.3.3 Módulo de Abreviações Entende-se por abreviatura: • “Em geral, forma encurtada ou contraída de uma palavra. (Gramática) forma encurtada ou contraída de uma palavra, constituída por uma ou mais letras, seguidas de um ponto, e que se pronuncia como se estivesse por extenso.” (119) No AudioMathENGINE suportam-se diversos tipos de abreviações através de um dicionário em AKML baseado em (119). Para cada abreviatura é indicada uma forma por extenso, por exemplo, para a abreviatura “Prof.” define-se “professor”. No entanto existem certas abreviaturas que podem possuir mais do que uma definição dependendo do contexto, como por exemplo, a abreviatura “lat.” pode definir-se como “latim” ou “latitude”. Em AKML isto seria representado como: <definition alias="latim, latitude">lat. </definition>. Até à escrita desta dissertação, o algoritmo de conversão de abreviações apenas suportava a conversão através da primeira definição e continha cerca de trezentas abreviaturas no dicionário. O módulo de conversão de abreviações é implementado em abreviacoes.pm. Esta biblioteca suporta cinco classes diferentes de abreviações: abreviaturas sociais (social), abreviaturas de unidades físicas (physics), abreviaturas de unidades monetárias (money), abreviaturas químicas (chemistry) e outros tipos de abreviaturas (others). Tabela 7.22 – Lista de funções de abreviacoes.pm . Funções exportadas pelo módulo: &c_abrev(abreviatura, tipo, usermode); &init_abr_sociais(); &init_abr_uni_fis(); &init_abr_uni_mon(); &init_abr_qui(); &init_abr_outros(); Estruturas de dados exportadas pelo módulo: %abr_sociais; %abr_uni_fis; %abr_uni_mon; %abr_qui; %abr_outros; 149 Existe uma fase de inicialização antecedente ao algoritmo de análise, interpretação e conversão de acrónimos. Nesta fase, as funções init lêem o dicionário AKML de acrónimos e preenchem diversas estruturas de dados interna do AudioMathENGINE. Este passo é realizado apenas uma vez, durante a inicialização do componente. A função c_abrev tem como finalidade converter as abreviações detectadas onde o tipo de abreviação é identificado pelo parâmetro tipo que pode ter um dos seguintes valores: • SOC – abreviatura social; • FIS – abreviatura de unidade física; • MON – abreviatura de unidade monetária; • QUI – abreviatura de símbolos químicos; • OUT – abreviatura de outros tipos; • GEN – abreviatura genérica (procura nos dicionários de abreviaturas social e abreviaturas others); • ALL – procura conversões em todos os dicionários de abreviaturas. O algoritmo de conversão de abreviações implementado possui as seguintes características: • Suporte de diversos tipos de abreviaturas, já enunciados. • As estruturas internas onde são guardadas as definições de abreviaturas são desenvolvidas em Hashes. • Os parâmetros de entrada auxiliares são: tipo e modo de utilizador. • O tipo pode ser: SOC, FIS, MON, QUI, OUT, GEN ou ALL. • Só tem um modo de utilizador: 0 (Leitura por extenso). • Se a entrada não for uma abreviatura válida, então a saída será idêntica à entrada. Optou-se por não soletrar a abreviação uma vez que estas fazem mais vezes sentido quando lidas e não soletradas. Por exemplo, se a abreviação “Prof.” não fosse encontrada na base de dados, então seria preferível ler “prófe” do que ler “pê érre ó éfe ponto”. 150 Tabela 7.23 - Exemplos de conversão de abreviaturas. Sintaxe Conversão &c_abrev(abreviatura, tipo, modo de utilizador); &c_abrev(“Sr.”,”SOC”,0); Senhor &c_abrev(“Engº”,”SOC”,0); Engenheiro &c_abrev(“Cu”,”QUI”,0); Cobre &c_abrev(“€”,”MON”,0); Euro &c_abrev(“m”,”FIS”,0); metro &c_abrev(“pag.”,”OUT”,0); página 7.3.4 Módulo de Referências de Rede Os documentos técnicos contêm, cada vez mais, referências a endereços de Internet, endereços de correio electrónico ou mesmo endereços IP74. Por esse motivo foi desenvolvido um módulo de conversão dedicado à conversão destes tipos de elementos. O módulo de conversão de referências de rede é implementado por referenciasrede.pm. Esta biblioteca suporta três classes diferentes de referências sendo elas: endereços de páginas on-line (URL/URI)75, endereços de correio electrónico (e-mail) e endereços de máquinas ligadas na Internet (IP). Tabela 7.24 - Lista de funções de referenciasrede.pm . Funções exportadas pelo módulo: &c_url_uri(url_uri, usermode); &c_emails(email, usermode); &c_ips(ip, usermode); Conversão de endereços de Internet O algoritmo de conversão de URL/URI implementado possui as seguintes características: • Possui uma rotina de validação que verifica se a entrada é mesmo um endereço de rede válido ou não. Em caso negativo, a saída será uma leitura soletrada da entrada. • Apenas possui como parâmetro de entrada auxiliar: modo de utilizador. • Só tem um modo de utilizador: 0 (Leitura soletrada). 74 Internet Protocol 75 URL – Universal Resource Locator; URI – Universal Resource Identifier. 151 Tabela 7.25 - Exemplos de conversão de endereços de Internet. Sintaxe Conversão &c_url_uri(url_uri, modo de utilizador); &c_url_uri(“http://www.fe.up.pt”,0); agá tê tê pê dois pontos barra barra dabliu dabliu dabliu ponto éfe é ponto u pê ponto pê tê &c_url_uri(“http://lpf-esi.fe.up.pt”,0); agá tê tê pê dois pontos barra barra éle pê éfe hífen é ésse i ponto éfe é ponto u pê ponto pê tê Conversão de endereços de correio electrónico O algoritmo de conversão de endereços de correio electrónico implementado possui as seguintes características: • Possui uma rotina de validação que verifica se a entrada é mesmo um endereço de correio electrónico válido ou não. Em caso negativo, a saída será uma leitura soletrada da entrada. • Apenas possui como parâmetro de entrada auxiliar: modo de utilizador. • Só tem um modo de utilizador: 0 (Leitura soletrada). Tabela 7.26 - Exemplos de conversão de endereços de correio electrónico. Sintaxe Conversão &c_emails(email, modo de utilizador); &c_emails(“[email protected]”,0); agá éfe i éle i pê é arroba éfe é ponto u pê ponto pê tê &c_emails(“[email protected]”,0); á éne á ponto éme ó tê á arroba éfe é ponto u pê ponto pê tê Conversão de endereços do tipo IP O algoritmo de conversão de endereços do tipo IP implementado possui as seguintes características: • Possui uma rotina de validação que verifica se a entrada é mesmo um endereço de rede válido ou não. Em caso negativo, a saída será uma leitura soletrada da entrada. • Apenas possui como parâmetro de entrada auxiliar: modo de utilizador. • Os modos de utilizador podem ser: 0 (Leitura por extenso entre os pontos) ou 1 (Leitura soletrada). 152 Tabela 7.27 - Exemplos de conversão de endereços de rede do tipo IP. Sintaxe Conversão &c_ips(ip, modo de utilizador); &c_ips(“192.168.106.71”,0); cento e noventa e dois ponto cento e sessenta e oito ponto cento e seis ponto setenta e um &c_ips(“255.255.255.0”,1); dois cinco cinco ponto dois cinco cinco ponto dois cinco cinco ponto zero 7.3.5 Bibliotecas Auxiliares Os algoritmos de análise, interpretação e conversão anteriormente apresentados necessitam, por vezes, de funções extra que os auxiliem no desempenho das suas actividades. São as denominadas bibliotecas de suporte ou bibliotecas auxiliares. No AudioMathENGINE existem seis bibliotecas de suporte: • tabelas.pm – conjunto de tabelas para conversões de numerais (por exemplo a definição de unidades ou a definição dos ordinais), assim como conversão dos meses do ano. • biblioteca.pm – conjunto de funções genéricas e bastante reutilizadas, como por exemplo a soletração de uma palavra; leitura e escrita de modos de utilizador, validação de documentos MathML, e filtros de tratamento de texto (limpeza de entidades XML, Unicode e AKML). • xhtml.pm – módulo cujas funções filtram os elementos XHTML de uma página on-line. • mathml_dictionary.pm – módulo, com mais de 4200 entradas, cujas funções convertem todas as entidades XML do MathML em códigos Unicode. • mathml_to_unicode.pm – módulo, com mais de 5200 entradas, que implementa um dicionário76 de operadores e funções de MathML, assim como um dicionário de Unicode. • navegacao.pm – módulo cujas funções implementam a navegação das fórmulas matemáticas. Os módulos mathml_to_unicode.pm, mathml_dictionary.pm e navegacao.pm serão abordados com mais detalhe na secção 7.5. 76 Este dicionário implementa toda a lista de caracteres especiais de MathML publicada na especificação do MathML 2.0, pela W3C. 153 7.4 Módulo de Reconhecimento Automático Os módulos descritos anteriormente apenas fornecem funções capazes de converter diversos elementos de um documento, isto é, representam o papel de bibliotecas com rotinas de conversão. Contudo é necessária uma acção de análise e interpretação antes de uma conversão. Esta acção de análise e interpretação, ou de reconhecimento, é implementada pelo módulo de reconhecimento automático do AudioMathENGINE. - Análise e Interpretação Módulo de Reconhecimento Automático - Conversão Módulo de Numerais - Conversão Módulo de Acrónimos - Conversão Módulo de Ref. de Rede - Conversão Módulo de Abreviações Figura 7.16 - Relação entre os módulos de reconhecimento e conversões. O módulo de reconhecimento automático é implementado por autorecon.pm e suporta o reconhecimento automático de diversos elementos num documento. Este algoritmo é implementado num estilo de arquitectura em camadas (layers), onde existem funções de interface para os módulos de conversão de numerais, acrónimos, abreviações e referências de rede. Recorde-se que apenas os blocos de texto normal (sem expressões matemáticas) são processados pelo módulo de reconhecimento automático. O processo de reconhecimento automático é suportado por um conjunto de expressões regulares que analisam blocos de texto e identificam potenciais candidatos à conversão. Estas expressões regulares encontram-se definidas numa ordem específica de identificação de elementos, necessária, em especial no caso dos numerais, uma vez que se aplica uma filosofia de converter os elementos partindo dos casos mais complexos para os casos mais simples. Por exemplo, no texto “A falha sísmica aumenta 2,5 mm por ano. No mundo existem mais 2 casos assim. A hipótese de terramoto é de 25,6% .”, encontram-se três 256 Página em branco. 257 ANEXO A. Exemplos de MathML Presentation Markup Números <mn>-6.67</mn> ou <mo>-</mo><mn>6.67</mn> - número decimal negativo <mn>2002</mn> - cardinal <mn>1.6e-19</mn> - número no formato de engenharia <mn>0xAEFF</mn> - número hexadecimal <mn>1100101</mn> - número binário <mn>MCVIII</mn> - número romano <mn>vinte e um</mn> - número por extenso número fraccionário: 2 1 <mfrac><mn>1</mn><mn>2</mn></mfrac> número complexo: i32 + <mrow> <mn>2</mn><mo>+</mo> <mrow> <mn>3</mn><mo>⁢</mo><mi>ⅈ</mi> </mrow> </mrow> Identificadores (nomes de variáveis ou funções) <mi>π</mi> - símbolo de pi <mi>x</mi> - variável chis <mi>sin</mi> - função seno de <mi>ⅇ</mi> - número de neper <mi>ⅈ</mi> - número imaginário <mi>F</mi> - variável ou função éfe <mi></mi> - identificador vazio Operadores <mo>+</mo> - mais <mo>∫</mo> - integral de <mo>∑</mo> - somatório de <mo><</mo> - menor ou igual que <mo>(</mo> - abrir parêntesis <mo>⁢</mo> - vezes <mo>⁡</mo> - função de x y - chis vezes ipsilon <mrow><mi>x</mi><mo>⁢</mo><mi>y</mi></mrow> 12 A - à índice um, dois <msub> <mi>A</mi> <mrow><mn>1</mn><mo>⁣</mo><mn>2</mn></mrow> </msub> )(xf - éfe de chis <mrow> <mi>f</mi><mo>⁡</mo> <mrow><mo>(</mo><mi>x</mi><mo>)</mo></mrow> </mrow> 258 Texto 0,00:1 >>> xyentãoyexSeTeorema <mrow> <mtext>Teorema 1: Se </mtext> <mi>x</mi><mo>></mo><mn>0</mn> <mtext>e</mtext> <mi>y</mi><mo>></mo><mn>0</mn> <mtext>, então </mtext> <mi>x</mi><mo>⁢</mo><mi>y</mi> <mo>></mo><mn>0</mn> </mrow> Outras expressões ∑ b a xf )( <mstyle displaystyle=”true”> <munderover> <mo>∑</mo> <mi>a</mi> <mi>b</mi> </munderover> <mrow> <mi>f</mi> <mo>⁡</mo> <mrow><mo>(</mo><mi>x</mi><mo>)</mo></mrow> </mrow> </mstyle> 2 <msqrt><mn>2</mn></msqrt> 3x <mroot><mi>x</mi><mn>3</mn></mroot> ⎟ ⎟ ⎠ ⎞ ⎜ ⎜ ⎝ ⎛ r n <mrow> <mo>(</mo> <mfrac linethickness=”0”><mi>n</mi><mi>r</mi></mfrac> <mo>)</mo> </mrow> yx + 1 <mrow> <mfrac bevelled=”true”> <mn>1</mn> <mrow><mi>x</mi><mo>+</mo><mi>y</mi></mrow> </mfrac> </mrow> [ ) 1,0 <mfenced open=”[“><mn>0</mn><mn>1</mn></mfenced> )( cba ++ <mfenced separator=”+”><mi>a</mi><mi>b</mi><mi>c</mi></mfenced> 259 145637 <mrow> <mn>37</mn> <menclose notation=”longdiv”><mn>1456</mn></menclose> </mrow> 2 x <msup><mi>x</mi><mn>2</mn></msup> ∫ b a dxxf )( <mrow> <munderover> <mo>∫</mo> <mi>a</mi> <mi>b</mi> </munderover> <mi>f</mi> <mo>⁡</mo> <mrow> <mo>(</mo><mi>x</mi><mo>)</mo> </mrow> <mo>ⅆ</mo><mi>x</mi> </mrow> Tabelas e Matrizes ⎟ ⎟ ⎠ ⎞ ⎜ ⎜ ⎝ ⎛ 43 21 <mrow> <mo>(</mo> <mtable> <mtr> <mtd><mn>1</mn></mtd> <mtd><mn>2</mn></mtd> </mtr> <mtr> <mtd><mn>3</mn></mtd> <mtd><mn>4</mn></mtd> </mtr> </mtable> <mo>)</mo> </mrow> 260 ANEXO B. Exemplos de MathML Content Markup Números 2 1 <cn type=”rational”>1<sep/>2</cn> i43+ <cn type=”complex-cartesian”>3<sep/>4</cn> 16 2EF <cn type=”integer” base=”16”>EF2</cn> π <cn type=”constant”>π</cn> Identificadores <ci type=”vector”>A</ci> - vector A <ci>x</ci> - variável chis Símbolos A N <csymbol encoding=”text” definitionURL=”exemplo.com/advogadro.htm”> <msub> <mi>N</mi> <mi>A</mi> </msub> </csymbol> Outras expressões )sin(x <apply> <sin/> <ci>x</ci> </apply> ))(( xgf + <apply> <apply> <plus/> <ci>f</ci> <ci>g</ci> </apply> <ci>x</ci> </apply> ∫ π 0 )sin( dxx <apply> <int/><bvar><ci>x</ci></bvar> <interval> <cn>0</cn><pi/> </interval> <apply> <sin/><ci>x</ci> </apply> </apply> ⎟ ⎟ ⎠ ⎞ ⎜ ⎜ ⎝ ⎛ 10 01 <matrix> <matrixrow> <cn>1</cn><cn>0</cn> </matrixrow> <matrixrow> <cn>0</cn><cn>1</cn> </matrixrow> </matrix> 261 ANEXO C. AKML Schema <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <xs:element name="akml"> <xs:annotation> <xs:documentation>root element</xs:documentation> </xs:annotation> <xs:complexType> <xs:sequence> <xs:element ref="engine" minOccurs="0" maxOccurs="unbounded"/> <xs:element ref="dictionary" minOccurs="0" maxOccurs="unbounded"/> <xs:element ref="result" minOccurs="0"/> <xs:element ref="gui" minOccurs="0" maxOccurs="unbounded"/> </xs:sequence> <xs:attribute name="version" use="required"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="1.0"/> </xs:restriction> </xs:simpleType> </xs:attribute> </xs:complexType> </xs:element> <xs:element name="conversion"> <xs:annotation> <xs:documentation>conversion definitions</xs:documentation> </xs:annotation> <xs:complexType> <xs:attribute name="name" use="required"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="cardinal"/> <xs:enumeration value="date"/> <xs:enumeration value="decimal"/> <xs:enumeration value="fractional"/> <xs:enumeration value="ip"/> <xs:enumeration value="ordinal"/> <xs:enumeration value="percentage"/> <xs:enumeration value="roman"/> </xs:restriction> </xs:simpleType> </xs:attribute> <xs:attribute name="usermode" type="xs:integer" use="required"/> <xs:attribute name="gender"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="m"/> <xs:enumeration value="f"/> </xs:restriction> </xs:simpleType> </xs:attribute> <xs:attribute name="quantity"> <xs:simpleType> 262 <xs:restriction base="xs:string"> <xs:enumeration value="s"/> <xs:enumeration value="p"/> </xs:restriction> </xs:simpleType> </xs:attribute> <xs:attribute name="type"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="c"/> <xs:enumeration value="o"/> </xs:restriction> </xs:simpleType> </xs:attribute> </xs:complexType> </xs:element> <xs:element name="conversiondefaults"> <xs:annotation> <xs:documentation>default conversion definitions</xs:documentation> </xs:annotation> <xs:complexType> <xs:sequence> <xs:element ref="module" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="conversionsettings"> <xs:annotation> <xs:documentation>config for conversions</xs:documentation> </xs:annotation> <xs:complexType> <xs:sequence> <xs:element ref="module" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="engine"> <xs:annotation> <xs:documentation>engine set-up</xs:documentation> </xs:annotation> <xs:complexType> <xs:sequence> <xs:element ref="options" minOccurs="0"/> <xs:element ref="conversiondefaults" minOccurs="0"/> <xs:element ref="conversionsettings" minOccurs="0"/> </xs:sequence> <xs:attribute name="lang" use="required"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="en"/> <xs:enumeration value="pt"/> </xs:restriction> </xs:simpleType> </xs:attribute> </xs:complexType> </xs:element> <xs:element name="gui"> <xs:annotation> <xs:documentation>gui set-up</xs:documentation> 263 </xs:annotation> <xs:complexType> <xs:sequence> <xs:element ref="options"/> </xs:sequence> <xs:attribute name="lang" type="xs:string" use="required"/> </xs:complexType> </xs:element> <xs:element name="module"> <xs:annotation> <xs:documentation>conversion module</xs:documentation> </xs:annotation> <xs:complexType> <xs:sequence> <xs:element ref="conversion" minOccurs="0" maxOccurs="unbounded"/> </xs:sequence> <xs:attribute name="name" use="required"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="abbreviation"/> <xs:enumeration value="acronym"/> <xs:enumeration value="network"/> <xs:enumeration value="numeral"/> </xs:restriction> </xs:simpleType> </xs:attribute> <xs:attribute name="usermode" type="xs:string" use="required"/> </xs:complexType> </xs:element> <xs:element name="options"> <xs:annotation> <xs:documentation>config options</xs:documentation> </xs:annotation> <xs:complexType> <xs:sequence> <xs:element ref="set" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="set"> <xs:complexType> <xs:attribute name="name" use="required"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="abbreviation"/> <xs:enumeration value="acronym"/> <xs:enumeration value="usermodes"/> <xs:enumeration value="ttsengine"/> <xs:enumeration value="ttstype"/> <xs:enumeration value="agent"/> </xs:restriction> </xs:simpleType> </xs:attribute> <xs:attribute name="value" type="xs:string"/> </xs:complexType> </xs:element> <xs:element name="definition"> <xs:annotation> 264 <xs:documentation>definition entry</xs:documentation> </xs:annotation> <xs:complexType mixed="true"> <xs:attribute name="alias" type="xs:string" use="required"/> </xs:complexType> </xs:element> <xs:element name="dictionary"> <xs:annotation> <xs:documentation>dictionary set-up</xs:documentation> </xs:annotation> <xs:complexType> <xs:sequence> <xs:element ref="definition" maxOccurs="unbounded"/> </xs:sequence> <xs:attribute name="name" use="required"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="abbreviation"/> <xs:enumeration value="acronym"/> </xs:restriction> </xs:simpleType> </xs:attribute> <xs:attribute name="type"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="chemistry"/> <xs:enumeration value="money"/> <xs:enumeration value="others"/> <xs:enumeration value="physics"/> <xs:enumeration value="social"/> </xs:restriction> </xs:simpleType> </xs:attribute> <xs:attribute name="lang" use="required"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="pt"/> </xs:restriction> </xs:simpleType> </xs:attribute> </xs:complexType> </xs:element> <xs:element name="result"> <xs:annotation> <xs:documentation>result document</xs:documentation> </xs:annotation> <xs:complexType> <xs:sequence> <xs:element ref="stats"/> <xs:element ref="doc"/> <xs:element ref="nav" minOccurs="0"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="stats"> <xs:annotation> <xs:documentation>statistics block</xs:documentation> </xs:annotation> <xs:complexType> <xs:sequence> 265 <xs:element ref="stat" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="stat"> <xs:annotation> <xs:documentation>statistics definition</xs:documentation> </xs:annotation> <xs:complexType> <xs:attribute name="name" use="required"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="abbreviation"/> <xs:enumeration value="acronym"/> <xs:enumeration value="numeral"/> <xs:enumeration value="math"/> <xs:enumeration value="convtime"/> <xs:enumeration value="network"/> </xs:restriction> </xs:simpleType> </xs:attribute> <xs:attribute name="value" type="xs:string" use="required"/> </xs:complexType> </xs:element> <xs:element name="doc"> <xs:annotation> <xs:documentation>doc set-up</xs:documentation> </xs:annotation> <xs:complexType> <xs:choice maxOccurs="unbounded"> <xs:element ref="txt"/> <xs:element ref="mat"/> </xs:choice> </xs:complexType> </xs:element> <xs:element name="txt"> <xs:annotation> <xs:documentation>text result</xs:documentation> </xs:annotation> <xs:complexType mixed="true"> <xs:choice minOccurs="0" maxOccurs="unbounded"> <xs:element ref="abr"/> <xs:element ref="num"/> <xs:element ref="net"/> <xs:element ref="acr"/> </xs:choice> <xs:attribute name="value" type="xs:string" use="optional"/> </xs:complexType> </xs:element> <xs:element name="mat"> <xs:annotation> <xs:documentation>math result</xs:documentation> </xs:annotation> <xs:complexType mixed="true"> <xs:choice minOccurs="0" maxOccurs="unbounded"> <xs:element ref="node"/> <xs:element ref="num"/> </xs:choice> <xs:attribute name="value" type="xs:string" 272 21 0 sin ( 1) (2 1)! n n n x xn + ∞ = =− + ∑ <math> <mrow> <mi>sin</mi><mo>⁡</mo><mi>x</mi><mo>=</mo> <mstyle displaystyle="true"> <munderover> <mo>∑</mo> <mrow><mi>n</mi><mo>=</mo><mn>0</mn></mrow> <mi>∞</mi> </munderover> <mrow> <msup> <mrow> <mo stretchy="false">(</mo> <mo>−</mo><mn>1</mn> <mo stretchy="false">)</mo> </mrow> <mi>n</mi> </msup> <mfrac> <mrow> <msup> <mi>x</mi> <mrow><mn>2</mn><mi>n</mi><mo>+</mo><mn>1</mn></mrow> </msup> </mrow> <mrow> <mo stretchy="false">(</mo> <mn>2</mn><mi>n</mi><mo>+</mo><mn>1</mn> <mo stretchy="false">)</mo> <mo>!</mo> </mrow> </mfrac> </mrow> </mstyle> </mrow> </math> 273 ANEXO E. Corpus matemático Álgebra Simples 1. 5,4 1 3xz+++= chis mais cinco vírgula quatro mais zê mais um igual a três 2. 123 8910 0+++ +++ >… um mais dois mais três mais reticências mais oito mais nove mais dez maior do que zero 3. () 0xy z++= abrir parêntesis chis mais ípsilon fechar parêntesis mais zê igual a zero 4. () 0xy z−−= abrir parêntesis chis menos ípsilon fechar parêntesis menos zê igual a zero 5. 120 2−≥ inicio de fracção, numerador: um a dividir por denominador: dois fim de fracção menos raiz quadrada de dois fim de radicando maior ou igual a zero 6. ()( ) 0,01 10 0,02 20xy zw−−− = −−− zero vírgula zero um menos abrir parêntesis chis menos ípsilon menos dez fechar parêntesis igual a zero vírgula zero dois menos abrir parêntesis zê menos dabliu menos vinte fechar parêntesis 7. ... x yz××× chis vezes ípsilon vezes reticências vezes zê 8. 5( ) x yxy+=×− chis mais ípsilon igual a cinco vezes abrir parêntesis chis menos ípsilon fechar parêntesis 9. 4 2 xyxy+=×× inicio de fracção, numerador: chis a dividir por denominador: dois fim de fracção mais ípsilon igual a quatro vezes chis vezes ípsilon 10. 1 x yx xy +>× − raiz quadrada de chis fim de radicando mais inicio de fracção, numerador: um a dividir por denominador: chis menos ípsilon fim de fracção maior do que ípsilon vezes chis 11. 2 sin ( ) lim 1 x x x x →+∞ + + limite quando chis tende para mais infinito de: inicio de fracção, numerador: chis mais seno ao quadrado de abrir parêntesis chis fechar parêntesis a dividir por denominador: chis mais um fim de fracção 274 Fracções 12. 1 2 inicio de fracção, numerador: um a dividir por denominador: dois fim de fracção 13. dy dx inicio de fracção, numerador: dê ípsilon a dividir por denominador: dê chis fim de fracção 14. a b c d inicio de fracção, numerador: inicio de fracção, numerador: à a dividir por denominador: bê fim de fracção a dividir por denominador: inicio de fracção, numerador: cê a dividir por denominador: dê fim de fracção fim de fracção 15. 15 2 + inicio de fracção, numerador: um mais raiz quadrada de cinco fim de radicando a dividir por denominador: dois fim de fracção 16. 1 11 3 22 13 x x + += + inicio de fracção, numerador: um a dividir por denominador: dois fim de fracção mais inicio de fracção, numerador: um a dividir por denominador: um mais inicio de fracção, numerador: chis a dividir por denominador: três fim de fracção fim de fracção igual a inicio de fracção, numerador: um mais inicio de fracção, numerador: chis a dividir por denominador: três fim de fracção a dividir por denominador: dois fim de fracção 17. ln sin x x yy π > inicio de fracção, numerador: logaritmo neperiano de chis a dividir por denominador: ípsilon fim de fracção maior do que inicio de fracção, numerador: seno de chis a dividir por denominador: pi minúsculo ípsilon fim de fracção 18. 0 3 xx x−> − inicio de fracção, numerador: chis a dividir por denominador: três menos chis fim de fracção menos chis maior do que zero 275 Raízes 19. a raiz quadrada de à fim de radicando 20. x b− raiz quadrada de chis menos bê fim de radicando 21. xab+ raiz de índice: chis fim de índice e base: à mais bê fim de radicando 22. 3abc+− raiz cúbica de à mais bê fim de radicando menos cê 23. 3 258+− raiz quadrada de dois mais raiz quadrada de cinco fim de radicando menos raiz cúbica de oito fim de radicando fim de radicando 24. 5235 xz −−+ raiz de índice: chis menos cinco fim de índice e base: dois menos zê fim de radicando mais trinta e cinco 25. 24 2 bb ac a −± − inicio de fracção, numerador: menos bê mais ou menos raiz quadrada de bê ao quadrado menos quatro à cê fim de radicando a dividir por denominador: dois à fim de fracção 26. (1) 51 1 x x xx −− +>− raíz de índice: abrir parêntesis chis menos um fechar parêntesis fim de índice e base: chis mais chis elevado ao expoente: raiz quadrada de cinco fim de radicando menos um fim de expoente fim de radicando maior do que raiz quadrada de um menos chis fim de radicando 27. 335 2yxxy+−−=+ raíz cúbica de raiz quadrada de ípsilon mais três raiz quadrada de cinco menos chis fim de radicando fim de radicando menos dois fim de radicando igual a chis mais ípsilon Potências 28. 23 5 cinco elevado ao expoente: vinte e três fim de expoente 29. 4 2 dois elevado ao expoente: quatro fim de expoente 30. (4) x − abrir parêntesis menos quatro fechar parêntesis elevado ao expoente: chis fim de expoente 31. 5 2x+ dois elevado ao expoente: chis mais cinco fim de expoente 276 32. 2 3x três elevado ao expoente: chis ao quadrado fim de expoente 33. 2 (5) () c ab x− + chis elevado ao expoente: abrir parêntesis à mais bê fechar parêntesis elevado ao expoente: abrir parêntesis cê menos cinco fechar parêntesis ao quadrado fim de expoente fim de expoente 34. 3 (5)10x+− abrir parêntesis chis mais cinco fechar parêntesis ao cubo menos dez 35. 3 (5)100x+−= abrir parêntesis chis mais cinco fechar parêntesis ao cubo menos dez igual a zero 36. 5 5( 3)x−− cinco menos abrir parêntesis chis menos três fechar parêntesis elevado ao expoente: cinco fim de expoente 37. (2) 2yy x yx −+> chis elevado ao expoente: abrir parêntesis ípsilon menos dois fechar parêntesis fim de expoente mais ípsilon ao quadrado maior do que chis elevado ao expoente: ípsilon fim de expoente 38. 3 2( 2) (3) 50 x x− −−= abrir parêntesis chis menos três ao quadrado fechar parêntesis elevado ao expoente: abrir parêntesis chis menos dois ao cubo fechar parêntesis fim de expoente menos cinco igual a zero 39. 2 13 3 ()a ab b +> abrir parêntesis à mais bê fechar parêntesis elevado ao expoente: inicio de fracção, numerador: um a dividir por denominador: três fim de fracção fim de expoente maior do que inicio de fracção, numerador: à ao quadrado a dividir por denominador: bê ao cubo fim de fracção Trigonometria 40. sin cos α µ = seno de alfa minúsculo igual a cosseno de miu minúsculo 41. 22 sin cos 1 αα += seno ao quadrado de alfa minúsculo mais cosseno ao quadrado de alfa minúsculo igual a um 42. 3 cos3 4cos 3cos α αα =− cosseno de três alfa minúsculo igual a quatro cosseno ao cubo de alfa minúsculo menos três cosseno de alfa minúsculo 277 43. 31 sin (3sin sin3 ) 4 α αα =− seno ao cubo de alfa minúsculo igual a inicio de fracção, numerador: um a dividir por denominador: quatro fim de fracção abrir parêntesis três seno de alfa minúsculo menos seno de três alfa minúsculo fechar parêntesis 44. arcsin 0 2 π θθ ⎛⎞ −−= ⎜⎟ ⎝⎠ arco-seno de téta minúsculo menos abrir parêntesis inicio de fracção, numerador: pi minúsculo a dividir por denominador: dois fim de fracção menos téta minúsculo fechar parêntesis igual a zero 45. 2 cos x cosseno ao quadrado de chis 46. sin sin 2sin cos 22 α βαβ αβ ± ±= ∓ seno de alfa minúsculo mais ou menos seno de beta minúsculo igual a dois seno de inicio de fracção, numerador: alfa minúsculo mais ou menos beta minúsculo a dividir por denominador: dois fim de fracção cosseno de inicio de fracção, numerador: alfa minúsculo menos ou mais beta minúsculo a dividir por denominador: dois fim de fracção Matrizes e Sistemas de (in)equações 47. 11 12 21 22 aa aa ⎛⎞ ⎜⎟ ⎝⎠ tabela ou matriz primeira linha primeira coluna à de índice onze fim de índice fim de coluna segunda coluna à de índice doze fim de índice fim de coluna fim de linha segunda linha primeira coluna à de índice vinte e um fim de índice fim de coluna segunda coluna à de índice vinte e dois fim de índice fim de coluna fim de linha fim de tabela ou matriz 48. 12 5 34 6 x y ⎡⎤⎡⎤⎡⎤ ×= ⎢⎥⎢⎥⎢⎥ ⎣⎦⎣⎦⎣⎦ tabela ou matriz primeira linha primeira coluna um fim de coluna segunda coluna dois fim de coluna fim de linha segunda linha primeira coluna três fim de coluna segunda coluna quatro fim de coluna fim de linha fim de tabela ou matriz vezes tabela ou matriz primeira linha primeira coluna chis fim de coluna fim de linha segunda linha primeira coluna ípsilon fim de coluna fim de linha fim de tabela ou matriz igual a tabela ou matriz primeira linha primeira coluna cinco fim de coluna fim de linha segunda linha primeira coluna seis fim de coluna fim de linha fim de tabela ou matriz 49. 2 5 xy xy −= ⎧ ⎨+= ⎩ abrir chaveta tabela ou matriz primeira linha primeira coluna chis menos ípsilon igual a dois fim de coluna fim de linha segunda linha primeira coluna chis mais ípsilon igual a cinco fim de coluna fim de linha fim de tabela ou matriz 278 50. 222 2 1 0 5 1 abc bc a c ⎧++> ⎪ ⎪−= ⎨ ⎪ ⎪= + ⎩ abrir chaveta tabela ou matriz primeira linha primeira coluna à ao quadrado mais bê ao quadrado mais cê ao quadrado maior do que um fim de coluna fim de linha segunda linha primeira coluna bê ao quadrado menos raiz quadrada de cê fim de radicando igual a zero fim de coluna fim de linha terceira linha primeira coluna inicio de fracção, numerador: à a dividir por denominador: cê mais um fim de fracção igual a cinco fim de coluna fim de linha fim de tabela ou matriz Integrais 51. dx x k=+ ∫ integral de dê chis igual a chis mais capa 52. 2arcsin( ) 1 dx x k x=+ − ∫ integral de inicio de fracção, numerador: dê chis a dividir por denominador: raiz quadrada de um menos chis ao quadrado fim de radicando fim de fracção igual a arco-seno de abrir parêntesis chis fechar parêntesis mais capa 53. 1 1 1 x x tdt t + − − ∫ integral com limite inferior: um menos chis fim de limite e limite superior: chis mais um fim de limite de: inicio de fracção, numerador: tê menos um a dividir por denominador: tê fim de fracção dê tê 54. 2 2 1 1x edx − + ∫ integral com limite inferior: um fim de limite e limite superior: dois fim de limite de: raiz quadrada de um mais é elevado ao expoente: menos dois chis fim de expoente fim de radicando dê chis 55. (,,) (,,) bdv Bacu f xyzdV fxyzdzdydx= ∫ ∫∫∫ integral com limite inferior: bê fim de limite de: éfe abrir parêntesis chis vírgula ípsilon vírgula zê fechar parêntesis dê vê igual a integral com limite inferior: à fim de limite e limite superior: bê fim de limite de: integral com limite inferior: cê fim de limite e limite superior: dê fim de limite de: integral com limite inferior: u fim de limite e limite superior: vê fim de limite de: éfe abrir parêntesis chis vírgula ípsilon vírgula zê fechar parêntesis dê zê dê ípsilon dê chis 279 56. 22 24 44 13 6 2 0 xx xx x A dydx dydx −− −+ =+ ∫∫ ∫∫ à igual a integral com limite inferior: um fim de limite e limite superior: dois fim de limite de: integral com limite inferior: menos três chis mais seis fim de limite e limite superior: quatro chis menos chis ao quadrado fim de limite de: dê ípsilon dê chis mais integral com limite inferior: dois fim de limite e limite superior: quatro fim de limite de: integral com limite inferior: zero fim de limite e limite superior: quatro chis menos chis ao quadrado fim de limite de: dê ípsilon dê chis 57. 3 1 () C zdz z + ∫ integral com limite inferior: cê fim de limite de: abrir parêntesis zê mais inicio de fracção, numerador: um a dividir por denominador: zê fim de fracção fechar parêntesis ao cubo dê zê 58. [] , () ab f zdz ∫ integral com limite inferior: abrir parêntesis rectos à vírgula bê fechar parêntesis rectos fim de limite de: éfe abrir parêntesis zê fechar parêntesis dê zê Derivadas 59. ''' 2 '' 2 ' 2cos 4yyy x−+= ípsilon linha linha linha menos dois ípsilon linha linha mais dois ípsilon linha igual a dois cosseno de quatro chis 60. 0 yy tx ∂∂ −= ∂∂ inicio de fracção, numerador: derivada parcial ípsilon a dividir por denominador: derivada parcial tê fim de fracção menos inicio de fracção, numerador: derivada parcial ípsilon a dividir por denominador: derivada parcial chis fim de fracção igual a zero 61. (, ) dy f xy dx = inicio de fracção, numerador: dê ípsilon a dividir por denominador: dê chis fim de fracção igual a éfe abrir parêntesis chis vírgula ípsilon fechar parêntesis 62. 2 2 yy x t ∂∂ = ∂∂ inicio de fracção, numerador: derivada parcial ao quadrado ípsilon a dividir por denominador: derivada parcial chis ao quadrado fim de fracção igual a inicio de fracção, numerador: derivada parcial ípsilon a dividir por denominador: derivada parcial tê fim de fracção 63. 2 '' 1 'yy=+ ípsilon linha linha igual a raiz quadrada de um mais ípsilon linha ao quadrado fim de radicando 280 64. 2 (1 ) ' 0 dxy dx ⎡⎤ −= ⎣⎦ inicio de fracção, numerador: dê a dividir por denominador: dê chis fim de fracção abrir parêntesis rectos abrir parêntesis um menos chis ao quadrado fechar parêntesis ípsilon linha fechar parêntesis rectos igual a zero 65. 0 (, ) 1 x tx x= ∂=− ∂ inicio de fracção, numerador: derivada parcial abrir parêntesis tê vírgula chis fechar parêntesis a dividir por denominador: derivada parcial chis fim de fracção barra ao alto de índice chis igual a zero fim de índice igual a menos um Somatórios 66. nn ab≠ ∑∑ somatório de à de índice éne fim de índice diferente de somatório de bê de índice éne fim de índice 67. 2 ! 2n n ∑ somatório de inicio de fracção, numerador: éne factorial a dividir por denominador: dois elevado ao expoente: dois éne fim de expoente fim de fracção 68. 2 0(1)(2 )! n nz n ∞− ∑ somatório com limite inferior: zero fim de limite e limite superior: infinito fim de limite de: abrir parêntesis menos um fechar parêntesis elevado ao expoente: éne fim de expoente inicio de fracção, numerador: zê elevado ao expoente: dois éne fim de expoente a dividir por denominador: abrir parêntesis dois éne fechar parêntesis factorial fim de fracção 69. () 1 0 12 2 12n n n ∞− = =− ∑ somatório com limite inferior: éne igual a zero fim de limite e limite superior: infinito fim de limite de: um a dividir por dois elevado ao expoente: éne fim de expoente igual a dois menos abrir parêntesis um a dividir por dois fechar parêntesis elevado ao expoente: éne menos um fim de expoente 70. 1 sin( ) n n n π ∞ = ∑ somatório com limite inferior: éne igual a um fim de limite e limite superior: infinito fim de limite de: inicio de fracção, numerador: seno de abrir parêntesis éne pi minúsculo fechar parêntesis a dividir por denominador: éne fim de fracção 281 71. 2 2 1 1 6 nn π ∞ = = ∑ somatório com limite inferior: éne igual a um fim de limite e limite superior: infinito fim de limite de: inicio de fracção, numerador: um a dividir por denominador: éne ao quadrado fim de fracção igual a inicio de fracção, numerador: pi minúsculo ao quadrado a dividir por denominador: seis fim de fracção 72. 41 2 0 cosh( ) (2 )! n n z zz n + ∞ = =∑ zê cosseno hiperbólico de abrir parêntesis zê ao quadrado fechar parêntesis igual a somatório com limite inferior: éne igual a zero fim de limite e limite superior: infinito fim de limite de: inicio de fracção, numerador: zê elevado ao expoente: quatro éne mais um fim de expoente a dividir por denominador: abrir parêntesis dois éne fechar parêntesis factorial fim de fracção 73. 21 0 sin ( 1) (2 1)! n n n x xn + ∞ = =− + ∑ seno de chis igual a somatório com limite inferior: éne igual a zero fim de limite e limite superior: infinito fim de limite de: abrir parêntesis menos um fechar parêntesis elevado ao expoente: éne fim de expoente inicio de fracção, numerador: chis elevado ao expoente: dois éne mais um fim de expoente a dividir por denominador: abrir parêntesis dois éne mais um fechar parêntesis factorial fim de fracção 74. ()( ) 43 211 21 ii i i ii ax bx ax bx −−− == ++ + ∑∑ somatório com limite inferior: i igual a dois fim de limite e limite superior: quatro fim de limite de: abrir parêntesis à chis elevado ao expoente: i fim de expoente mais bê chis elevado ao expoente: i menos dois fim de expoente fechar parêntesis mais somatório com limite inferior: i igual a um fim de limite e limite superior: três fim de limite de: abrir parêntesis à chis elevado ao expoente: i menos um fim de expoente mais bê chis elevado ao expoente: i menos um fim de expoente fechar parêntesis