• Nenhum resultado encontrado

3.4 IMPLEMENTAÇÃO

3.4.1 Técnicas e ferramentas utilizadas

A linguagem escolhida para o desenvolvimento da aplicação é o PHP. É especialmente adequada para o desenvolvimento web e pode ser embutida dentro do código HTML (THE PHP GROUP, 2015). Para maior produtividade e manutenibilidade, a aplicação foi desenvolvido com auxílio do framework CakePHP.

Como ferramenta IDE (Integrated Development Environment) foi utilizado o software Php Storm. Conta com editor inteligente, que auxilia na refatoração, formatação e auto- completagem do código, além de ser compatível com as principais ferramentas e frameworks do mercado (JETBRAINS, 2015).

Como SGBD (Sistema Gerenciador de Banco de Dados), a opção foi o MySQL. É o SGBD open-source mais usado no mundo, entregando alta performance e escalabilidade tanto em pequenos websites como em grandes aplicações empresariais (ORACLE, 2015).

A técnica do RBC necessita de cálculos para determinar similaridades entre os elementos. No Quadro 6, demonstra-se o trecho de código responsável por calcular a

42

similaridade local entre dois valores de atributos do RBC. Além disso, armazena todos os cálculos efetuados para posteriormente apresentar a memória de cálculo.

Quadro 6 - Função de cálculo de similaridade local 94 protected function

calculateTextualAttributeSimilarityLevel($attrA, $attrB, $weight) 95 {

96 $historyTemp = array(); 97

98 // Separando a string nos "espaços", transformado-a em array 99 $wordsA = preg_split('/[\s]+/', $attrA);

100 $wordsB = preg_split('/[\s]+/', $attrB); 101

102 // Obtendo o número de palavras, para efetuar a divisão posteriormente

103 $wordCount = max(count($wordsA), count($wordsB)); 104 if($wordCount == 0) {

105 throw new Exception(__('Contagem de palavras não pode ser "zero"'));

106 } 107

108 // Inicializando nível de similaridade com "zero" 109 $localSimilarityLevel = 0;

110

111 foreach($wordsA as $wordA) {

112 // Iteração para comparar palavra por palavra 113 foreach($wordsB as $wordB) { 114 $found = false; 115 116 if($wordA == $wordB) { 117 // Correspondência exata 118 $localSimilarityLevel++; 119 $historyTemp[] = [ 120 'wordA' => $wordA, 121 'wordB' => $wordB, 122 'similarity_level' => 1, 123 'weight' => $weight, 124 'wordCount' => $wordCount,

125 'score' => (1 * $weight) / $wordCount 126

127 ];

128 $found = true; 129 } else {

130 // Caso não haja correspondência exata, vamos tentar alguma similaridade

131 // pelo dicionário de palavras

132 $similarWords = $this->getSimilarWords($wordA); 133 foreach($similarWords as $similarWord) { 134 if($similarWord->similar == $wordB || $similarWord->word == $wordB) { 135 $localSimilarityLevel += $similarWord- >similarity_level; 136 $historyTemp[] = [ 137 'wordA' => $wordA, 138 'wordB' => $similarWord->similar, 139 'similarity_level' => $similarWord- >similarity_level, 140 'weight' => $weight, 141 'wordCount' => $wordCount, 142 'score' => ($similarWord-

43

>similarity_level * $weight) / $wordCount 143 ]; 144 $found = true; 145 146 break; 147 } 148 } 149 } 150 151 if($found == false) { 152 $historyTemp[] = [ 153 'wordA' => $wordA, 154 'wordB' => $wordB, 155 'similarity_level' => 0, 156 'weight' => $weight, 157 'wordCount' => $wordCount, 158 'score' => 0 159 ]; 160 } 161 162 } 163 164 } 165 166 if(count($historyTemp) > 0) 167 $this->history[] = $historyTemp; 168 169

170 return (float) $localSimilarityLevel / $wordCount; 171 }

O método calculateTextualAttributeSimilarityLevel recebe como parâmetros o valor do primeiro e segundo atributos, para efetuar a comparação e calcular a similaridade e o fator de peso do atributo que está sendo calculado, para fins de histórico. Até a linha 109, o método apenas separa as duas strings dos valores dos dois atributos em espaços, convertendo- os em um array de palavras. Quando ambos os valores estão convertidos para array é feito uma contagem do número de palavras contidas para normalização do valor de similaridade ao final do cálculo.

Na linha 111, o método inicia um loop que irá percorrer todas as palavras do primeiro

