Departamento de Engenharia Informática 2008/2009 Gestão e Tratamento de Informação 1º semestre Laboratório 6 – Exercícios Deverá utilizar a ferramenta Saxon, apresentada durante a aula de laboratório, para resolver cada um dos exercícios propostos. Tenha em atenção que o software usado nas aulas de laboratório oferece, como complemento às funções da biblioteca XPath 2.0, algumas funções de extensão relacionadas com a extracção de informação a partir de elementos textuais. Estas funções de extensão foram desenvolvidas com recurso ao LingPipe, uma biblioteca de funções Java para processamento de texto. Para mais informações sobre o LingPipe deverá ser consultado o site http://alias‐i.com/lingpipe/. Entre as funções de extensão disponíveis, encontram‐se as seguintes: • Função java:gti.textdoc(), que aceita como parâmetro um URI para um documento e retorna a cadeia de caracteres correspondente ao seu conteúdo textual. • Função java:gti.regexchunk(), que aceita como parâmetros uma cadeia de caracteres e uma expressão regular, retornando todas as entidades mencionadas na cadeia de caracteres que correspondem à expressão regular fornecida. • Função java:gti.dictionarychunk(), que aceita como parâmetros uma cadeia de caracteres e um dicionário (i.e., uma sequência de cadeias de caracteres com as entidades que se pretendem extrair), retornando todas as entidades mencionadas na cadeia de caracteres que se encontram listadas no dicionário. • Função java:gti.mlchunk(), que aceita como parâmetros uma cadeia de caracteres e um documento XML com os exemplos de treino. Esta função utiliza um algoritmo de aprendizagem automática baseado em Modelos de Markov Escondidos (HMMs) para reconhecer as entidades mencionadas na cadeia de caracteres, com base nos exemplos fornecidos. A Figura 1 exemplifica a utilização destas funções, mostrando como se podem extrair entidades (e.g., endereços de email ou nomes próprios) que se encontrem mencionadas numa cadeia de caracteres, usando dicionários e expressões regulares. declare namespace gti = "java:gti"; let $t := 'O Manuel tem o endereço [email protected] e a Maria tem o endereço de email [email protected]' let $dictionary := ('manuel','maria') let $r := '[^ ]+@[^ ]+' for $i in gti:regexchunk($t,$r) | gti:dictionarychunk($t,$dictionary) return <entidade>{$i}</entidade> Figura 1 – Exemplo da utilização de funções de extensão relacionadas com extracção de informação. IST/DEI Pág. 1 de 3 Gestão e Tratamento de Informação Nesta aula de laboratório irá também ser utilizada a ferramenta RoadRunner, a qual permite a geração automática de wrappers sobre documentos HTML com base num método de aprendizagem automática não supervisionado. O algoritmo que está na base da ferramenta RoadRunner foi introduzido nas aulas teóricas. Mais informações sobre a ferramenta RoadRunner podem ser obtidas no ficheiro roadrunner-help.txt, que acompanha o software das aulas de laboratório. Exercício 1 A Figura 2 apresenta um programa XQuery que permite aceder ao site da biblioteca do IST e extrair 10 hiperligações para páginas HTML com informação bibliográfica sobre livros e dissertações relacionados com a palavra‐chave “XML”. declare declare declare declare namespace gti = "java:gti"; namespace xhtml = "http://www.w3.org/1999/xhtml"; namespace saxon="http://saxon.sf.net/"; option saxon:output "method=text"; let $s := 'http://thesaurus.reitoria.utl.pt' let $u := '/search*por/a?searchtype=Y&amp;searcharg=xml&amp;SORT=D' let $doc := gti:htmldoc(concat($s,$u)) for $i in $doc//xhtml:span[@class="briefcitTitle"]/xhtml:a return concat('http://thesaurus.reitoria.utl.pt',$i/@href,'&#10;') Figura 2 – Um programa XQuery que extrai hiperligações do site da biblioteca do IST. Utilize a ferramenta RoadRunner por forma a extrair a informação bibliográfica das páginas HTML acessíveis através das hiperligações produzidas como resultado para o programa apresentado na Figura 2. Crie ainda um programa XQuery que, operando sobre os documentos XML produzidos como resultado pelo RoadRunner, apresente os dados de acordo com o formato da Figura 3. <obra> <titulo>Manuel</titulo> <autor>Uso de XQuery em aplicações na Web</autor> </obra> Figura 3 – Documento XML com informação bibliográfica sobre os livros e dissertações. Exercício 2 Em http://www.indexgeo.com.au/data/capital/capital.csv encontra‐se um ficheiro de texto com uma lista das cidades Australianas que são capitais de estado. Escreva um programa XQuery que, através do uso de funções de extensão em conjunto com um dicionário contendo as cidades listadas no documento referenciado acima, IST/DEI Pág. 2 de 3 Gestão e Tratamento de Informação permita extrair do documento HTML acessível em http://wikitravel.org/en/Australia todas as capitais de estado que se encontram mencionadas no texto. Exercício 3 Escreva um programa XQuery que, através do uso da função de extensão java:gti.mlchunk(), permita extrair do documento HTML acessível em http://www.presidentsusa.net/ todos os nomes de pessoas que se encontram mencionados no texto. Como exemplo de treino, deve ser usado o documento muc.xml, distribuído com o sotware usado nas aulas de laboratório, no qual se encontram anotados todos os nomes de pessoas que se encontram mencionados no texto. Exercício 4 A função de extensão java:gti.mlchunk() corresponde ao método Java cujo código se apresenta na Figura 4. Tal como mencionado anteriormente, este método Java utiliza as funcionalidades disponibilizadas pela API do LingPipe. public static List<Text> mlchunk ( String data, NodeInfo doc ) throws Exception { org.w3c.dom.Document xdocument = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument(); TokenizerFactory factory = new IndoEuropeanTokenizerFactory(); CharLmRescoringChunker chunker = new CharLmRescoringChunker(factory,10,8,256,8); Muc6ChunkParser parser = new Muc6ChunkParser(); parser.setHandler(chunker); parser.parse(new InputSource(new StringReader(gti.serialize(doc)))); List<Text> results = new ArrayList<Text>(); Chunking chunking = chunker.chunk(data); for (Chunk chunk : chunking.chunkSet()) { String text = data.substring(chunk.start(),chunk.end()); results.add(xdocument.createTextNode(text)); } return results; } Figura 4 – Método Java correspondente à função java:gti.mlchunk(). Crie uma nova função de extensão denominada bayeschunk() que, em lugar de um método de aprendizagem automática baseado em Modelos de Markov Escondidos, utilize um modelo Bayesiano para fazer o reconhecimento de entidades. Para resolver este exercício, deverá consultar a documentação (i.e., os tutoriais e a documentação Javadoc) da API LingPipe, que se encontra disponível através do site http://alias‐i.com/lingpipe/. Em particular, deverá ser analisada em detalhe a documentação disponível para a classe com.aliasi.chunk.TokenShapeChunker. IST/DEI Pág. 3 de 3