Problema B

Analisador de textos

Provavellmente já lhe aconteceu ver um texto e querer saber alguma informação estatística em relação a ele. Alguns processadores de texto até nos dão alguns dados como o número de palavras e o número de espaços. O que já não costumam dizer é quantas palavras diferentes há ou quais são as palavras mais frequentes. Façamos então um programa que nos forneça esses e outros dados.

Tarefa

A sua tarefa é escrever um programa para fazer algumas estatísticas sobre um texto dado. Nomeadamente, deve:     palavras há no texto (10<=PT<=60.000), quantas palavras diferentes (10<=PD<=5.000), 1.      2) produzir a listagem com a frequência de cada letra com 2 casas decimais, 1.      3) Listar as 10 palavras mais frequentes, 1.       4) Listar as 10 palavras mais compridas.

1.      Calcular o número de palavras no texto e o número de palavras diferentes.

2.      Contar as ocorrências de cada letra do alfabeto no texto.

3.      Listar as palavras por ordem de frequência decrescente.

4.      Listar as palavras por ordem de comprimento decrescente.

Uma palavra é uma sequência contígua de letras (pelo menos uma letra) situada entre caracteres que não são letras (ou o início ou o fim da linha). Só consideramos as letras do alfabeto, sem caracteres acentuados nem cês cedilhados, em maiúsculas ou minúsculas. No entanto, para efeitos deste problema não se faz distinção entre letras maiúsculas ou minúsculas. Isto é, a palavra "problema" é a mesma do que a palavra "PROBLEMA" . Os caracteres no texto que não letras devem ser encarados como separadores de palavras. Por exemplo, "guarda­‑chuva" conta como 2 palavras: "guarda" e "chuva".

Dados

A primeira linha do standard input contém dois números inteiros, L (1<=L<=10.000), representando o número de linhas do texto, e Q (1<=Q<=4), representando o tipo de estatística a fazer. As seguintes L linhas contêm o texto a ser alvo de análise (podem haver linhas completamente em branco, ou seja linhas vazias). Cada linha tem no máximo 100 caracteres. Não há mais de 60000 palavras no texto, nem mais de 5000 palavras diferentes. Cada palavra tem no máximo 30 letras.

O significado dos valores de Q é o seguinte:

1 : Calcular o número de palavras e o número de palavras diferentes,  escrevendo os dois números na mesma linha do standard output separados por um espaço.

2 : Produzir uma a tabela de frequências de cada letra e mostrá-la no standard output pela ordem alfabética, com uma entrada por linha. Em cada linha vem uma letra seguida de um espaço, seguido da frequência relativa da letra (em relação ao número de letras e não ao número de caracteres) expressa em percentagem com duas casas decimais.

3 : Ordenar as palavras por ordem decrescente do número de ocorrências, desempatando, quando for caso disso, pela ordem alfabética (isto é, por exemplo, se ambas as palavras “gente” e “povo” aparecerem 19 vezes, então “gente” virá antes de “povo”) e mostrar no standard output, uma em cada linha, as dez primeiras palavras de acordo com a ordenação especificada. Se o texto tiver menos de dez palavras, o programa deve mostrá-las todas. Cada palavra virá acompanhada do respectivo número de ocorrências, usando um espaço como separador.

4 : Ordenar as palavras por ordem decrescente do seu comprimento (medido em número de letras), desempatando por ordem alfabética (isto é, na ordenação, as palavras que têm n letras vêm todas juntas, por ordem alfabética, e antes das que têm n-1 letras) e mostrar no standard output, uma em cada linha, as dez primeiras palavras de acordo com esta ordenação. Se o texto tiver menos de dez palavras, o programa deve mostrá-las todas.

Resultados

O output varia consoante o valor de Q, tal como descrito. Veja os exemplos.

Exemplo de ficheiros de dados 1

18 1
1
As armas e os baroes assinalados,
Que da ocidental praia Lusitana,
Por mares nunca de antes navegados,
Passaram ainda alem da Taprobana,
Em perigos e guerras esforcados,
Mais do que prometia a forca humana,
E entre gente remota edificaram
Novo Reino, que tanto sublimaram;
2
E tambem as memorias gloriosas
Daqueles Reis, que foram dilatando
A Fe, o Imperio, e as terras viciosas
De Africa e de Asia andaram devastando;
E aqueles, que por obras valerosas
Se vao da lei da morte libertando;
Cantando espalharei por toda parte,
Se a tanto me ajudar o engenho e arte.

Exemplo de ficheiros de resultados 1

96 71

Exemplo de ficheiros de dados 2

8 2
Cessem do sabio Grego e do Troiano
As navegacoes grandes que fizeram;
Cale-se de Alexandro e de Trajano
A fama das vitorias que tiveram;
Que eu canto o peito ilustre Lusitano,
A quem Neptuno e Marte obedeceram:
Cesse tudo o que a Musa antigua canta,
Que outro valor mais alto se alevanta.

Exemplo de ficheiros de resultados 2

a 15.22
b 0.87
c 3.04
d 3.91
e 14.78
f 0.87
g 2.17
h 0.00
i 4.78
j 0.43
k 0.00
l 3.04
m 3.91
n 5.22
o 9.57
p 0.87
q 2.61
r 5.65
s 6.96
t 6.96
u 6.09
v 2.17
w 0.00
x 0.43
y 0.00
z 0.43

Exemplo de ficheiros de dados 3

18 3
5
Dai-me uma furia grande e sonorosa,
E nao de agreste avena ou frauta ruda,
Mas de tuba canora e belicosa,
Que o peito acende e a cor ao gesto muda;
Dai-me igual canto aos feitos da famosa
Gente vossa, que a Marte tanto ajuda;
Que se espalhe e se cante no universo,
Se tao sublime preco cabe em verso. 
6
E vos, o bem nascida seguranca
Da Lusitana antigua liberdade,
E nao menos certissima esperanca
De aumento da pequena Cristandade;
Vos, o novo temor da Maura lanca,
Maravilha fatal da nossa idade,
Dada ao mundo por Deus, que todo o mande,
Para do mundo a Deus dar parte grande;

Exemplo de ficheiros de resultados 3

e 7
da 5
o 4
que 4
a 3
de 3
se 3
ao 2
dai 2
deus 2

Exemplo de ficheiros de dados 4

18 4
7
Vos, tenro e novo ramo florescente
De uma arvore de Cristo mais amada
Que nenhuma nascida no Ocidente,
Cesarea ou Cristianissima chamada;
(Vede-o no vosso escudo, que presente
Vos amostra a vitoria ja passada,
Na qual vos deu por armas, e deixou
As que Ele para si na Cruz tomou) 
8
Vos, poderoso Rei, cujo alto Imperio
O Sol, logo em nascendo, ve primeiro;
Ve-o tambem no meio do Hemisferio,
E quando desce o deixa derradeiro;
Vos, que esperamos jugo e vituperio
Do torpe Ismaelita cavaleiro,
Do Turco oriental, e do Gentio,
Que inda bebe o licor do santo rio;

Exemplo de ficheiros de resultados 4

cristianissima
florescente
derradeiro
hemisferio
cavaleiro
esperamos
ismaelita
vituperio
nascendo
ocidente