Terceiro Trabalho Prático de GTI
Resolução
Exercício 1

Considere dois ficheiros XML descrevendo
catálogos de livrarias, dos quais se apresenta
um excerto abaixo e que se encontram
disponíveis no material de suporte para estes
exercícios. Escreva um XML schema que
capture uma visão integrada das duas fontes
de dados.
Exercício 1
<?xml version="1.0">
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:complexType name="BookType">
<xsd:sequence>
<xsd:element name="title" type="xsd:string" />
<xsd:element name="author" type="xsd:string" />
<xsd:element name="isbn" type="xsd:string" />
<xsd:element name="category" type="xsd:string" minOccurs="0" />
<xsd:element name="publisher" type="xsd:string" minOccurs="0" />
<xsd:element name="pages" type="xsd:integer" minOccurs="0" />
<xsd:element name="price" type="xsd:decimal" minOccurs="0" />
<xsd:element name="date" type="xsd:string" minOccurs="0" />
<xsd:element name="description" type="xsd:string" minOccurs="0" />
</xsd:sequence>
Exercício 1
</xsd:complexType>
<xsd:complexType name="CatalogueType">
<xsd:sequence><xsd:element name="book" type="BookType"
maxOccurs="unbounded" /></xsd:sequence>
</xsd:complexType>
<xsd:element name="catalogue"> type="CatalogueType">
</xsd:schema>
Exercício 2

