Engenharia de Linguagens

Engenharia de Linguagens (2009/2010)

Processamento Estruturado de Documentos

Alfresco

Descarregar a versão Community Edition

Requisitos:

  • Java
  • MySQL
  • ImageMagick

chmod +x Alfresco-Community-3.3-Linux-x86-Install
sudo ./Alfresco-Community-3.3-Linux-x86-Install

Executar o Alfresco

sudo /opt/Alfresco/alfresco.sh start

http://localhost:8080/alfresco

http://localhost:8080/share

Tutoriais do Alfresco

Getting Started with Alfresco Explorer Document Management for Community Edition 3.3

Mais tutoriais em:

Nepomuk

0. Activar o Nepomuk

Alt+F2, procurar por strigi ou nepomuk

0.1. Correr 'Configuração do Servidor Nepomuk/Strigi'

Configuração básica:

  • Activar o Ambiente de Trabalho Semântico do Nepomuk
  • Activar a Indexação de Ficheiros no Ambiente do Strigi

No meu caso, não arrancava a indexação do Strigi, porque não tinha o JAVA instalado.

sudo apt-get install sun-java6-jre
sudo ln -s /usr/lib/jvm/java-6-sun/jre/lib/i386/server/libjvm.so /usr/lib/libjvm.so

1. Alterar o ficheiro de configuração ~/.kde/share/config/nepomukserverrc

Trocar:

Used Soprano Backend=redland
por:
Used Soprano Backend=sesame2

2. Restart the Nepomuk server:

killall nepomukserver
nohup /usr/bin/nepomukserver

3. Monitorizar o repositório:

sopranocmd --dbus org.kde.NepomukStorage --model main monitor

4. Inserir tags, comentários, ratings

No Dolphin (explorador de ficheiros)

5. Pesquisas (Alt+F2, no KRunner):

nepomuksearch:/ tag:"bison" and tag="changelog"
nepomuksearch:/ tag:"XATA"
XATA

6. Pesquisas na linha de comando:

sopranocmd --dbus org.kde.NepomukStorage --model main list "" "" "<nepomuk:/XATA>"

6.9 Eventualmente é preciso instalar:

sudo apt-get install strigi-daemon strigi-utils strigi-client deskbar-plugins-strigi

7. Utilizar o strigi isoladamente:

xmlindexer semanticdesktop.pdf
deepfind ...
deepgrep ...

10.

sudo apt-get install filelight filelight-l10n

Exercícios 2010 03 01

Estrutura do paper (cf http://etherpad.com/KrS97SVLHr)

Interface para a ferramenta com ExtJS?

"Hello world" do ExtJS?

1) descarregar ExtJS
2) unzip -x ...
3) ln -s ext-3.1.1 ext
4) *layout.js*:
Ext.onReady(function(){
    new Ext.Viewport({
        layout: "border",
        items: [{
            region: "center",
            title: "Semantic Desktop",
         contentEl: 'bem-vindo'
        }, {
            region: "north",
            title: "Header",
            height: 120,
            collapsible: true
        }, {
            region: "south",
            title: "Footer",
            height: 120,
            collapsible: true
        }, {
            region: "west",
            title: "Tree browser"
        }]
    });
});
5) *interface.html*:
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Semantic Desktop Web Interface</title>

    <!-- base library -->
    <link rel="stylesheet" type="text/css" href="ext/resources/css/ext-all.css" />

    <!-- ExtJS library: base/adapter -->
    <script type="text/javascript" src="ext/adapter/ext/ext-base.js"></script>

    <!-- ExtJS library: all widgets -->
    <script type="text/javascript" src="ext/ext-all.js"></script>

    <script type="text/javascript" src="layout.js"></script>

</head>
<body>
    <div id="bem-vindo">Olá! Aqui vai poder, no futuro, navegar sobre o file system, sem saber que existe file system</div>
</body>
</html>

Exercícios 2010 02 22

Introdução às ontologias e sparql: http://pvanhoof.be/blog/index.php/2009/07/14/introduction-to-rdf-and-sparql

Para ter o tracker-sparql:

1) Descarregar o tracker
wget http://ftp.gnome.org/pub/GNOME/sources/tracker/0.7/tracker-0.7.21.tar.gz
2) Instalar um monte de dependências, entre as quais, o sqlite3
2.x) sudo apt-get install libsqlite3-dev
3) ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var
4) make
5) [sudo make install]
6) ./src/tracker-utils/tracker-sparql

Exercícios 2010 01 18

http://etherpad.com/Bb4DSKte8x

Paper para o XATA (nova deadline: 14 DE MARÇO)

