Corpus lingüísticos: proceso de elaboración e extracción automática de información María Paula Santalla del Río Pablo Gamallo Otero Elaboración do material informático (CD LIVE): Susana Sotelo Docío Extracção automática de informação a partir de corpus Pablo Gamallo Otero http://gramatica.usc.es/~gamallo/ Bibliografia Levi Lúcio, Vasco Amaral (2001), Programação em PERL, FCA-Editora de Informática. Hammond, Michael (2003), Programming for linguistics: Perl for language researchers, Blackwell Publishing. Tony Berber Sardinha (2004), Lingüística de Corpus, Editora Manole, Brasil. TUTORIAIS ON LINE (em espanhol): http://glud.udistrital.edu.co/glud/manuales/Perl/http/evangelio_perl.html#quees http://www.geocities.com/SiliconValley/Station/8266/perl/index.html http://glud.udistrital.edu.co/glud/areas/doc/cursos/4_introduccion_perl/ http://kataix.umag.cl/~mmarin/topinf/perl.html http://www.cicei.com/gsi/tutorial_perl/indice.htm PLANO DO CURSO Noções básicas corpus e extracção extracção de frequências de palavras (tokens e formas) lei de zipf concordâncias Iniciação à programação em PERL ler o texto dum ficheiro processar o texto lido escrever os resultados do processamento Noções básicas: corpus e extracção Características dum corpus: Deve estar formado por um conjunto de dados lingüísticos naturais (uso oral ou/e escrito). O conteúdo do corpus deve ser cuidadosamente escolhido segundo certos critérios. O corpus deve ser representativo duma língua ou variedade. O corpus dever ser vasto para ser representativo. O corpus deve ter como finalidade ser objecto de estudo linguístico. Processos computacionais que se podem realizar num corpus: Anotação morfológica, sintática e semântica. Extracção de informação Noções básicas: corpus e extracção Extracção de informação. Tipos de informação extraída: Frequências de ocorrências de palavras, de tipos, de lemas, ... Modelos estatísticos de desambiguação (tagger): se uma palavra aparece no dicionário como NOUN e VERB e se encontra depois dum DET no corpus, então deve ser etiquetada como NOUN. Semelhança semântica entre palavras: se duas palavras aparecem no corpus nos mesmos contextos sintácticos, então devem ser sinómimos ou estar semanticamente relacionadas. Equivalentes de tradução Métodos de extracção: Métodos supervisados Métodos não supervisados Noções básicas: Extracção de frequências Contagem de palavras, ocorrências ou itens (tokens): cada palavra conta como uma ocorrência, mesmo que seja repetida. Contagem de palavras, formas ou tipos (types): conta-se o número de palavras diferentes. Contagem de lemas, ou lexemas (lemmas): conta-se o número de temas diferentes (tema = palavra – morf. flexivos). Contagem de Hapax Legomena: conta-se o número de palavras que ocorrem apenas uma vez (isto é frequência 1) no corpus. Noções básicas: Extracção de frequências Quais são as palavras mais frequentes num corpus representativo dum domínio específico? PALAVRA FREQUÊNCIA PALAVRA FREQUÊNCIA the and a to of was it in that Tom 3332 2972 1775 1725 1440 1161 1027 906 877 679 la que en el y a los las del se Comisión 1.204.397 1.007.827 753.944 666.949 648.594 583.111 523.877 370.840 324.619 318.383 125.258 Palavras mais frequêntes de “Tom Sawyer” Palavras mais frequêntes de Europarl (Parlamento Europeo) Noções básicas: Extracção de frequências 69970 the 36410 of 28852 and 26149 to 23326 a 21341 in 10594 that 10102 is 9815 was 9542 he 9488 for 8760 it 7290 with 7251 as 6997 his 6742 on 6376 be 5377 at 5306 by 5178 i 5146 this 5131 had 4609 not 4394 are 4381 but 4370 from 4207 or 3942 have 3748 an 3619 they 3561 which 3297 one 3286 you 3284 were 3037 her 3001 all 2859 she 2725 there 2715 would 2670 their 2653 we 2619 him 2473 been 2439 has 2331 when 2252 who 2244 will 2216 more 2202 no 2199 if 2096 out 1985 so 1961 said 1908 what 1895 up 1858 its 1815 about 1791 into 1790 than 1789 them 1772 can 1747 only 1702 other 1635 new 1617 some 1599 time 1599 could 1573 these 1412 two 1400 may 1377 then 1362 do 1361 first 1345 any 1319 my 1314 now 1303 such 1290 like 1252 our 1237 over 1207 man Palavras mais frequêntes do corpus Brown (não específico). Noções básicas: Extracção de frequências Quantas ocorrências de palavras (tokens ou itens) tem um corpus? ”Tom Sowyer” tem 71.370 ocurrências de palavras. “El Quijote” tem 376.509. “Brown” tem 1 milhão. “EuroParl” tem 30 milhões 600 mil Quantas palavras diferentes (tipos ou formas) tem um corpus? ”Tom Sowyer” tem 8.018 palavras diferentes (8,9 tokens por tipo). “El Quijote tem 38.552 (9.8 tokens por tipo). (se consideramos os 71.000 primeiros tokens, extraem-se mais de 12.000 tipos) “Brown” tem 55.734 (17 tokens por tipo). “EuroParl” tem 159.211 (192 tokens por tipo). Noções básicas: Extracção de frequências Corpus Banco do Português: Banda de ocurrências Formas % formas Ocurrências % ocurrências frequência média 1 186.275 39,65% 186.275 0,15% 1,0 2a9 160.228 34,11% 610.459 0,48% 3,8 10 a 99 82.174 17,49% 2.662.495 2,11% 32,4 100 a 999 31.065 6,61% 9.840.238 7,81% 316,8 1,83% 25.663.321 20,38% 2.930 1.323 0,28% 32.753.032 26,01% 24.756 78 0,02% 18.637.882 14,80% 238.947 16 0,00% 35.573.922 28,25% 2.223.370 469.745 100% 125.927.624 100% 268,1 1.000 a 9.999 8.586 10.000 a 99.999 100.000 a 999.999 1.000.000 en diante TOTAL Noções básicas: Lei de Zipf K = RxF Existe uma relação constante, K, entre a frequência duma palavra, F, e a sua posição ou ranking, R. Se uma palavra está no ranking R e tem frequência F, a palavra que se encontra no ranking 2R tende a ter uma frequência F/2 Hai poucas palavras mui frequêntes e muitas pouco frequêntes. W the he two name comes F 3332 877 104 21 16 R 1 10 100 400 500 FxR 3332 8770 10400 8400 8000 W group friends family brushed Applausive F 13 10 8 4 1 R 600 800 1000 2000 8000 FxR 7800 8000 8000 8000 8000 Noções básicas: Concordâncias A concordância é uma listagem das ocorrências duma forma específica, dispostas de tal modo que a palavra de busca (aquela que se quere investigar) aparece centralizada e acompanhada do seu contexto original, isto é, das palavras que ocorrem junto com ela no corpus. 13 | acordo em nada prejudica os direitos, no Reino da Dinamarca, dos nacionais dinamarqueses que res 14 | e algumas destas zonas na Bélgica, na Itália e no Reino Unido estão situadas em regiões que têm já 15 | e Tournai. Itália: província de Nápoles. Reino Unido: região de Strathclyde, counties de Clevela 16 | veis; Considerando que algumas destas zonas no Reino Unido estão situadas em regiões que têm já um elev 17 | específica diz respeito às seguintes zonas de Reino Unido: região de Strathclyde, condados de C 18 | grama especial», a apresentar à Comissão pelo Reino Unido. 2. O programa especial terá por fina 19 | izado a pedido dos governos da Irlanda e do Reino Unido, assim como da Comissão, recomendou que a r 20 | entre a Comunidade Económica Europeia e o Reino da Noruega na sequência da adesão da República Hel Noções básicas: Concordâncias Palavra de busca (search word) ou Nódulo: palavra (ou grupo de palavras) da qual o usuário tem interesse em obter uma concordância. Janela (Window): distância máxima entre o nódulo e a primeira palavra à esquerda (ou a ùltima à direita) dentro duma concordância. Palavras de contexto (context words): palavras que estão próximas do nódulo durante a busca (dentro da mesma janela). São opcionais, ou seja, é possível fazer uma concordância sem especificá-las. Vamos programar um pouco A linguagem PERL PERL = Practical Extraction and Report Language. Primeira versão em 1987, Larry Wall. Objectivos • ler o texto dum ficheiro (ou do terminal) linha a linha. • processar o texto lido: tokenizer (quebrar o texto em palavras). contagem de frequências: ocurrências de palavras, de formas, de lemas, etc. • escrever num ficheiro (ou no terminal) os resultados. Estrutura do Programa “nome.perl” • O script escreve no terminal: “Cómo te chamas?” • O script lê o nome escrito pelo usuário • O script escreve no terminal o nome que foi lido. Como tornar executável o script “nome.perl” ? chmod +x nome.perl Atribuimos ao ficheiro “nome.perl” a propriedade: ser executável Estrutura do Programa “nome.perl” • print escreve texto (no terminal, num ficheiro...) • <STDIN> lê um conjunto de caracteres introduzidos através do terminal (por exemplo, através do teclado). • $x=<STDIN> lê um conjunto de caracteres introzidos através do teminal e os coloca na variável $x. • chop $x corta o carácter de nova linha (\n) que se encontra no valor de $x. Que é um programa (ou script)? • Um programa é um conjunto de instruções (print, assignação, leitura, ...) • As instruções simples sempre acabam com o símbolo ‘;’ (ponto e vírgula) • Quando executamos o programa, as instruções são executadas sequencialmente. Tipos de entidades dum programa • escalares: números, cadeias de caracteres • instruções: simples: print, =, chop... complexas: if, while... • Descritores Input/Output: STDIN, STDOUT, arquivos de entrada, arq. de saída... • listas • tabelas (hashes) Tipos de variáveis • escalares: $var • listas: @var • tabelas: %var Estrutura do tokenizer • Lê linha a linha o texto de entrada. • Escreve noutro ficheiro (ou no terminal) as palavras do texto de entrada. Cada palavra aparece numa linha. Como executar o tokenizer? cat arquivo_entrada.txt | ./tokenizer.perl cat arquivo_entrada.txt | ./tokenizer.perl > arquivo_saída.txt Instruções do tokenizer while ($linha = <STDIN>) { instrução1; instrução2; ... } Lê uma a uma as linhas do ficheiro, e cada linha é colocada na variável $linha. Após a leitura de uma linha, executa-se o bloco de instruções (entre chaves). Isto é repetido até chegar á última linha do ficheiro Instruções do tokenizer @pals = split (“ ”, $linha); Divide-se a cadeia $linha cada vez que aparece um espaço em branco. As sucessivas divisões são colocadas na lista @pals. foreach $pal (@pals) { instrução1; instrução2... } Uma vez tomado um elemento da lista @pals e colocado na variável $pal, executam-se as instruções do bloco. Isto é repetido com todos os elementos da lista. Instruções iterativas foreach $var @lista { bloco } O bloco de instruções será executado um número de vezes correspondente ao número de elementos na lista, sendo que para cada iteração uma variável conterá o valor do elemento da lista. while (expressão) { bloco } O bloco será executado até que a expressão se torne falsa: while ($cont < 5) { print “$cont \n”; $cont++; } a instrução IF if (expressão) { bloco do if } else { bloco do else } Se a expressão é verdade, executam-se as instruções contidas no bloco do if. Caso contrário, executa-se o bloco de instruções do else. Expressões falsas: 1 > 2 ; 0 ; “”, 1-1 Expressões verdadeiras: 1 < 2 ; os números excepto o 0; as strings excepto “” Pattern-Matching if ($line =~ m/Maria/) { print $line; } Se a subcadeia “Maria” se encontra dentro da cadeia $line, então afichamos a cadeia $line. $line =~ s/\,/ \,/; Se aparece o caracter “,” na cadeia $line, então substituimos esse caracter pelos dois caracteres “ ,” (i.e. introduzimos um espaço antes da vírgula). Estrutura de “contagem.perl” • Lê linha a linha o ficheiro tokenizado : • Realiza as contagens: - conta as ocurrências de cada token (palavras e marcas), - conta o número total de ocorrências de palavras, - conta as ocurrências da cadeia “relac”, - conta o número total de formas de palavras. • Escreve num ficheiro (ou no terminal) os resultados das contagens. Instruções de contagem.perl while ($token = <STDIN>) { $contar{$token}++; } Lê-se linha a linha o arquivo e construe-se uma tabela: %contar. Cada elemento duma tabela é uma estrutura “chave -> valor”. Cada chave da tabela é um token. O valor para cada chave é o número de vezes que o token é lido: $contar{“livro”} = 2 $contar{“Maria”} = 3 $contar{“,”} = 8 Listas e Tabelas @notas = (“pedro”, 5, “maria”, 8) $notas[0] $notas[1] $notas[2] $notas[3] = = = = “pedro” 5 “maria” 8 %notas = (“pedro” => 5, “maria” => 8) $notas{“pedro”} = 5 $notas{“maria”} = 8 Instruções de contagem.perl foreach $tokenDiff (keys %contar) { $contarTokensDiff++; print "$tokenDiff\t$contar{$tokenDiff}\n" } Iteração: Percorremos a lista de chaves (keys) do hash %contar. Cada elemento é colocado na variável $tokenDiff. Bloco de Instrucções: - contamos os tokens diferentes (formas de palavras) - escrevemos o token (chave de %contar) e a frequência do token (valor de %contar)