array, comparando-as com cada palavra do segundo array. Na linha 116, é verificado se as

duas palavras são exatamente iguais. Neste caso, apenas é acrescentado o valor 1 na variável de controle, indicando similaridade total. Além disso, são adicionadas as duas palavras que foram comparadas em um terceiro array que é responsável por armazenar a memória de cálculo.

Se as duas palavras não forem exatamente iguais, o método fará outra tentativa para encontrar algum nível de similaridade entre as duas palavras antes de descartá-las completamente. Entre as linhas 132 e 135 o método obtém do dicionário uma lista de palavras

44

similares ao primeiro valor, e em um novo loop compara todas as entradas do dicionário com o segundo valor. Se alguma entrada do dicionário combinar com o segundo valor, o valor de similaridade é incrementado de acordo com o valor cadastrado no dicionário, que pode ser 0,9 até 0,1 e é feita uma nova entrada no array da memória de cálculo. As palavras no dicionário que contém similaridade igual a 1 são substituídas diretamente no texto original, em um momento anterior no motor do RBC. Para exemplificar, as palavras “computador” e “notebook” teriam valor de similaridade zero. Pode-se cadastrar no dicionário uma entrada para estas duas palavras, atribuindo um nível de similaridade entre elas, de 0 até 1. Neste caso o sistema irá considerar o valor cadastrado ao invés de zero no momento da comparação, permitindo atribuir um certo nível de similaridade entre palavras parecidas.

Se também não foi possível encontrar alguma similaridade entre as palavras com as entradas do dicionário, o sistema apenas grava na memória de cálculo a similaridade 0.

No Quadro 7 é apresentado o método de cálculo do nível de similaridade global entre dois casos, recebendo como parâmetros os dois casos a serem comparados. Na linha 52, o método busca no banco de dados os fatores de peso de todos os índices do RBC. A partir da linha 61, o método pega cada atributo do primeiro caso e executa a função de similaridade local contra o atributo correspondente no segundo caso, incrementando o valor de uma variável de controle a cada chamada ao método de similaridade local.

Após todos os valores de similaridade local tiverem sido calculados e devidamente incrementados a variável de controle, na linha 81 o método faz um somatório de todos os fatores de peso dos atributos. Este somatório serve para normalizar o valor de similaridade. Por fim, é retornado o valor da variável de controle dividido pelo somatório dos fatores de peso, que é o valor de similaridade global. Este método implementa a técnica do Vizinho Mais Próximo (Nearest neighbour) para cálculo da similaridade global entre dois casos.

Quadro 7 - Função de cálculo de similaridade global

50 public function getGlobalSimilarityLevel($caseA, $caseB) 51 {

52 $weights = $this->getAttributesWeights(); 53

54 // Inicializando nível de similaridade global com "zero" 55 $globalSimilarityLevel = 0; 56 57 // Atributo "equipamento" 58 $globalSimilarityLevel += $this- >calculateTextualAttributeSimilarityLevel($caseA->equipment, 59 $caseB->equipment, $weights->equipment_weight) * $weights->equipment_weight; 60 61 // Atributo "tipo" 62 $globalSimilarityLevel += $this- >calculateTextualAttributeSimilarityLevel($caseA->type,

45

63 $caseB->type, $weights->type_weight) * $weights- >type_weight;

64

65 // Atributo "categoria"

66 $globalSimilarityLevel += $this-

>calculateTextualAttributeSimilarityLevel($caseA->category,

67 $caseB->category, $weights->category_weight) * $weights- >category_weight; 68 69 // Atributo "subcategoria" 70 $globalSimilarityLevel += $this- >calculateTextualAttributeSimilarityLevel($caseA->subcategory, 71 $caseB->subcategory, $weights->subcategory_weight) * $weights->subcategory_weight; 72 73 // Atributo "software" 74 $globalSimilarityLevel += $this- >calculateTextualAttributeSimilarityLevel($caseA->software,

75 $caseB->software, $weights->software_weight) * $weights- >software_weight; 76 77 // Atributo "descrição" 78 $globalSimilarityLevel += $this- >calculateTextualAttributeSimilarityLevel($caseA->description, 79 $caseB->description, $weights->description_weight) * $weights->description_weight; 80 81 $weightsSomatory = $weights->equipment_weight + 82 $weights->type_weight + 83 $weights->category_weight + 84 $weights->subcategory_weight + 85 $weights->software_weight + 86 $weights->description_weight; 87 88 if($weightsSomatory == 0)

89 throw new Exception(__('Todos os pesos para os atributos do RBC estão como "zero".'));