"faziam uma pequena script que recursivamente extrair informação dos ficheiros que vai encontrando e guarda a parte relevante num documento XML. Depois, todos esses documentos XML são submetidos ao Solr para indexação. Por fim, usando o Solr, procuram-se os documentos."

Exercícios 2010 01 04

Instalação Apache Tika

Exercícios 2009 11 30

Processamento dos ficheiros XML

Gerar lista de exposições disponíveis:

<?php
   $xmlDocExpos = new DOMDocument();
   $file = "museuvirtual2008.xml";
   $xmlDocExpos->load($file, LIBXML_NOBLANKS);    
   $k=1;
   $_expos=$xmlDocExpos->getElementsByTagName('exposicao');
   foreach($_expos as $_expo) {
      if($_expo->hasAttribute('titulo')){
         echo '<a href="salas.php?expo=' . $k . '">' . $_expo->getAttribute('titulo') . "</a><br/>\n";
      }
      $k++;
   }
?>

Gerar lista de salas para uma exposição:

<?php
   if (isset($_GET['expo']) && strlen(trim($_GET['expo'])) > 0) {
      $aExposicao= $_GET['expo'];
   } else {
      die("Preciso de saber a exposição, né?");
   }   
   $xmlDocExpos = new DOMDocument();
   $file = "museuvirtual2008.xml";
   $xmlDocExpos->load($file, LIBXML_NOBLANKS); 
   /*
    * Sacar apenas o nome do documento XML com os conteúdos da sala
    */
      $xslSalaXML = new DOMDocument();
      $xslSalaXML->loadXML ('
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
   <xsl:output method="html" indent="yes" omit-xml-declaration="yes"/>
   <xsl:template match="/">
      <xsl:apply-templates select="//exposicao['.$aExposicao.']/sala"/>
   </xsl:template>
   <xsl:template match="//sala">
      <xsl:element name="a">
         <xsl:attribute name="href">
            <xsl:text>topico.php?sala=</xsl:text>
            <xsl:value-of select="."/>
         </xsl:attribute>
         <xsl:value-of select="@titulo"/>
      </xsl:element>
      <xsl:element name="br"/>
   </xsl:template>
</xsl:stylesheet>
' );
   $procSalaXML = new XSLTProcessor();
   $procSalaXML->importStylesheet($xslSalaXML);
   $docxml = $procSalaXML->transformToXML($xmlDocExpos);   
   print_r($docxml);      
?>

Gerar uma página com todos os tópicos de uma exposição:

<?php
   if (isset($_GET['sala']) && strlen(trim($_GET['sala'])) > 0) {
      $aSala= $_GET['sala'];
   } else {
      die("Preciso de saber a sala, né?");
   }   
   $xmlDocExpos = new DOMDocument();
   $file = $aSala;
   $xmlDocExpos->load($file, LIBXML_NOBLANKS); 
   /*
    * Sacar apenas o nome do documento XML com os conteúdos da sala
    */
      $xslSalaXML = new DOMDocument();
      $xslSalaXML->loadXML ('
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
   <xsl:output method="html" indent="yes" omit-xml-declaration="yes"/>
   <xsl:template match="/">
      <ul>
         <xsl:apply-templates mode="indice"/>
      </ul>
      <xsl:apply-templates/>
   </xsl:template>
   <xsl:template match="topico">
      <p>
         <div id="topico">
            <xsl:apply-templates/>
         </div>
      </p>
   </xsl:template>
   <xsl:template match="topico" mode="indice">
      <li>
         <xsl:value-of select="@titulo"/>
      </li>
   </xsl:template>
   <xsl:template match="tema">
      <i>
         <div id="tema">
            <xsl:apply-templates/>
         </div>
      </i>
   </xsl:template>
</xsl:stylesheet>
' );
   $procSalaXML = new XSLTProcessor();
   $procSalaXML->importStylesheet($xslSalaXML);
   $docxml = $procSalaXML->transformToXML($xmlDocExpos);   
   print_r($docxml);      
?>

Interface de pesquisa, que invoca o Solr/lucene:

<?php
   if (isset($_POST['submit'])   && ((isset($_POST['pesquisa']) && strlen(trim($_POST['pesquisa'])) > 0))) {
      $termo = trim($_POST['pesquisa']);
      $resultado = "<p>Obrigado por usar a pesquisa por <b>" . $termo . "</b></p>";            
      $curlPost = 'q=' . urlencode($termo) . '&rows=20';
      $ch = curl_init();
      curl_setopt($ch, CURLOPT_URL, 'http://localhost:8983/solr/select');
      curl_setopt($ch, CURLOPT_HEADER, FALSE);
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
      curl_setopt($ch, CURLOPT_POST, TRUE);
      curl_setopt($ch, CURLOPT_POSTFIELDS, $curlPost); 
      $data = curl_exec($ch);
      curl_close($ch); 
         $resultadoXML = new DOMDocument();
         $resultadoXML->loadXML($data);
      /* Falta tratar o resultado do Solr */
         $xmlString = $resultadoXML->saveXML();
         $resultado .= "<h3>Resposta do Solr</h3>";
         $resultado .= '<xmp>' . $xmlString . '</xmp>';         
   } else {
      $resultado = "<p>Pode pesquisar à vontade</p>";
   }   
?>
<form name="pesquisar" method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
<input type="text" size="16" maxlength="64" name="pesquisa"/>
<input type="submit" value="submit" name="submit"/>
</form>
<?php 
echo $resultado;
?>

Solr/lucene:

  1. Baixar o Apache Solr
  2. Descompactar SOlr
  3. cd apache-solr-1.4.0/example
  4. java -jar start.jar
  5. nmap -p 8983 localhost
PORT     STATE SERVICE
8983/tcp open  unknown

Exercícios 2009 11 23

agenda2html

Exercícios 2009 11 16

Ficha 4

<!-- exercício incompleto; para completar: subs tables por div; tratar refs a entradas; afinar links entre índice e corpo -->
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
   <xsl:output method="xml" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
      doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" indent="yes"/>
   <xsl:template match="/">
      <html>
         <head>
            <title>Anúncio de emprego</title>
            <style type="text/css">
               #esq {
                  width: 240px;
                  float: left;
               }
               #dir {
                  float: left;
               }</style>
         </head>
         <body>
            <div id="esq">
               <ul>
                  <xsl:apply-templates mode="indice"/>
               </ul>
            </div>
            <div id="dir">
               <xsl:apply-templates/>
            </div>
         </body>
      </html>
   </xsl:template>
   <xsl:template match="entrada">
      <a name="{@id}"/>
      <table bgcolor="#cccccc">
         <xsl:apply-templates/>
      </table>
   </xsl:template>
   <xsl:template match="entrada" mode="indice">
      <li>
         <a href="{@id}">
            <xsl:value-of select="nome"/>
         </a>
      </li>
   </xsl:template>
   <xsl:template match="grupo">
      <table border="1">
         <xsl:apply-templates/>
      </table>
   </xsl:template>
   <xsl:template match="nome">
      <tr>
         <td>
            <xsl:apply-templates/>
         </td>
      </tr>
   </xsl:template>
   <xsl:template match="telefone">
      <tr>
         <td>
            <xsl:apply-templates/>
         </td>
      </tr>
   </xsl:template>
   <xsl:template match="email">
      <tr>
         <td>
            <a href="mailto:{.}">
               <xsl:apply-templates/>
            </a>
         </td>
      </tr>
   </xsl:template>
