SENTA 0. Instalação ============= O sistema de compilação e instalação é o comum usado em software GNU. A sequência ./configure make make install deverá ser suficiente. Existem quatro diferentes extractores que podem ser compilados independentemente usando umas das seguintes opções no comando configure: --enable-final-v1 --enable-final-v2 --enable-ideal-v1 --enable-ideal-v2 1. Introdução ============= O conjunto de programas objecto deste documento corresponde ao prototipo desenvolvido durante a tese de mestrado intitulada "Extracção eficiente de padrões textuais utilizando algoritmos e estruturas de dados avançadas" defendida em Fevereiro de 2003 na Faculdade de Ciências e Tecnologia da Universidade Nova de Lisboa. Este documento contém informações úteis para quem pretenda utilizar este código. Informações mais detalhadas sobre o objecto e desenvolvimento da tese de mestrado podem ser encontradas no documento produzido no final da mesma. A leitura deste último documento é fundamental para uma correcta compreensão deste código. Os vários módulos funcionam de forma autonoma. O Extractor é o módulo principal do protótipo desenvolvido. Implementa o algoritmo de extracção de MWUs (Multi-Word Units) com base no GenLocalMaxs e na Expectativa Mútua. Os outros dois módulos, o Tokenizer e o Translator, complementam o Extractor permitindo a sua utilização para corpus baseados em diferentes linguagens ou formatos. 2. Versões ========== Foram desenvolvidas quatro versões do Extractor correspondentes a outras tantas opções de implementação da estrutura de indexação designada por Matrix. - Versão Ideal, V1 - Implementação puramente matricial sem tratamento especial para as máscaras de dimensão unitária - Versão Ideal, V2 - Implementação puramente matricial com tratamento especial para as máscaras de dimensão unitária - Versão Final, V1 - Implementação não matricial sem tratamento especial para as máscaras de dimensão unitária - Versão Final, V2 - Implementação não matricial com tratamento especial para as máscaras de dimensão unitária Para os restantes módulos foi desenvolvida uma única versão. 3. Directorias ============== O código está organizado nas seguintes directorias. FinalCode |---- bin |---- Tokenizer |---- Extractor | |---- Ideal | | |---- V1 | | `---- V2 | ---- Final | |---- V1 | `---- V2 `---- Extractor 4. Ficheiros ============ Uma breve descrição de cada ficheiro (.cpp e .h) pode ser encontrada no cabeçalho dos mesmos. Infelizmente foi seguida a má prática de inclusão de poucos comentários ao longo do código. Apesar disso os comentários incluidos são úteis para uma boa compreensão do código pelo que se sugere a sua leitura. Em geral cada classe desenvolvida corresponde a um ficheiro ".h" e a um ficheiro ".cpp". 5. Tokenizer ============ Foi desenvolvida uma versão do Tokenizer adaptada ao formato do corpus do MCT/Público utilizado como base ao trabalho experimental. O mesmo código pode ser utilizado para todos os corpus que sigam regras de construção idênticas às do corpus do MCT/Público. Outros formatos de corpus implicam modificações ao nível do Tokenizer e do Translator. O código desenvolvido implementa basicamente um filtro/tradutor com base nas seguintes regras: - Ignora todas as tags (conjunto de caracteres entre os sinais < e >) - São considerados delimitadores os caracteres espaço, TAB, fim-de-linha e fim-de-ficheiro - São reconhecidas como unidades lexicográficas (tokens) as seguintes: - Sequências de maiúsculas e minúsculas, podendo estar ligadas por hífens; - Sequências de dígitos, podendo estar ligadas por virgulas e pontos; - Caracteres isolados de pontuação, como seja, o ponto de interrogação. O processo de transformação tem como output um ficheiro binário (representação intermédia) contendo o corpus, depois de filtrado, na forma duma sequência de inteiros (tokens) e um ficheiro (dicionário) contendo o equivalente de cada token na forma duma sequência de caracteres. O executável do Tokenizer cria um ficheiro de texto, “.int”, contendo, um por linha, a lista de ficheiros da representação intermédia do corpus, e um ficheiro intermédio por cada ficheiro do corpus original, acrescentando a extensão “.int”. Os ficheiros da representação intermédia são ficheiros binários contendo uma sequência de tokens (valores inteiros a 4 bytes). Cria ainda o ficheiro do dicionário, ".dic”, na forma dum ficheiro de texto a duas colunas separadas por espaço ou TAB. A primeira coluna é o token, a segunda é a string correspondente à unidade lexicográfica respectiva. Na primeira linha é incluído o número total de tokens presentes. O executável do Tokenizer, recebe como parâmetros o nome de dois ficheiros: tk : Ficheiro de texto contendo lista dos ficheiros de texto que constituem o corpus. O nome deste ficheiro é tomado pelo sistema como o identificador do corpus. O ficheiro deve conter um nome de ficheiro por linha. : Ficheiro de texto contendo, separadas por linhas, um conjunto de regras descritivas do conjunto de caracteres presente no corpus. O segundo ficheiro Contém regras nas formas: - “identificador | caracter = codigo, codigo-codigo, ... codigo, codigo-codigo” onde "| " é um comentário opcional. A forma "codigo-codigo" serve para identificar um intervalo continuo de códigos. - " = identificador, identificador, ... identificador” que permitem identificar a função de cada um dos caracteres. É obrigatório existirem regras do tipo “identificador = lista de códigos de caracteres” para todos os caracteres utilizados no corpus e regras do tipo “função = lista de identificadores” para as funções DELIMITER, LETTERS, DIGITS, PONTO, BEGINTRASH, ENDTRASH, HIFFEN, DOT e COMMA. Um exemplo de implementação deste ficheiro (SetOfChars.txt) pode ser encontrado na directoria "\FinalCode\bin". 6. Extractor ============= O executável do Extractor necessita de três parâmetros: dimensão da janela de análise, representação intermédia do corpus e nome do ficheiro de output. ex .int O primeiro parâmetro é um inteiro impar positivo. O segundo é um ficheiro de texto contendo, um por linha, a lista de ficheiros da representação intermédia do corpus (normalmente produzido pelo Tokenizer). O terceiro parârametro é o nome completo do ficheiro que irá conter a lista de MWUs (e.g. mwus.int). Este último ficheiro é um ficheiro binário contendo registos, para cada MWU, na forma: Byte - Dimensão da janela de análise (n) float - Valor da Expectativa Mútua long - Frequencia unsigned int - token_1 ... unsigned int - token_n 6. Translator ============= O executável do Translator necessita de três parâmetros: tipo de input, representação intermédia do corpus ou da lista de mwus e dicionário. tl {-I | -O} { | } Os formatos do dicionário e das representações intermédias do corpus ou da lista de mwus são os apresentados atrás. O Translator produz um ficheiro de texto contento a tradução do corpus ou da lista de mwus de acordo com o tipo de input e o dicionário. O nome do ficheiro produzido é igual ao do segundo parâmetro acrescentado da extensão ".txt". Se o primeiro parâmetro for "-I" (Input do Extractor) o segundo parâmetro deverá ser a representação intermédia do corpus. Se for "-O" (Output do Extractor) deverá ser a representação intermédia da lista de mwus. O formato deste ficheiro é o seguinte para o caso do input ser a representação intermédia dum corpus: unsigned int - Posição char * - token Este formato é importante essencialmente para obter-se uma representação textual da saída do translator útil para análise dos resultados produzidos. O formato deste ficheiro é o seguinte para o caso do input ser a representação intermédia da lista de mwus: float me - Valor da Expectativa Mútua long - Frequência char * - token_1 char * - token_2 .... char * - token_n onde n é dimensão de cada mwu. Nesta representação as descontinuidades são representadas pela sequência "". 7. Utilização ============= Depois de compilados os três módulos obtêm-se outros tantos executáveis (tk, ex e tl se forem utilizados sem alteração os Makefiles disponibilizados). Um exemplo tipico da utilização destes executáveis é a seguinte sequência de operações dentro dum batch file com dois argumentos: corpus e versão do extractor (i1, i2, f1 ou f2). \FinalCode\bin\tk %1 \FinalCode\setofchars.txt \FinalCode\bin\ex_v%2 7 %1.int mwus.int \FinalCode\bin\tl -O mwus.int %1.dic Neste exemplo é pressuposto que o ficheiro corpus.txt contém a lista dos nomes completos dos ficheiros de texto que fazem parte do corpus a analisar. O nome de cada ficheiro deverá estar completamente qualificado, ou seja, deverá conter explicitamente qual a directoria onde se encontra. Por defeito é a directoria actual. O último executável produzirá um ficheiro de texto (mwus.int.txt) contendo a lista de mwus encontradas. O código actual produz várias mensagens ao longo da sua execução. Estas mensagens foram importantes durante a fase experimental de desenvolvimento do projecto e poderão ser alteradas ou eliminadas para um tipo diferente de utilização do sistema. 8. Compilação ============= O prototipo foi desenvolvido em C++ utilizando a versão freeware do compilador da Borland disponibilizada pelo fabricante via download (Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland) tendo a preocupação de ser portável para outros ambientes. Foi posteriormente recompilado em Red Hat Linux release 7.1 (Seawolf) com a versão 2.96 do gcc para Linux. Foram desenvolvidos Makefiles para os ambientes MsWindows e Linux para facilitar a tarefa de compilação dos vários módulos. Os Makefiles podem ser encontrados nas directorias atrás mencionadas. Na directoria \FinalCode\bin poderão ser encontrados executáveis prontos para serem utilizados em MsWindows. 7. Copyright ============ O código descrito neste documento foi sendo criado, alterado, depurado e melhorado ao longo do trabalho experimental que acompanhou toda a dissertação de mestrado pelo que contém, em alguns casos, soluções que poderão não ser consideradas as mais correctas do ponto de vista das boas prática da programação. Desde que lhe sejam fornecidos parâmetros de entrada coerentes o sistema comporta-se bem. No entanto não está protegido completamente contra "maus" dados de entrada e não é garantido que esteja completamente depurado. O código pode ser utilizado ou modificado SEM QUALQUER TIPO DE GARANTIA por parte do seu autor. É distribuido na esperança de poder ser útil para alguém. A.Gil