90

91 return $globalSimilarityLevel / $weightsSomatory; 92 }

Estes são os dois principais métodos do motor do RBC. Todo o texto recebido por estes dois métodos é processado antes, substituindo as palavras totalmente similares no dicionário, efetuando conversões de palavras no plural para singular, pontuação e stopwords. A normalização das palavras é feita através de regras padronizadas representadas por expressões regulares que substituem um determinado sufixo por outro. Para exemplificar, o sufixo “ões” é substituído por “ão” através da expressão ({ões}$), e o sufixo “res” é substituído por “r” através da expressão({res}$). O sistema trabalha com outras cinco regras seguindo a mesma lógica de substituição. A expressão verifica por uma palavra terminada no sufixo indicado e substitui pelo sufixo correspondente no singular, através de uma função nativa da linguagem PHP, preg_replace.

46

Para tornar o layout do sistema responsivo, fazendo-o adaptar-se a dispositivos móveis, é utilizado CSS (Cascading Style Sheets) em conjunto com a técnica Media Query. São expressões lógicas que verificam por recursos presentes deste tipo específico de mídia no navegador do usuário. Esta expressão pode ser verdadeira ou falsa. É verdadeira quando o tipo de mídia e todas as regras combinam com o dispositivo em que o web site está sendo exibido (W3C, 2012). Desta forma, é possível definir trechos de regras CSS que serão aplicadas somente a um tipo específico de dispositivo, ou mesmo a uma resolução de tela específica.

3.4.2 Operacionalidade da implementação

Nesta subseção, serão apresentadas as principais funcionalidades do sistema. Será demonstrado a abertura de chamados, troca de interações e a pesquisa de casos similares através de técnicas de RBC e mineração de texto.

Na Figura 14, apresenta-se a tela de login do sistema desenvolvido. Figura 14 - Tela de Login

Na visão do usuário final, após efetuar o login a página será redirecionada para a tela de chamados. Nesta tela são apresentados todos os chamados que foram abertos pelo usuário. Na parte de cima são listados os chamados ainda pendentes, e na parte de baixo são listados os chamados que já foram resolvidos, para fins de histórico. Também é possível abrir um novo chamado técnico através do botão Novo chamado Esta tela é apresentada na Figura 15.

47

Figura 15 - Tela de chamados na visão do usuário final

Ao lado de cada chamado, é possível acessar a página de detalhes de cada um dos chamados técnicos.

A Figura 16 apresenta a tela de chamados acessada por um smartphone. Figura 16 - Tela de chamados acessada por smartphone

Na Figura 17, apresenta-se a tela de detalhes dos chamados técnicos na visão do usuário final. No topo, encontram-se as informações básicas como assunto, autor do chamado, data de abertura e data de fechamento. Na próxima seção, tem se as interações registradas entre o técnico responsável pelo atendimento do chamado e o usuário final. Interações são simples trocas de mensagens.

48

Figura 17 - Detalhes do chamado técnico na visão do usuário final

Na Figura 18 é apresentada a tela de abertura de chamados. Quando o usuário do sistema for um técnico ou administrador, há a possibilidade de definir quem é o autor do chamado através de uma lista suspensa contendo todos os usuários cadastrados no sistema. É especialmente útil quando o usuário final não abre o chamado pelo sistema e entra em contato com o help desk através de telefone, e-mail ou até pessoalmente. Assim todos os chamados técnicos podem ser encaminhados através do sistema, independente da forma de contato. Se o usuário não for técnico nem administrador, o chamado é aberto em seu nome automaticamente. O usuário deve descrever o problema e definir uma prioridade para o chamado.

49

Figura 18 - Tela de abertura de chamado técnico

Após a abertura do chamado, ele será listado como pendente tanto na lista do usuário autor do chamado como na lista de pendentes, que é exibida a todos os técnicos cadastrados no sistema, e será enviado um e-mail para a equipe de help desk e para o autor do chamado ou quem o chamado foi aberto em nome de. Estando o chamado na lista de pendentes dos técnicos, qualquer técnico poderá vincular-se a ele, clicando em Atender chamado ao lado do chamado desejado na lista, conforme apresentado na Figura 19. Quando um técnico vincula- se a um chamado, ele vai desaparecer da lista de chamados pendentes.

Figura 19 - Vinculando técnico ao chamado