</xsl:stylesheet>

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
   <xsl:output method="xml" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
      doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" indent="yes"/>
   <xsl:template match="/">
      <html>
         <head>
            <title>Anúncio de emprego</title>
         </head>
         <body>
            <xsl:apply-templates/>
         </body>
      </html>
   </xsl:template>
   <xsl:template match="telefone"> </xsl:template>
   <xsl:template match="profissão">
      <h1>
         <xsl:apply-templates/>
      </h1>
   </xsl:template>
</xsl:stylesheet>

Exercícios 2009 11 09

(a)Seleccione o título das músicas que contêm a palavra "Jesus".

//tit[contains( text() , 'Jesus')]

(b)Seleccione a província das músicas que contêm a palavra "Jesus" no título.

//prov[contains( ../tit/text() , 'Jesus')] //prov[../tit[contains( text() , 'Jesus')]]

(c)Seleccione o título de todas as músicas de Castelo Branco.

//tit[ contains( ../local/text() , 'Castelo Branco')]

(d)Seleccione todos os instrumentos referenciados no arquivo.

//intxt|//inst

(e)Seleccione o nome de todos os músicos referidos.

//musico

(f)Seleccione todos os instrumentos das músicas do Minho.

//inst[../prov/text() = 'Minho'] | //intxt[../prov/text() = 'Minho']

Exercícios e Exemplos para as aulas

Exemplo 1:

Considere o seguinte texto histórico (retirado de "Concelho Medieval de Monte Longo e o seu Foral", de José Carlos P. Gonçalves, ed. CMF, 2002, pg 223):

