Não encontrei nenhuma literatura útil disponível para usar o aprendizado profundo para esse problema específico. A maioria dos métodos parece depender de métodos que não sejam de aprendizado de máquina, como semelhanças de cordas e distâncias de Levenstein. Uma abordagem razoável baseada em aprendizado profundo para esse problema seria uma rede neural recorrente . Um LSTM (memória de longo prazo) ou GRU (Gated Recurrent Unit) seria o ideal. A idéia é ter uma RNN que tenha um estado interno e respeite a ordem em que as entradas são alimentadas.
Diferentemente da classificação de texto, análise de sentimentos ou geração de sequência, a codificação preferida para o texto aqui seria no nível de caracteres, em vez de no nível de palavras .
Por exemplo
Christian Douglas,Chris,1
Jhon Stevens,Charlie,0
se tornaria
[C,h,r,i,s,t,i,a,n, ,D,o,u,g,l,a,s, ,C,h,r,i,s] --> [1]
[J,h,o,n, ,S,t,e,v,e,n,s, ,C,h,a,r,l,i,e] --> [0]
As duas seqüências a serem correspondidas são concatenadas em uma única sequência. A intuição aqui é que a RNN processaria a sequência caractere por caractere e aprenderia (ler pesos de atualização) que os caracteres no final têm um padrão semelhante ao que foi visto anteriormente na mesma sequência para deduzir que deveria ser 1 em vez de 0
O vetor de [1/0] é a variável de destino.
As etapas padrão de pré-processamento da RNN se aplicam como de costume - preencheremos as seqüências no início para que elas tenham o mesmo comprimento (por exemplo, 50), os caracteres sejam codificados como numéricos em vez de string, etc.
Como o dicionário aqui é bem pequeno (26 alfabetos + espaço + teclado), a arquitetura de rede pode ser bastante simples. Uma única camada de incorporação + camada recorrente deve ser suficiente.
Enquadrar o problema dessa maneira nos permite usar um RNN de baunilha ou um LSTM / GRU pronto para uso em vez de criar uma arquitetura personalizada que usa duas cadeias de caracteres separadas como entrada para cada ponto de dados e lança um número.
Você pode testar essa abordagem e ver se é capaz de superar satisfatoriamente os modelos de linha de base.
Uma boa leitura para RNNs de nível de personagem é o blog e o código de Andrej Karpathy . O problema que ele está tentando resolver é diferente e o código está completamente numpy, mas ainda assim captura bem a ideia.