O técnico então pode iniciar o atendimento, enviando uma mensagem ao usuário solicitando mais informações, se julgar necessário. Ele apenas preenche o campo na seção Interações com uma mensagem. Esta mensagem constará na página de detalhes do chamado, em forma de conversa, e será enviado um e-mail tanto para o técnico quanto para o usuário informando que houve uma nova interação no chamado.

O usuário pode então responder a mensagem no sistema, e novamente todos são notificados por e-mail. É possível enviar quantas mensagens forem necessárias para a resolução do chamado. Na Figura 20, apresenta-se um exemplo de conversa utilizando o recurso de troca de mensagens do sistema.

50

Figura 20 - Exemplo de troca de interações

Assim que o técnico considerar que tem informações suficientes para iniciar a resolução do chamado, ou se desejar diretamente, e já conhece a solução, pode simplesmente digitar a solução encontrada na seção Solução, conforme Figura 21. Esta ação irá considerar o chamado como concluído e notificará o autor que o chamado foi encerrado. Isto pode ser feito para chamados simples, em que os técnicos não considerem necessário reter o caso na base de casos do RBC. Um exemplo é uma simples solicitação de troca de lugar entre duas ou mais estações de trabalho.

Figura 21 - Cadastro de solução e fechamento do chamado

Este seria o fluxo para um chamado resolvido sem pesquisa e retenção na base de casos.

A Figura 22 apresenta o cadastro de uma solução em um chamado técnico utilizando um smartphone.

51

Figura 22 - Cadastro de solução em chamado através de smartphone

Se o técnico desejar realizar uma pesquisa por casos semelhantes, na seção Pesquisa por casos similares haverá uma lista de atributos do RBC, que foram usados para indexar todos os casos. Ao lado de cada atributo, o sistema apresenta uma lista, em ordem de probabilidade, dos valores dos atributos, como mostrado na Figura 23. Estes valores são classificados, em ordem de prioridade, utilizando a técnica derivada da mineração de texto, classificação de documentos. A técnica dispensa técnicos de descobrirem quais são os atributos mais adequados para cada caso, podem apenas observar as sugestões e confirmar a melhor opção, ou escolher outra, quando for necessário.

52

Figura 23 - Tela de escolha dos atributos RBC com mineração de texto

Todos os valores para os atributos sugeridos na tela mostrada na Figura 23 vêm de um cadastro de tokens de classificação que será demonstrado posteriormente neste capítulo.

Quanto todos os valores para os atributos forem preenchidos, basta clicar em Pesquisar. Neste momento o sistema faz um pré-cadastro do chamado na base de casos do RBC, para guardar todos os valores escolhidos. Desta forma, o técnico pode realizar outra pesquisa em um momento posterior, sem precisar preencher novamente os atributos. Uma vez que os atributos foram salvos, o sistema redireciona automaticamente para a tela de pesquisa de casos similares

53

Na tela de pesquisa de casos similares, o sistema calcula a similaridade do caso em questão contra todos os outros casos retidos na base do RBC e apresenta os dez casos mais similares, ordenados por grau de similaridade, conforme apresenta-se na Figura 24.

Figura 24 - Pesquisa de casos similares com RBC

Na lista de casos, ao lado direito há um botão Ver solução. Este botão permite que seja consultada qual a solução tomada para o caso correspondente, conforme a Figura 25.

Figura 25 - Consulta de solução de casos similares

Abaixo da solução do caso consultado, há outro botão chamado Aceitar solução. Este botão fará com que o técnico seja redirecionado novamente para a página de detalhes do caso original, no qual ele realizou a pesquisa, com o campo de solução já preenchido com a solução que fora aceita antes. Neste momento ele pode adaptar a solução ou apenas salvá-la da mesma forma. Assim, o caso é considerado fechado, o autor é notificado e o caso está retido na base de casos, disponível para futuras pesquisas.

Assim que o chamado é fechado, o autor é convidado a responder uma pesquisa de satisfação através de um e-mail. O usuário pode deixar um comentário referente ao atendimento recebido e uma nota de zero a dez. Quando um chamado for avaliado com nota menor que seis, o coordenador da equipe receberá um e-mail comunicando o fato.

A Figura 26 apresenta o formulário de pesquisa de satisfação.

54

Figura 26 - Formulário de pesquisa de satisfação

Após a avaliação do chamado pelo usuário, todas as pesquisas respondidas ficam disponíveis para o coordenador através de um relatório de pesquisas de satisfação. A Figura 27 apresenta este relatório.

Figura 27 - Relatório de pesquisas de satisfação

A Figura 28 demonstra a consulta de casos similares através de um smartphone, na qual é possível perceber o resultado do uso de layout responsivo quando comparada à Figura 24.