Escreva em XQuery dois mapeamentos entre
esquemas (views), um para cada um dos
ficheiros XML referidos no Exercício 1, que
produzam XML em conformidade com o
schema dado como resposta. Defina ainda uma
view adicional, de nome mediated-schema, que
faça a união dos dois mapeamentos sobre um
elemento de raiz comum e que produza XML
em conformidade com o schema dado como
resposta ao exercício 1.
Exercício 2
declare namespace gti="uri:gti.pt";
declare function gti:view1() {
<catalogue xsi:noNamespaceSchemaLocation="schema.xsd">
{
for $book in doc("book-catalogue1.xml")//book
return <book>
<title>{data($book/title)}</title>
<author>{data(reverse(tokenize(data($book/author),",
")))}</author>
<isbn>{data($book/@id)}</isbn>
<category>{data($book/genre)}</category>
<price>{replace(data($book/price),"\$","")}</price>
<date>{data($book/publish_date)}</date>
<description>{data($book/description)}</description>
</book>
} </catalogue>}
Exercício 2
declare function gti:view2() {
<catalogue xsi:noNamespaceSchemaLocation="schema.xsd">
{ for $book in doc("book-catalogue2.xml")//book
return <book>
<title>{data($book/title)}</title>
<author>{data(reverse(tokenize(data($book/author),",
")))}</author>
<isbn>{data($book/isbn)}</isbn>
<category>{data($book/../categoryname)}</category>
<publisher>{data($book/publisher)}</publisher>
<pages>{data($book/pagecount)}</pages>
<price>{replace(data($book/price),"\$","")}</price>
<date>{data($book/pubdate)}</date>
<description>{data($book/blurb)}</description>
</book>
} </catalogue>}
Exercício 2
declare function gti:integrated() {
let $aux = ( gti:view1()//catalogue union gti:view2()//catalogue )
return <catalogue xsi:noNamespaceSchemaLocation="schema.xsd">{$aux}</catalogue>
}
Exercício 3

Escreva as seguintes interrogações em XQuery
e diga quais os resultados obtidos aquando da
sua execução sobre a view mediated-schema:
Exercício 3

Quais os autores que escreveram mais do que
um livro?
let $doc := gti:integrated()
for $a in distinct-values($doc//author)
where count($doc//book[author= $a]) > 1
return <author>{$a}</author>
Exercício 3

Qual o livro mais caro?
let $doc := gti:integrated()
return $doc//book[price = max($doc//price)]/title
Exercício 3

Quais as categorias existentes e quantos livros
existem em cada categoria?
let $doc := gti:integrated()
for $c in distinct-values($doc//category)
return
<category>
<name>{$c}</name>
<books>{count($doc//book[category=$c]}</books>
</category>
Exercício 4

Usando o algoritmo de "string matching"
baseado em programação dinâmica dado nas
aulas teóricas, calcule a similaridade e o
alinhamento entre as duas cadeias de
caracteres abaixo indicadas. Indique também a
matriz calculada pelo algoritmo.
AATTGGTCCC
AACTTGGACC
Exercício 4
A
A
C
T
T
G
G
A
C
C
0
1
2
3
4
5
6
7
8
9
9
A
1
0
1
2
3
4
5
6
7
8
9
edit distance =
alinhamento:
A
A
A
A
A
2
1
0
1
2
3
4
5
6
7
8
T
3
2
1
1
1
2
3
4
5
6
7
T
4
3
2
2
1
1
2
3
4
5
6
G
5
4
3
3
2
2
1
2
3
4
5
G
6
5
4
4
3
3
2
1
2
3
4
T
7
6
5
5
4
3
3
2
2
3
4
C
8
7
6
5
5
4
4
3
3
2
3
C
9
8
7
6
6
5
5
4
4
3
2
C
10
9
8
7
7
6
6
5
5
4
3
C
T
T
T
T
G
G
G
G
T
A
C
C
C
C
C
-
3
Exercício 5

Usando o algoritmo "simple tree matching" dado nas
aulas teóricas, calcule a similaridade e o alinhamento
das árvores que se seguem. Devem ser mostradas
todas as matrizes calculadas pelo algoritmo.
A
/ | \
B C D
/| |\
E F G J
/ \ |\
H I KL
A
/ | \
B C M
/\
E F
/\
H N
Exercício 5
Matriz para os filhos de A e A (nível 2)
B
C
M
B
0
1
1
1
0
0
0
0
C
0
1
5
5
D
0
1
5
5
retorno:
Matriz para os filhos de C e C (nível 3)
0
0
0
E
F
6
E
0
1
1
F
0
1
3
retorno:
4
Matriz para os filhos de B e B (nível 3)
Matriz para os filhos de E e E (nível 4)
0
0
retorno:
1
retorno:
1
Matriz para os filhos de F e F (nível 4)
Matriz para os filhos de H e H (nível 5)
H
N
0
0
0
H
0
1
1
I
0
1
1
0
retorno:
1
Nas restantes iteracções o retorno é 0 (porque os nós são diferentes)
Para alinhar, basta ligar os nós com o mesmo nome

Exercício 6

Usando as ferramentas de extracção de dados
introduzidas nas aulas práticas e tendo como
base de conhecimento a lista de filmes e
nomes de actores fornecida no material de
suporte, indique um processo de extracção de
informação às críticas de cinema contidas num
ficheiro de texto, que também se encontra
fornecido no material de suporte.
Exercício 6
import com.aliasi.chunk.*
import com.aliasi.dict.*;
import com.aliasi.util.*;
import com.aliasi.tokenizer.*;
import java.util.*;
import java.io.*;
Exercício 6
public class MovieReviews {
private MapDictionary dictionary;
private ExactDictionaryChunker chunker;
private Map movies;
public MovieReviews() {
this.dictionary = new MapDictionary();
this.movies = new hashMap();
addEntries(new File("actors.txt"),"ACTOR",1.0);
addEntries(new File("movies.txt","MOVIE",1.0);
this.chunker = new
ExactDictionaryChunker(dictionary,IndoEuropeanTokenizerFactory.FACTORY,tr
ue,true); }
Exercício 6
public void addReview(String aux) {
Chunking chunking = chunker.chunk(review);
Set reviewActors = new HashSet();
Set reviewMovies = new HashSet();
for (Chunk chunk : chinking.chunkSet() ) {
if(chunk.type().equals("MOVIE"))
reviewMovies.add(review.substring(chunk.start(),chunk.end())); else
reviewActors.add(review.substring(chunk.start(),chunk.end()));
}
Exercício 6
for (String movie : reviewMovies) {
Set aux = movies.get(movie);
if(aux==null) aux = new HashSet();
aux.addAll(reviewActors);
movies.put(movie,aux);
}
}
Exercício 6
public String getNextReview(BufferedReader reader) throws Exception {
StringBuffer aux = new StringBuffer();
while((s=reader.readLine())!=null && s.equals("##") == false) {
aux.append(s); aux.append(" ");
}
return aux.toString();
}
Exercício 6
public void AddEntries ( File file, String cat, double score) throws
Exception {
BufferedReader reader = new BufferedReader(new FileReader(file));
String s;
while((s=reader.readLine())!=null) dictionary.addEntry(new
DictionaryEntry(s.trim(),cat,score));
}
Exercício 6
public static void main ( String[] args ) throws Exception {
MovieReviews m = new MovieReviews();
BufferedReader reader = new BufferedReader(new
FileReader("reviews.txt"));
String s;
while((s=getNextReview(reader)).length()>0) addReview(s);
for (Map.Entry entry : m.movies.entrySet() ) {
System.out.println("Actors for movie " + entry.getKey() + "*****");
for (String value : m.getValue()) System.out.println("-----" + value);
}
}
}
Exercício 6

Possíveis erros

Nomes de actores que ocorrem na crítica, mas não
pertencem ao elenco

Nomes de filmes que aparecem na crítica de outros
filmes

Nomes de actores em diferentes formatos (e.g.,
com ou sem iniciais)

Nomes de filmes em diferentes formatos,
abreviados, etc.
Download

Solução