Pergunta

Eu não sou um estudante de programação de linguagem natural, mas eu sei que não é strcmp trivial (n1, n2).

Aqui está o que eu aprendi até agora:

  • comparando nomes pessoais não podem ser resolvidos 100%
  • existem maneiras de alcançar certo grau de precisão.
  • a resposta será específica de localidade, isso é ok.

Eu não estou olhando para soletrar alternativas! O pressuposto é que a ortografia da entrada está correta.

Por exemplo, todos os nomes abaixo pode se referir à mesma pessoa:

  • Berry Tsakala
  • Bernard Tsakala
  • Berry J. Tsakala
  • Tsakala, Berry

Eu estou tentando:

  1. construir (ou cópia) um algoritmo que classifica os nomes de entrada relacionamento 2
  2. encontrar um método de indexação (para nomes no meu banco de dados, para tabelas de hash, etc.)

Nota: Minha tarefa não é sobre encontrar nomes no texto, mas para comparar 2 nomes. por exemplo.

name_compare( "James Brown", "Brown, James", "en-US" ) ---> 99.0%
Foi útil?

Solução

Eu costumava Tanimoto Coeficiente para um rápido (mas não super) solução, em Python:

"""
Formula:
  Na = number of set A elements
  Nb = number of set B elements
  Nc = number of common items

  T = Nc / (Na + Nb - Nc)
"""
def tanimoto(a, b):
    c = [v for v in a if v in b]
    return float(len(c)) / (len(a)+len(b)-len(c))

def name_compare(name1, name2):
    return tanimoto(name1, name2)


>>> name_compare("James Brown", "Brown, James")
0.91666666666666663
>>> name_compare("Berry Tsakala", "Bernard Tsakala")
0.75
>>> 

Editar: Um link para um bom e útil livro .

Outras dicas

Soundex às vezes é usado para comparar nomes semelhantes. Ele não lida com o primeiro nome / sobrenome ordenação, mas você provavelmente poderia apenas ter seu olhar código para a vírgula para resolver esse problema.

Acabamos vindo a fazer este tipo de trabalho non-stop ultimamente e da estratégia que adotamos é ter uma tabela look-up ou lista de alias. Se você pode descontar erros ortográficos / misheard / nomes não-Inglês, em seguida, a parte difícil é tirado. Em seus exemplos podemos supor que a primeira palavra e a última palavra é o nome próprio e o sobrenome. Qualquer coisa entre seriam descartados (nomes do meio, iniciais). Berry e Bernard estaria na lista de alias -. E quando Tsakala não corresponde a Berry que ia virar a ordem das palavras em volta e, em seguida, obter a correspondência

Uma coisa que você precisa entender é o banco de dados / pessoas listas que você está lidando. No mundo de língua Inglês nomes do meio são inconsistente gravado. Então você não pode fazer ou negar um jogo baseado no nome do meio ou inicial do meio. Soundex não vai ajudá-lo com aliases de nomes comuns, como "Dick" e "Richard", "Berry" e "Bernard" e, possivelmente, "Steve" e "Stephen". Em algumas comunidades é bastante comum para as pessoas viverem no mesmo endereço e têm 2 ou 3 gerações vivendo naquele endereço com o mesmo nome. A única maneira que você pode separá-los é através da data de nascimento. Data de nascimento pode ou não ser gravado. Se você tem o cacife então você provavelmente deve fazer a gravação da data de nascimento obrigatório. Um monte de "pessoas bancos de dados", quer fazer data não registro de nascimento ou não lhes dão afastado devido a razões de privacidade.

nome

eficazmente as pessoas correspondente não é tão complicado. Sua inteiramente com base na qualidade dos dados fornecidos. O que acontece na prática é que um monte de registros permanecem inigualável - e até mesmo um ser humano olhando para eles não pode resolver a incompatibilidade. Um ser humano pode perceber aliases de nome não registrados na lista de aliases ou pode ser capaz de olhar para detalhes da pessoa na internet -., Mas você realmente não pode esperar que o seu programa para fazer isso

Os bancos, organizações de notação de crédito e que o governo tem um monte de informações detalhadas sobre nós. endereços anteriores, data de nascimento etc. E que os ajuda a juntar-se nomes. Mas para nós programadores normais não há nenhuma bala mágica.

ordem de nome Analisar e a existência de nomes do meio / iniciais é trivial, é claro, por isso parece que o verdadeiro desafio é saber alternativas de nomes comuns. Eu duvido que isso pode ser feito sem o uso de algum tipo de tabela de pesquisa apelido. Esta lista é um bom ponto de partida. Ele não mapeia Bernard para Berry, mas provavelmente iria pegar os casos mais comuns. Talvez uma lista ainda mais exaustivo pode ser encontrada em outros lugares, mas eu definitivamente acho que uma tabela de pesquisa específica de localidade é o caminho a percorrer.

Eu tive problemas reais com o Tanimoto usando utf-8.

O que funciona para idiomas que utilizam sinais diacríticos é difflib.SequenceMatcher()

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top