55

Figura 28 - Consulta de casos em smartphone

Além da solução, é possível acessar a memória de cálculo do RBC. Neste botão, o sistema irá exibir todos os cálculos efetuados pelo motor do RBC para chegar ao nível de similaridade apresentado. A Figura 29 apresenta uma parte da memória de cálculo de um caso.

A memória de cálculo é composta de seis tabelas. Cada uma das tabelas representa um atributo do RBC - equipamento, tipo, categoria, subcategoria, software e o relato do usuário. Cada uma destas tabelas contém todas as comparações que foram feitas com as palavras contidas neste atributo.

Na primeira coluna, aparecem as palavras do caso A (problema atual). Na segunda coluna, as palavras do caso B (caso encontrado no banco de casos). Cada linha da tabela demonstra qual o score de similaridade entre ambas as palavras, bem como o fator de peso do atributo correspondente a tabela e a quantidade de palavras a serem consideradas na normalização do score de similaridade, conforme a fórmula do Vizinho Mais Próximo.

56

Figura 29 - Exemplo parcial de memória de cálculo de um caso

Ao final da memória de cálculo, são apresentados os valores obtidos nas comparações entre cada um dos atributos do RBC, inseridos na fórmula para demonstrar claramente como o cálculo foi efetuado, conforme Figura 30.

57

Este é o fluxo básico que é percorrido durante o atendimento de chamados. Além disso, há outros cadastros de apoio aos sistemas de inteligência artificial.. É possível ajustar o fator peso de cada um dos índices dos casos do RBC, elevando ou diminuindo sua importância no cálculo de similaridade entre casos. Há também o cadastro de stopwords e entradas do dicionário. Outra possibilidade é o cadastro de exceções de flexão de número. No momento da conversão de palavras do plural para singular, é possível indicar exceções que devem ser convertidas de uma maneira particular pelo sistema.

O cadastro de tokens de classificação é um dos mais importantes para o funcionamento da parte de inteligência do sistema. Aqui são cadastrados possíveis valores para os índices do RBC, que serão utilizados pelo motor de classificação de documentos, para apresentar ao técnico os valores mais prováveis para cada chamado.

A Figura 31 apresenta os tokens já cadastrados no sistema. Na coluna Assunto, é o valor do índice, que será apresentado ao técnico. Na coluna texto, é o token em si, que será utilizado para efetuar a classificação de um relato dentre os valores possíveis. A coluna Atributo representa a qual atributo ou índice este token faz parte.

Figura 31 - Cadastro de tokens de classificação

3.5 RESULTADOS E DISCUSSÕES

Nesta seção é feita uma análise comparativa entre cada um dos trabalhos correlatos descritos na seção 2.6. Foram considerados aspectos como técnicas de inteligência artificial empregadas, a presença de pesquisa de satisfação em relação ao atendimento para os usuários da aplicação e responsividade do layout. O Figura 9 apresenta as características de cada trabalho que são comparadas.

58

Quadro 8 - Quadro comparativo entre trabalhos correlatos Ferramenta desenvolvida Fischer (2012) Wehrmeister (2008) Wilvert (2005)

RBC Sim Não Sim Sim

Text Mining Sim Sim Não Não

Pesquisa de satisfação

Sim Não Não Não

Plataforma Web Web Web Desktop

Layout responsivo

Sim Não Não Não se aplica

Os trabalhos de Wehrmeister (2008) e Wilvert (2005) fizeram uso da técnica de RBC, pelo método do vizinho mais próximo. Apesar desta técnica exigir a identificação, filtragem e entrada de palavras chave para realizar a pesquisa manualmente pelo usuário do sistema, pode-se utilizar técnicas de text mining e classificação de texto. Desta forma o usuário é dispensado de pensar em todas as palavras chave para efetuar a pesquisa no RBC, economizando tempo, e eliminando possíveis erros ou diferenças nos resultados devido às subjetividades do processo manual, sem apoio de text mining. Já Fischer (2012) optou apenas pela técnica de text mining Descoberta de conhecimento em textos. Enquanto na técnica empregada por Fischer (2012) o conhecimento é extraído diretamente de textos, no caso relato de chamados técnicos, no RBC as informações chave são indexadas para permitir encontrar os casos mais similares, e a partir destes casos encontrar as soluções já conhecidas.

Um diferencial foi a possibilidade dos clientes do help desk poderem responder a uma pesquisa de satisfação em relação ao atendimento prestado no fechamento de cada chamado

Documentos relacionados