2005/06/08 -*- text -*- João Moreira de Sá Coutinho webmaster@dominiopublico.org Objectivo --------- O nosso objectivo aqui é o seguinte : produzir uma versão estruturada do TCE (Tratado Constitucional para a Europa) em XML. Esta versão permitirá por sua vez apresentar o texto do tratado noutros formatos (HTML, .info, etc), mas também desenvolver programas de pesquisa sobre o texto, utilizando o conhecimento da estrutura, ou ainda fazer estatísticas. Versão texto do tratado ----------------------- O Jornal Oficial europeu (sites EUR-Lex) não põe à disposição versões texto, só tem .PDF e (nalgumas línguas : fr, en, de) o HTML online. A versão portuguesa em HTML está lá marcada "Em construção" mas sem data prevista (veja-se http://europa.eu.int/constitution/index_pt.htm). Portanto, é preciso partir do .pdf para recuperar o texto. Não existe em português um ficheiro único, com todo o texto, tal como se encontra para o francês (ver http://europa.eu.int/constitution/print_fr.htm). Foi preciso ir ao Jornal Oficial (http://europa.eu.int/eur-lex/lex/JOHtml.do?uri=OJ:C:2004:310:SOM:PT:HTML), descarregar 50 pdf's, aplicar o "pdftotext" a cada um deles, e juntar os 50 textos resultantes num só ficheiro : print_pt.txt. Para quem não saiba instalar o xpdf, ou usar o pdftotext, aqui vai o ficheiro. O pdftotext introduz alguns erros que é preciso corrigir (mais detalhes no parágrafo seguinte) : corrige pt print_pt.txt > tce_pt.txt O ficheiro "tce_pt.txt" contêm a melhor versão do tratado que eu saiba produzir actualmente. É muito possível, e até provável, que ainda haja erros, por isso enviem-me um mail a assinalar os que encontrarem. Este ficheiro é o ponto de partida para alguns trabalhos: - por um lado, fazer estatísticas (frequências de palavras, de pares de - palavras, etc) - por outro lado, o formato XML, com a análise da estrutura Correcção de erros ------------------ O principal erro cometido pelo pdftotext ao extrair o texto é o de separar palavras quando não devia, o que acontece com os seguintes pares de letras : L A DECL ARAÇÕES T Y T V T W f i def inição f l conf lito r t aber ta r v absor ver Com base nesta lista, o script chamado "erreurs" identifica todos os erros *possíveis* : percorre o texto completo do tratado, e produz uma lista de pares de palavras, em que a 1a acaba com a 1a letra, e a 2a começa com a 2a. O resultado encontra-se no ficheiro "err_pt.possibles" (395 linhas). Um trabalho de verificação manual mostra que há aí 93 casos que não são de facto erros (err_pt.fausses), e que portanto NÃO devem ser corrigidos, e 302 casos que são efectivamente erros (err_pt.vraies). A partir de aí, o script "corrige" faz as correcções excepto quando o par de palavras se encontra no ficheiro "err_pt.fausses". Além disso, outro tipo de erros mais simples também é corrigido, ver comentários. Estatísticas [ INCOMPLETO ] ------------ stats tce_pt.txt Este script produz dois ficheiros : 269902 stats-1mot.txt ( 9.212 linhas) 1595388 stats-2mots.txt (49.000 linhas !) Em stats-1mot.txt, está o número de occorrências de cada palavra. É claro que muitas palavras, e das mais frequentes, não têm muito interesse para quem estuda o conteúdo do tratado (de, em, com, por, ...). Essas palavras pouco interessantes são portanto eliminadas por un script chamado "filtre_pt" (ler o script para ver a lista completa das paqlavras pouco interessantes). O resultado final está no ficheiro "stats-1mot-ok.txt". Este tipo de estatísticas revela-se pouco útil (mas os media adoram !). Pessoalmente, cheguei à conclusão que só a análise de cada frase, depois de se identificarem cada verbo, nome, adjectivo, etc, é que pode dar alguma informação relevante. Isto é um trabalho que ainda está por fazer. Formato XML ----------- O script txt2xml analisa o conteúdo de tce_pt.txt, e produz um ficheiro que respeita a "gramática" descrita em "schema-physique.xsd" (schema XSD). Este ficheiro, chamado tce_pt-physique.xml, comtém o texto original mais o "markup" XML correspondente à estrutura física do documento (páginas, cabeçalhos, etc). Este markup indica-nos a aparição no texto de elementos como um título de capítulo, por exemplo, mas não tenta (ainda) reconstituir o capítulo. txt2xml pt tce_pt.txt > tce_pt-physique.xml xv tce_pt-physique.xml schema-physique.xsd xml2checkphysique tce_pt-physique.xml > tce_pt.checkphysique O 2° comando aqui em cima faz a validação do XML com o schema XSD. xv é um pequeno script, que executa um programa java chamado xsdval.java (requer xerces do projecto Apache). Se quiser fazer esta validação, terá que editar xv para indicar o caminho certo. Não encontrei validação XML vs. XSD em perl, se alguém conhece agradeço que me avisem. 08/06 : o 3° comando aqui em cima produz uma lista hierárquica de elementos estruturais que foram identificados no texto : partes, títulos, capítulos, etc. Esta lista permitiu jà corrigir todos os erros de reconhecimento dos parágrafos dentro dos artigos, e também permitiu a comparação entre as versões portuguesa e francesa. O script verifica também que não haja saltos nas sequências numéricas (partes, títulos, etc). Foram assim contados (mesma quantidade entre fr e pt) : Partes = 6 Títulos = 23 Capítulos = 21 Artigos = 448 Alineas = 810 X-refs = 372 O script xml2logic lê o ficheiro tce_pt-physique.xml, e produz uma versão lógica do documento, com uma hierarquia de partes, títulos, capítulos, artigos, alineas. Esta é a versão de referência, a partir da qual todos os outros formatos podem ser produzidos (vamos fazer HTML e .info). xml2logic tce_pt-physique.xml > tce_pt.xml xv tce_pt.xml schema-logique.xsd O script xml2html produz páginas HTML a partir da versão lógica do tratado. O ficheiro index.html dá um sumário bastante detalhado (coisa que não se encontra nos pdf's originais), e o texto própriamente dito aparece em ficheiros separados, um por cada parte, mais um para o preâmbulo. Esta estrutura permite criar ligações hípertexto, e podemos referenciar qualquer ponto do tratado com um dos URL's seguintes, por exemplo : Parte III : http://dominiopublico.org/europa/PARTE3.html Parte II, título III : http://dominiopublico.org/europa/PARTE2.html#TITRE3 Parte I, título V, capítulo III : http://dominiopublico.org/europa/PARTE1.html#TITULO5_CAPITULO3 Para indicar directamente um artigo, o URL é um bocado diferente. Para referenciar por exemplo o artigo III-396, podemos usar http://dominiopublico.org/europa/PARTE3.html#III-396 21/5 : para quem usa emacs, xml2texi produz tce_pt.texi, a partir do qual o makeinfo faz os ficheiros .info. Não incluí na distribuição um "make install", porque não sei bem fazê-lo funcionar ! Para instalar estes ficheiros e ler o TCE dentro do emacs, basta copiar todos os *.info para o directório habitual do info (no meu caso /usr/share/info) e editar o ficheiro "dir" que lá se encontra, acrescentando as linhas : * Tce_fr: (tce_fr). Traité Établissant une Constitution pour l'Europe * Tce_pt: (tce_pt). Tratado que Estabelece uma Constituição para a Europa se quiser as duas versões, ou só uma. Para saber qual o é directório habitual do info : eu faço C-h i para ir ao info, e logo C-x C-w para fingir que escrevo um ficheiro, e aí o emacs indica o directório. A fazer ------- Para quem saiba programar em perl, aceitam-se contribuições. - txt2xml: tratar todos os tipos de cross-reference. Actualmente, reconheço "IV-437", mas não "o n.° 2 do artigo IV-437.°", nem "disposições do Título III da Parte III", quando estes elementos foram analisados e estão identificados na estrutura XML. - txt2xml: analisar a parte IV, Protocolos et Anexos. Infelizmente, isto representa um trabalho enorme, porque a apresentação (estrutura, títulos, etc), muda de um protocolo para o outro. - xml2logic: juntar novamente as frases/alineas/artigos que começam numa página e acabam noutra. Hoja há sistemáticamente um linha em branco que foi acrescentado em cada fim de página. - xml2logic: separar alineas em parágrafos, e parágrafos em frases. Isto é essencial para se prosseguir a análise do texto. - parte III : os CAPÍTULOS dividem-se em SECÇÕES, e estas em SUB-SECÇÕES