Projeto de Mineração de Dados Nota 10,0: Parabéns! Universidade Federal de Campina Grande Centro de Engenharia Elétrica e Informática DSC N° DSC/000/96 Departamento de Sistemas e Computação Detecção de Cola em Provas Escolares Elmano Ramalho Cavalcanti UFCG/CEEI/DSC [email protected] 20 páginas Av. Aprígio Veloso, 882 — Bodocongó — Caixa Postal 10.106 58.109-970 — Campina Grande — PB — Brasil Fone: 333-1929 — e_mail: [email protected] COPIN: Fone / Fax: 333-1698 — e_mail: [email protected] 18 de dezembro 2007 1. O Problema Cola de alunos em provas escolares é um assunto por demais corriqueiro, embora sumamente indesejável. Não há uma definição precisa de cola, mas supõe-se que haja cola toda vez que duas provas tenham um grau suspeito de semelhança. O tamanho da cola é variável: pode ser uma parte de uma questão, toda a questão, algumas questões, ou a prova inteira. Também, a cola pode ser grosseira (um simples copiar-colar), ou sutil (um copiar-colar parcial). O que se quer é um sistema que detecte cola, de qualquer tamanho, ou tipo. 2. A Proposta de Solução do Problema Visto que as provas são documentos (textos não-estruturados), será utilizada a técnica de Mineração de Texto para realizar a classificação dos documentos (provas). Em relação ao tipo de classificação será usada a classificação não supervisionada, pois queremos que as provas mais similares sejam agrupadas em um mesmo grupo (para detecção da cola). Uma possível solução envolveria o uso do Hash Sensitivo Local (LSH) [7] e [8]. A questão principal na classificação seria definir o label que será usado. O ideal seria que o label fosse uma função hash, de forma a deixar as provas mais similares mais próximas. Se provaA.hash = 0.32 e provaB.hash=0.31, as duas provas ficarão próximas na tabela hash, o que indicará que houve uma provável cola. Quanto mais próximo os valores dos hashs maior será a cola. Isso aparentemente resolveria o problema de agrupar as colas por tamanho. Se a distância entre os hashes for maior que certo limiar x então o sistema inferirá que não houve cola. O problema seria então encontrar uma função dessas. Embora a solução acima seja possível, neste trabalho foram utilizadas as técnicas mais conhecidas de mineração de textos: o modelo de vetor de espaços e o cálculo da similaridade por cosseno. 3. O Processo de Mineração Para falar do processo de mineração é necessário refletir em como os dados serão obtidos. No escopo deste projeto, por seu caráter puramente acadêmico, os dados serão obtidos diretamente de fontes eletrônicas ou criados manualmente em arquivos textos comuns, de forma que não será necessário realizar as atividades iniciais de seleção, limpeza e amostragem dos dados. Porém, serão necessárias outras etapas durante a preparação dos dados. As provas usadas neste projeto foram obtidas da seguinte maneira: Foram utilizadas 24 provas com questões subjetivas na área de administração, da disciplina de Marketing da Unidade Acadêmica de Administração e Contabilidade (UAAC) da Universidade Federal de Campina Grande (UFCG); Foram criadas 6 provas fictícias simulando alunos que colaram de alguns dos 24 alunos acima.; A seguir são descritas as atividades que compõem o processo de mineração de texto. 3.1 Preparação de Dados Neste projeto, a preparação de dados é fundamental, pois temos que levar em consideração fatores como pontuação/acentuação das palavras, sinônimos, etc. Além disso, como na vida real um professor encontra cola ao comparar a resposta de uma questão X pelo aluno A com a resposta da mesma questão pelo aluno B, a prova terá que ser fragmentada em quatro partes (número de questões). Decorrente da divisão da prova por questões, será necessário definir um dicionário para cada questão, ou seja, um conjunto de palavras que faz parte do contexto da questão. Seguindo as etapas de mineração de texto mostradas em [1], temos as seguintes fases: 1. CodeMapper: remover a acentuação das palavras. Isso em geral é bom, pois evita que o algoritmo de mineração diferencie palavras que na realidade são as mesmas, por exemplo: em uma prova o aluno escreveu “elétrico” enquanto que outro aluno escreveu “eletrico” (sem o acento). Nesta etapa ocorrerá a troca de ‘ç’ por ‘c’, ‘é’ por ‘e’, etc. Embora isso ajude na maioria dos casos, pode igualar palavras diferentes, no caso de palavras que se diferenciam justamente pelo acento (ex: pelo/pélo/pêlo). Porém, como são poucos esses casos, acredito que esse processo, quando necessário, ajude bem mais do que atrapalhe. A etapa CodeMapper foi realizada utilizando-se a API Java [12] e a versão 3.3.1 da ferramenta Eclipse [13]. A seguir temos o mapeamento de acentos feito nas provas, onde o primeiro vetor contém todos os acentos possíveis na língua portuguesa e o segundo contém o resultado de como deve ficar cada caractere. Antes: {"á","é","í","ó","ú","ç","ã","õ","à","ü","ï","â","ê","î","ô","û"}; Depois: {"a","e","i","o","u","c","a","o","a","u","i","a","e","i","o","u"}; Considerei que as próximas etapas mostradas no tutorial da ferramenta Rapidminer [14] fazem parte da Transformação de Dados, mostradas a seguir. Todas as etapas a seguir foram feitas utilizando o Rapidminer. 3.2 Transformação de Dados 2. Tokenizer: Separa todo o texto em palavras, podendo desconsiderar números. Pode ser criado n-grams [5] a partir dos tokens. Nesta etapa pode ser interessante filtrar os tokens com poucos caracteres (removendo assim preposições, artigos, conjunções, etc); 3. WorldFilter: Filtrar a lista criada na etapa anterior, através de uma lista de stopwords. Stopwords são palavras comuns de uma língua como artigos, preposições, conjunções ou palavras bastante comuns, e que geralmente são desconsideradas nos processos de mineração de texto visto que não fornecem significado a um documento. Neste projeto foi utilizada a lista de stopwords da língua portuguesa disponível no projeto Snowball [11]. Foram feitos alguns acréscimos de palavras, de acordo com o domínio das questões da prova. 4. Stemmer/Reducer: Quando um aluno está colando uma prova, para tentar mascarar a cola, ele poderá trocar as palavras por derivações ou sinônimos, dessa forma, antes de começar a garimpagem dos dados é preciso mapear todos os sinônimos de uma palavra para uma única palavra-base. Além das palavras sinônimas há o caso das palavras de mesma família (radical). Exemplo: o aluno A escreve “...processa-se o produto para então...” enquanto que o aluno B olha a prova de A e escreve: “...o produto é processado para então...”. Vemos que as palavras processa-se e processado possuem o mesmo radical ‘process’. Para esta etapa foi utilizado o algoritmo de stemming do projeto Snowball. A WordNet [16] é uma famosa base de dados léxica da língua inglesa. Foi realizada uma busca por uma extensão para a língua portuguesa, onde foi encontrado a WordNet.PT [10] que infelizmente estava com problemas na busca. Sendo assim, não foi implementado nenhum mapeamento de sinônimos. Esse é um dos fatores que pode comprometer com a qualidade dos resultados. 5. Criação do vetor: Após os tokens serem contados é criado um vetor que indica a presença dos termos na prova (vetor-binário) ou a freqüência do termo. Como a dimensão de uma questão é pequena (poucos parágrafos) provavelmente não haverá necessidade de utilizar técnicas de compressão de vetores. O modo usado para criação do vetor foi o term frequency–inverse document frequency (TFIDF) [15]. O tamanho do vetor ficou na faixa de 500 colunas. A fórmula do TFIDF é dada abaixo: Onde: 1. fij = o número de ocorrência do termo i no documento j; 2. fdj = o número total de ocorrências no documento j; 3. fti = o número total de documentos em que o termo i aparece pelo menos uma vez. O resultado acima foi normalizado para o tamanho unitário Euclidiano. Não foi utilizado pruning (podagem) pois verificou-se que sua utilização piorava os resultados do cálculo de similaridade. A figura abaixo mostra a cadeia de processos realizada no RapidMiner. Figura 1 – cadeia do processo de mineração. O TokenLengthFilter foi usado para filtras os tokens com menos de 3 caracteres. Após a seqüência de transformação indicada pelo retângulo amarelo da figura acima, temos a etapa de garimpagem, definida pelo operador ExampleSet2Similarity, onde será calculada a similaridade entre as provas. 3.3 Garimpagem A garimpagem ou mineração utilizada foi a classificação nãosupervisionada. Em mineração de texto isso pode ser feito usando-se de similaridade, modelagem estatística ou por regras de decisão. O modelo escolhido foi o de similaridade. Existem diversos algoritmos de similaridade de strings, baseados ou não em vetores de espaço. Alguns exemplos de bibliotecas de código livre contendo alguns algoritmos de métrica de similaridade são o Simmetrics [3] e o SecondString [4]. No entanto, visto que o Rapidminer já possui muitas dessas funções integradas ao software, não foi necessário utilizar outra ferramenta. A função de similaridade escolhida foi a do co-seno, a qual retorna um valor real no intervalo [0,1] para cada par de provas, onde zero significa ausência total de semelhança e um similaridade máxima. Como foram elaboradas trinta provas, temos que a tabela resultado da aplicação da similaridade-cosseno contém 435 linhas, que nada mais é que a combinação de 30 dois a dois, que é igual a 30*29/2. 3.4 Análise e Assimilação Como visto no início do capítulo 3, foram elaboradas seis provas contendo colas de tamanhos diferentes: pequena, razoável e grande. A tabela abaixo mostra o mapeamento de cola criado. Aluno 25 Colou pouco de aluno02/questao2 26 27 28 29 30 Colou razoável de aluno01/questao1 aluno01/questao1 aluno05/questao4 aluno02/questao4 Colou muito de aluno01/questao1 aluno05_questao2 aluno07_questoes3,4 aluno03/questao2 aluno02/todas aluno01/todas Tabela 1 – quadro de colas. A partir destes dados, pôde-se avaliar o desempenho do processo de mineração, verificando se este detectava as colas criadas acima. A seguir mostraremos os resultados da similaridade e agrupamento para cada questão. Questão 1 A tabela abaixo mostra as quinze maiores prováveis colas feitas na questão1. As maiores colas detectadas ocorreram entre as provas dos alunos 01 e 25, 01 e 30, 02 e 29. Segunda a Tabela 1, ocorreu grande cola justamente entre as duas primeiras duplas da tabela. A terceira linha (alunos 02 e 29) ocorreu na realidade uma cola razoável, porém o algoritmo o colocou com similaridade próxima a de cola grande. Em geral, a princípio vemos que a mineração teve sucesso pois detectou as colas criadas manualmente. Prova A 01 01 02 01 25 26 25 01 25 13 26 27 11 22 13 Prova B 25 30 29 26 30 30 26 27 27 08 27 30 17 6 28 Similaridade 0,789 0,749 0,722 0,666 0,660 0,552 0,541 0,329 0,306 0,286 0,269 0,235 0,190 0,165 0,152 Tabela 2 – similaridade na questão 1. Poderíamos estimar da seguinte maneira os valores para os quais se consideraria uma cola grande, razoável (média), ou pequena: Cola grande: similaridade maior ou igual que 0.70; Cola razoável: similaridade maior ou igual a 0.40 e menor que 0.70; Cola pequena: similaridade maior ou igual a 0.25 e menor que 0.40; Ausência de cola: similaridade menor que 0.25. Usando a definição acima, verificaremos o índice de acerto na detecção de colas na primeira questão da prova. Uma visão interessante que a ferramente RapidMiner disponibiliza é o GraphView, onde cada aluno é um nodo de um grafo, e as arestas ligam os alunos cujas questões estão mais similares, indicando o valor da similaridade no meio da aresta. É possível partir de apenas uma aresta até chegar a conecar todas as arestas possíveis. As arestas surgem da maior similaridade até a menor. Dessa forma, para encontrar-mos onde estão as colas basta avançarmos no número de arestas até que o menor valor seja maior ou igual a 0.25 (limiar entre cola pequena e ausência de cola). Abaixo temos a visão do grafo circular mostrando a incidência das colas grandes e razoáveis (similaridade >= 0.40). Figura 2 – visão do grafo circular da questão 1. Para as próximas questões, serão apresentados a tabela de similaridade e o grafo circular de similaridade e no final será mostrada uma tabela onde poderemos perceber a acurácia que a mineração teve na detecção de cola em todas questões. Questão 2 Prova A Prova B Similaridade 26 05 0,725 27 03 0,714 01 30 0,710 02 29 0,511 02 25 0,286 25 29 0,279 10 12 0,203 11 18 0,173 11 25 0,171 11 29 0,154 13 16 0,146 Tabela 3 – similaridade na questão 2. Figura 3 – visão do grafo circular da questão 2. Questão 3 Prova A 25 01 25 26 02 27 19 22 11 01 14 11 Prova B 26 30 07 07 29 05 22 30 15 22 18 5 Similaridade 0,821 0,801 0,712 0,674 0,554 0,230 0,216 0,184 0,168 0,165 0,156 0,144 Tabela 4 – similaridade na questão 3. Figura 4 – visão do grafo circular da questão 3. Questão 4 Prova A 01 26 02 27 02 28 21 13 08 17 Prova B 30 07 29 29 27 05 05 20 09 03 Similaridade 0,878 0,856 0,497 0,404 0,323 0,290 0,220 0,181 0,152 0,150 Tabela 5 – similaridade na questão 4. Figura 5 – visão do grafo circular da questão 4. Além do grafo em círculo, existe umo tipo de vizualição de similaridade, chamada de ISOM, que agrupa as provas similares deixando-as próximas uma das outras. Abaixo está um exemplo equivalente ao da Figura 5: Figura 6 – Clustering de cola em provas. 4. Detector de colas em provas (oráculo) O programa Preditor, ou Oráculo, tem por objetivo dizer, dado duas provas, o tipo de cola encontrada (grande, razoável, pequena, nenhuma). Além disso, deve ser capaz de agrupar um conjunto de provas em relação ao tipo de cola existente entre elas. A tabela abaixo mostra o conjunto de previsão utilizado para calcular a acurácia do Oráculo. As duas primeiras colunas indicam os alunos envolvidos, a terceira indica o número da questão da prova, a quarta mostra a similaridade entre a mesma questão do AlunoA e do AlunoB, a quinta defini o tipo de cola que o sistema acusa, a sexta contém o tipo verdadeiro de cola (segundo análise humana), e a sétima e última coluna indica se o algoritmo acertou ou não na inferência. A tabela está ordenada primeiramente pela questão da prova, e em seguida em ordem decrescente de grau de similaridade. AlunoA 1 1 2 1 25 26 25 1 25 13 26 27 1 26 27 2 2 25 10 25 1 25 26 2 27 19 1 26 2 27 2 28 21 AlunoB 30 25 29 26 30 30 26 27 27 8 27 30 30 5 3 29 25 29 12 26 30 7 7 29 5 22 30 7 29 29 27 5 5 Questão Similaridade Tipo inferido 1 0,75 grande 1 0,79 grande 1 0,72 grande 1 0,67 razoável 1 0,66 razoável 1 0,55 razoável 1 0,54 razoável 1 0,33 pequena 1 0,31 pequena 1 0,29 pequena 1 0,27 pequena 1 0,23 nenhuma 2 0,71 grande 2 0,72 grande 2 0,71 grande 2 0,51 razoável 2 0,29 pequena 2 0,28 pequena 2 0,2 nenhuma 3 0,82 grande 3 0,8 grande 3 0,71 grande 3 0,67 razoável 3 0,55 razoável 3 0,23 nenhuma 3 0,22 nenhuma 4 0,88 grande 4 0,86 grande 4 0,5 razoável 4 0,4 razoável 4 0,32 pequena 4 0,29 pequena 4 0,22 nenhuma Tipo real grande grande razoável razoável grande razoável razoável pequena razoável nenhuma pequena pequena grande grande grande razoável pequena razoável nenhuma grande grande grande grande razoável nenhuma nenhuma grande grande razoável nenhuma razoável pequena nenhuma Acertou? sim sim não sim não sim sim sim não não sim não sim sim sim sim sim não sim sim sim sim não sim sim sim sim sim sim não não sim sim Tabela 6 – quadro de verificação dos testes A partir da tabela acima foi possível construir a Matriz de Confusão e o quadro de acurácia de testes mostrados a seguir. Matriz de confusão grande razoável pequena grande 10 2 0 razoável 1 6 3 pequena 0 0 4 nenhuma 0 1 1 Total 11 nenhuma 0 0 1 4 9 8 5 Tabela 7 – Matriz de confusão. Total 12 10 5 6 33 Total de acertos 24 Total de erros 9 Acurária 72,73% Tabela 8 – Acurácia de testes. A partir da Matriz de Confusão (MC), vamos calcular o índice Kappa, dado pela fórmula abaixo: q1 - q 2 κ̂ = 1 - q2 c q1 = åx i =1 ii n c q2 = åx i =1 i+ x+ i n2 Onde a primeira fórmula é o índice Kappa, a segunda a exatidão total e a terceira a exatidão total considerando que a verdade (1a coluna da MC) e a classificação (1a linha da MC) são independentes. Fazendo os cálculos chegamos ao resultado de que o índice Kappa foi de 0,63. De acordo com a interpretação deste índice mostrada em [17], temos que o índice situa-se na categoria “Substantial agreement” (que vai de 0,6 a 0,8), a segunda melhor possível, o que sugere uma boa qualidade de inferêcia na detecção de colas. Uma justificativa para alguns dos erros de inferência apresentados pode ser a ausência do uso de algoritmos de mapeamento de sinônimos de palavras e locuções gramaticais, de forma que provas similares semanticamente e não lexicamente não poderam ser captadas pela mineração utilizada. 5. Conclusões O projeto descrito neste documento consistiu em propor uma solução para o problema de detecção de colas em provas escolares através de mineração de dados. Na implementação da solução foi utilizada a abordagem de mineração de texto e o paradigma da classificação não-supervisionada utilizando-se o modelo de vetor de espaços [18]. Utilizou-se o RapidMiner [14], software open-source para descoberta de conhecimento, aprendizagem de máquina e mineração de dados, nas etapas de preparação, transformação, garimpagem e análise dos resultados. Foi elaborado um conjunto predição para avaliar a acurácia do Detector de Colas (Oráculo). O resultado indicou uma acurácia de 73%, e índice Kappa de 0,63, o que aparenta um bom resultado [17]. Bibliografia [1] Adaptive Duplicate Detection Using Learnable String Similarity Measures Mikhail Bilenko and Raymond J. Mooney. Proceedings of the Ninth ACM SIGKDD International Conference on Knowledge Discovery and Data Mining (KDD-2003), pp. 39-48, Washington DC, August 2003. [2] Learnable Similarity Functions and Their Applications to Clustering and Record Linkage. Mikhail Bilenko. Proceedings of the Ninth AAAI/SIGART Doctoral Consortium, pp. 981-982, San Jose, CA, July 2004. [3] CHAPMAN, Sam. SimMetrics: a Java \& C\# .NET library of Similarity Metrics. 2004. http://sourceforge.net/projects/simmetrics/ [4] COHEN W. William; RAVIKUMAR Pradeep; FIENBERG Stephen. SecondString: Open source Java-based Package of Approximate StringMatching. 2003. Disponível em: http://secondstring.sourceforge.net/ [5] http://en.wikipedia.org/wiki/N-gram [6] Tutorial Rapidminer-text 4.0, disponível em: http://ufpr.dl.sourceforge.net/sourceforge/yale/rapidminer-text-4.0tutorial.pdf [7] CS276: Information Retrieval and Web Mining. Lecture 19 - Text Mining and LSH. Stanford University. Disponível em: www.stanford.edu/class/cs276/handouts/lecture19.ppt [8] http://en.wikipedia.org/wiki/LSH [9] http://en.wikipedia.org/wiki/Near_Duplicate_Algorithms [10] WordNet.PT - Rede Léxico-Conceptual do Português, disponível em: http://www.instituto-camoes.pt:8080/wordnet [11] http://snowball.tartarus.org/ [12] http://java.sun.com/j2se/1.5.0/docs/api/ [13] http://www.eclipse.org/ [14] Rapidminer - Open-Source Data Mining with the Java Software RapidMiner / YALE. Disponível em: http://rapid-i.com/ [15] http://en.wikipedia.org/wiki/TFIDF [16] WordNet - a lexical database for the English language. Cognitive Science Laboratory, Princeton University, 2006. [17] Landis, J. R. and Koch, G. G. (1977) "The measurement of observer agreement for categorical data" in Biometrics. Vol. 33, pp. 159--174 [18] G. Salton, A. Wong, and C. S. Yang (1975), "A Vector Space Model for Automatic Indexing," Communications of the ACM, vol. 18, nr. 11, pages 613–620. Apêndice A A.1 Os Dados As vinte e quatro provas reais usadas no projeto estão no formato .doc do Microsof Word e podem ser vistas na pasta 1_pre- processamento/1_documentos_originais. Cada prova foi nomeada com o email real do aluno que a fez. As seis provas fictícias restantes foram criadas já segmentadas, e portanto não estão na pasta acima. A lista de colas criadas manualmente estão descritas no arquivo tabela_das_colas.html. A lista de stopwords está no arquivo portuguese_stopword_list.txt, na pasta 1_pre-processamento. Os dicionários para cada questão estão na pasta 1_pre- processamento/dicionarios. O arquivo de descrição do processo de mineração do RapidMiner é o DetectorColaRapidMiner.xml A.2 Os Dados Preparados Os dados originais foram transformados em arquivos xml para possível utilização em outras ferramentas. Estes podem ser vistos na pasta 1_pre-processamento/2_documentos_xml. As provas segmentadas por questões estão disponíveis na pasta 1_pre-processamento/3_documentos_segmentados. As provas com o texto em letras minúsculas e sem acentuação estão na pasta 1_pre-processamento/4_documentos_pre-processados. A.3 Os Dados Transformados As questões após a vetorização estão na pasta 2_transformacao. Os arquivos .aml são de descrição dos atributos (colunas do vetor), enquanto que os arquivos .dat são os vetores. Uma parte das tabelas de similaridade por cosseno das quatro questões estão na pasta 3_resultado, nos arquivos .txt. Cada linha possui três colunas, onde as duas primeiras são duas provas e a terceira o grau de similaridade entre elas. As imagens relativas ao clustering estão também na pasta 3_resultado. A.4 “Logs” das Execuções Os logs foram criados pelo RapidMiner após a execução, para cada questão, da cadeia de processos (preparação+transformação+mineração) no RapidMiner. Eles estão na pasta logs. A.5. [O código fonte do programa Oráculo] Devido a alguns problemas surgidos durante o período do projeto, não foi possível desenvolver um programa oráculo específico para detecção de colas em provas. Porém, foi possível criar um conjunto predição e calcular a acurácia e índice Kappa do oráculo, mesmo sem tê-lo codificado, pois este apenas implementaria o modelo definido no processo de mineração. A.6. [O instalador do programa Oráculo] Ver item acima. Porém, se você quiser comprovar a acurácia do Oráculo mostrado neste trabalho, faça o seguinte: 1. Baixe a ferramenta RapidMiner no site: http://sourceforge.net/projects/yale; 2. Baixe o plugin de mineração de texto do RapidMiner (mesmo site acima); 3. Com o RapidMiner aberto abra o arquivo DetectorColaRapidMiner.xml; 4. Configure os parâmetros de entrada dos operadores ListaQuestao1, ListaQuestao2, ListaQuestao3 e ListaQuestao4, indicando o diretório onde se encontram os arquivos que contém as respostas dos alunos para cada questão; 5. Se quiser, altere o modo de criação do vetor (binário, TFIDF, etc) e a função de similaridade (existem várias); 6. Execute o processo; 7. Após o término da execução aparecerá a janela para análise do resultado. Para cada questão, haverá uma aba mostrando o ExampleSet, que é a tabela com os vetores de espaço, e uma tabela com a similaridade entre cada par de aluno/questão. Ordenando a similaridade em ordem descrescente você então poderá saber o que o oráculo iria inferir a respeito da cola. A partir daí, existem quatro possivilidades: Se similaridade > 0.70 o oráculo consideraria que houve uma cola grande entre o par aluno/questão; Se similaridade entre 0.40 e 0.70, o oráculo consideraria que houve uma cola razoável; Se similaridade entre 0.25 e 0.40 o oráculo acusaria uma cola pequena; Caso contrário o oráculo diria que não houve cola nessa questão; Elmano Ramalho Cavalcanti