" Contratos de Emprazamento
Eis alguns rendimentos do Mosteiro de S. Gens de Monte Longo, provenientes dos contratos de emprazamento dos bens imóveis: casais, herdades e vinhas, que o mosteiro e os seus prelados possuíam e eram evidentemente uma fonte de proventos e de sustentação destes clérigos:
- Novembro de 1240,Contrato de emprazamento em três vidas de uma vinha sita em Lordelo, feito pelo prelado Gonçalo Gonçalves. Paga de foro anual uma libra de cera, no dia de S. Bartolomeu de S. Gens e a quarta parte do vinho.
- Setembro de 1247, emprazamento em uma vida da herdade sita no lugar de Infesta, Vale do Bouro, para edificar casas ou plantar vinha. Paga de foro anual uma libra de cera, no dia de S. Bartolomeu.
- Janeiro de 1249, emprazamento em três vidas de uma herdade sita em Villa Ouresi, termo de Celorico de Basto. Paga de foro anual um maravidi e para seus filhos dois aureos, no mesmo dia de S. Bartolomeu.
- Abril de 1250, emprazamento em uma vida do casal denominado: casal do meio casal de Trás-do-Rio, sito na Villa Bruela. Não refere o foro. "

Exemplo 2:

Considere o seguinte texto histórico (retirado de "Concelho Medieval de Monte Longo e o seu Foral", de José Carlos P. Gonçalves, ed. CMF, 2002, pg 224-225):

" Sentenças
Sentenças proferidas directamente relacionadas com o Mosteiro de S. Gens de Monte Longo e seus prelados.
- A 9 de Maio de 1238 temos uma sentença proferida pelo Arcebispo de Braga, D. Silvestre, decidindo a questão de padroado e hospitalidade entre D. Rodrigo Gomes de Briteiros e Gonçalo Gonçalves reitor da igreja de S. Gens de Monte Longo. Em resultado da inquirição que mandou fazer por D. Pedro Fernades de Villa Cova e D.Fernando Raimundo de Sousa, Cónegos de Braga, e por Pedro Ervilhom e Rodrigo Vides, Cavaleiros. O Arcebispo julgou e sentenciou que D. Rodrigo Gomes de Briteiros não possuia o direito de padroado que pretendia ter. Foi proferida a sentença na Igreja de S. Clemente.
- Sentença proferida em 26 de Agosto de 1335 por Lourenço Martins, dito calado, vedor dos Coutos e Honras de Entre-Douro e Minho, cargo para que foi nomeado por carta régia datada de Lisboa a 6 de Abril da era de 1335, mandando conservar à igreja de S. Gens do Monte Longo as honras que até então esta possuía nas freguesias de Armil, Estorãos, Ribeiros, Quinchães e S.Gens. A sentença foi precedida de inquirição testemunhal em que foram ouvidos: Pedro Lopes, juiz de Monte Longo, Acenço Esteves, tabelião de Monte Longo, e outros Bons-Homens.
- Em 26 de Maio de 1350 foi proferida uma sentença por João Peres, juiz de Monte Longo, acerca das águas do casal de Pardelhas. A sentença foi lavrada em Ruivães por Vasco Esteves, tabelião de Monte Longo, sendo testemunhas entre outros Martim Affonso, tabelião do mesmo julgado. "

Questões colocadas nas aulas

Q1:

  • (2009-11-02) Após ler os textos dos dois exemplos acima, escolha um dos deles e:
    • a) Defina um contexto específico de trabalho, isto é um enquadramento e finalidade para o tratamento que quer dar aos documentos da família do exemplo escolhido;
    • b) Escreva então um DTD para definir um dialecto XML que lhe permita anotar documentos dessa família;
    • c) Anote o exemplo escolhido com o dialecto XML defindo na alínea anterior.

Fichas Práticas para Avaliação (a resolver fora das aulas)

F1:

  • ....

Notas e Links úteis


  • museu.tgz: Ficheiros XML para a construção de um Museu

  Attachment Action Size Date Who Comment
png configurar.png props, move 55.5 K 19 Apr 2010 - 08:51 JorgeGustavo configurar o Nepomuk no Kubuntu
jpg dolphin.jpg props, move 88.6 K 26 Apr 2010 - 08:22 JorgeGustavo Catalogação a partir do Dolphin
zip museu.tgz props, move 1564.9 K 30 Nov 2009 - 16:31 JorgeGustavo Ficheiros XML para a construção de um Museu
r15 - 17 May 2010 - 07:50:16 - JorgeGustavo
This site is powered by the TWiki collaboration platformCopyright © by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding TWiki? Send feedback
Syndicate this site RSSATOM