FIG. 4.1.2 – Interface após escolha do corpus. O usuário agora deve informar ao programa os parâmetros de configuração do corpus, ação essa que pode ser executada ao clicar no botão “...”.
FIG. 4.1.3 – Botão que permite escolha de configuração. Ao clicar no botão, o programa exibe uma janela pop-up, com um pequeno formulário de configuração dos parâmetros. No caso do formulário do CorpusMatriz que é aquele que se apresenta abaixo, há 4 campos a serem definidos: separador que define o caractere que é usado no arquivo para separar os atributos relacionados; dividir exemplos que coloca cada atributo em um conjunto de exemplo diferente se setado; atributos automáticos que, com base nos metadados do arquivo a ser selecionado, definirá automaticamente o número de atributos que há no corpus e o nome de cada atributo; se atributos automáticos não for setado será habilitado o campo Nº atributos na qual se deve definir o número de atributos que há no arquivo e o nome de cada atributo.
FIG. 4.1.4 – Pop-up com o formulário de configuração. Ao executar tais ações preliminares, é hora do usuário carregar o arquivo para a realização do experimento. Para isso deve-se clicar na pasta, e com isso uma caixa de diálogos em formato padrão do sistema operacional é exibida. Após a exibição da nova janela, o usuário seleciona o arquivo desejado e o programa carrega o arquivo previamente selecionado.
FIG. 4.1.5 – Botão para abertura de arquivo. Após a abertura do arquivo, o programa exibirá algumas características do corpus; nome do arquivo, quantidade de instâncias no arquivo, ou seja, quantidade de exemplos, quantidade de atributos e, mais detalhadamente, o nome dos atributos presentes.
FIG. 4.1.6 – Interface após carregamento do arquivo. Caso o usuário deseje exibir informações mais detalhadas acerca dos atributos presentes no corpus, é suficiente que o mesmo selecione algum atributo exibido na tabela Atributos. Ao selecionar um atributo são exibidas informações estatísticas a respeito desse atributo na group box Atributo selecionado: nome do atributo, tipo do atributo (nominal ou numérico), quantidade total de dados distintos daquele atributo, quantidade de dados que ocorrem uma única vez no atributo e lista de dados com total de ocorrências de cada dado no arquivo (se numérico também é exibido média dos valores, desvio padrão, máximo e mínimo).
FIG. 4.1.7 – Seleção de um atributo. Feita toda a parte de processamento inicial, o usuário agora já pode começar a configurar todos os métodos e parâmetros de validação, para de fato executar o experimento desejado. O primeiro passo é clicar na aba Validação.
FIG. 4.1.8 – Interface para a aba de validação. Nos mesmos moldes da fase de pré-processamento, o usuário agora deve selecionar o treinador desejado, procedendo de maneira semelhante à escolha do corpus (seleção de treinador via combo box, habilitação do botão de configuração e preenchimento de configurações na pop-up que será exibida ao clicar-se em “...”). Atualmente estão disponíveis os treinadores MaisProvável, HMM e TBL. Se o usuário não tiver carregado um corpus na aba anterior o combo box do treinador não estará disponível, pois este corpus será utilizado no experimento de validação.
FIG. 4.1.11 – Formulário de configuração de parâmetros. No caso da escolha do treinador a pop-up de parâmetros é executada pelo menos uma vez, automaticamente. Assim como na pop-up do corpus, esta depende do tipo de treinador selecionado. Feita a escolha do treinador, o usuário agora deve escolher o método de validação (caso seja necessário, deve-se ajustar alguns valores da validação, como no caso do KDobras ou então realizar uma nova abertura de arquivo, no caso do validador de teste, para mais detalhes vide seção 3.1) e ajustar alguns parâmetros do experimento (método de avaliação e atributo que será usado para treino).
FIG. 4.1.12 – Exemplo de escolha de método de validação, avaliador e atributo de treino. Tendo o usuário preenchido todas as configurações, a realização do experimento é feita simplesmente clicando-se no botão “Começar” que acaba de ser habilitado. Após algum tempo de processamento, o programa exibe os resultados na tabela “Resultados”.
FIG. 4.1.13 – Resultado do experimento. O resultado apresentado é o número do experimento, tempo de duração em segundos, porcentagem de acerto de acordo com o método de avaliação e a média de resultados do experimento. Caso o usuário deseje pode realizar outros experimentos de validação ajustando os dados para tal, conforme fizera para realizar este primeiro experimento. Os resultados dos novos experimentos serão adicionados embaixo do anterior na tabela de resultados sendo indicado pela cor verde.
FIG. 4.1.14 – Interface exibe parâmetros salvos do experimento. Após realizar inúmeros experimentos o usuário pode escolher qual deles apresentou um melhor resultado e assim exportar as configurações que foram usadas no mesmo com o objetivo de serem reusadas. Para isso basta selecionar o experimento com o botão direito do mouse e escolher a opção “Exportar Dados”, podendo ser exportado para a aba de Validação ou para aba de Treinamento (será abordado mais adiante). Após exportar para a validação o treinador do experimento, o método de validação usado, o avaliador e o atributo de treino são recuperados ocorrendo o preenchimento automático dos campos citados. Também existe a possiblidade do usuário poder limpar a lista de resultados de experimentos pressionando o botão “Limpar”.
FIG. 4.1.15 – Interface para a aba de treinamento/classificação. Outra possibilidade da interface além da validação é realizar o treinamento e a classificação separadamente (3ª aba). No caso de treinamento o usuário deve informar o tipo de treinador e os seus parâmetros e o atributo de treino do corpus, de forma idêntica à validação, ou então definir esses dados por meio da exportação de experimento para o treinamento. O treinamento e a classificação somente serão habilitados após o carregamento do corpus na 1ª aba.
FIG. 4.1.16 – Interface após a importação dos dados. Feitas as operações iniciais, basta o usuário clicar no botão “Treinar”. Caso deseje, é possível fazer o armazenamento do conhecimento adquirido no treinamento, utilizando-se o botão de salvar que será habilitado após a realização do treinamento. O usuário determina o arquivo em que será gravado o conhecimento por meio de uma caixa de diálogos padrão do sistema operacional.
FIG. 4.1.17 – Interface após o treinamento. Caso o usuário deseje realizar uma classificação, o procedimento a ser realizado também é bastante simples. Deve-se escolher o tipo de classificador (MaisProvável, HMM e TBL), carregar o arquivo de conhecimento (obtido em algum treinamento) e atribuir um nome ao novo atributo, caso o usuário queira. Feito isso, basta clicar no botão “Classificar”, e, opcionalmente, pode-se também gravar o corpus gerado de maneira semelhante à descrita para o treinamento.
4.2 MANUTENÇÃO E EVOLUÇÃO DA INTERFACE Agora são apresentados alguns aspectos importantes para manutenção e evolução do projeto. Esta seção visa principalmente facilitar o acoplamento de novas instâncias desenvolvidas para o FAMA à interface gráfica. Para adicionar uma nova instância da classe Corpus à interface deve-se primeiro chamar o método addItem do objeto comboBox_corpus (correspondente ao comboBox de Corpus da interface), passando uma string com o nome da nova instância criada. Tudo isso pode ser feito no construtor da classe de controle Janela. Conforme o trecho de código a seguir:
No método habilitarBotao da classe Janela deve-se criar um índice dependente da escolha do usuário que aloque dinamicamente (dê new) o tipo de Corpus a ser adicionado. Conforme o código a seguir:
No caso, o próximo item adicionado seria o de valor 2 no index. Deve-se criar uma nova classe filha da nova instância de Corpus, esta classe será a responsável por construir a estrutura da interface gráfica da janela de parâmetros (pop-up) da nova instância, que será aberta quando o usuário selecionar o botão de configuração do Corpus, e ela deve possuir includes de bibliotecas do Qt Creator correspondentes às funções que utilizará para construir a interface. Esta classe deve implementar essa rotina no método virtual herdado da Corpus: Corpus* construirJanela( void *popUp ). É recomendado que o nome da classe seja idêntico a classe pai adicionado do sufixo UI (User Interface). Segue o cabeçalho da CorpusMatrizUI de exemplo:
Observa-se que a CorpusMatrizUI descende da classe CorpusMatriz e ela implementa o construtor e dois métodos. O construtor apenas chama o construtor da CorpusMatriz, o método construirJanela é o objetivo da classe e, neste caso, o método clone também tem que ser reimplementado, pois tem que retornar uma instância da CorpusMatrizUI e não mais da CorpusMatriz. No método definirParametros da classe Janela será chamada a função construirJanela da classe Corpus passando como parâmetro um ponteiro da classe Param (nada a ser alterado no código). A pop-up é representada pela classe Param (derivada da Qdialog) que possui um objeto da classe QTableView. Esse objeto do Qt Creator recebe um modelo e com base nesse
modelo apresenta diferentes visões na interface, a partir disso é possível generalizar a pop-up com os parâmetros de qualquer tipo de classe. A estrutura de Param pode ser observada no diagrama UML no fim desta seção. Então o que deve-se fazer no método construirJanela é primeiramente instanciar o modelo, representado no caso pela classe ModeloParam, a seguir deve-se definir os atributos do modelo por meio de seus métodos inserirDados(). A estrutura de dados interna ao ModeloParam é uma matriz com 2 colunas e um número qualquer de linhas, a 1ª coluna é sempre uma string e representa o título do campo que o usuário deverá preencher na 2ª coluna correspondente. Já a 2ª coluna aceita string ou QWidget, que é uma classe do Qt Creator que representa objetos da interface gráfica como ComboBox, CheckBox, PushButton entre outros. Deve-se primeiro definir todas as strings que o modelo possuirá, para isso deve-se chamar o método inserirDados( int row, int column, string v ), especificando qual a linha (row) e coluna (column) que a string (v) será inserida para aparecer na pop-up. Em seguida deve-se avisar à classe Param qual modelo ela receberá, para isso basta chamar o método ajustarModelo( QAbstractItemModel m ) passando como parâmetro o ModeloParam que foi instanciado. Por último deve-se inserir as QWidgets chamando o método inserirDados( int row, int column, Param &ct, QWidget *x ), especificando qual linha (row) e coluna (column) que a QWidget (x) será inserida, também deve-se informar em relação a qual pop-up (Param) que a inserção ocorrerá. Terminada essa fase, deve-se inserir os eventos que ocorrerão na pop-up e então, chamar o método iniciarDialog() da Param. A partir desse momento a pop-up aparecerá na tela do usuário. È imprescindível que a chamada aos métodos respeite a ordem aqui estabelecida. Para recuperar os dados que o usuário preencheu na pop-up basta chamar os métodos pegarString e pegarWidget da classe Param, ou então acessar diretamente o QWidget criado. O trecho de código seguinte exemplifica a criação da janela pelo método construirJanela da classe CorpusMatrizUI:
Este código gera a pop-up da figura 4.1.4. Para adicionar uma nova instância de Treinador deve-se proceder de forma semelhante à adição de um Corpus. Deve-se primeiramente executar o método addItem dos comboBox_metodo e comboBox_metodoTreinador no construtor da classe Janela, passando uma string com o nome do novo método.