Сравнение имен людей: способы решения этой задачи - PullRequest
3 голосов
/ 21 июня 2009

Я не студент, изучающий естественный язык, но знаю, что это не тривиальный strcmp (n1, n2).

Вот что я выучил до сих пор:

  • сравнение личных имен невозможно решить 100%
  • Существуют способы достижения определенной степени точности.
  • ответ будет зависеть от локали, это нормально.

Я не ищу альтернативы правописанию! Предполагается, что написание ввода правильное.

Например, все имена ниже могут относиться к одному и тому же человеку:

  • Ягода Цакала
  • Бернард Цакала
  • Берри Дж. Цакала
  • Цакала, Ягода

Я пытаюсь:

  1. построить (или скопировать) алгоритм, который оценивает отношения 2 входных имен
  2. найти метод индексации (для имен в моей базе данных, для хеш-таблиц и т. Д.)

примечание: Моя задача не в том, чтобы найти имена в тексте, а в том, чтобы сравнить 2 имени. например

name_compare( "James Brown", "Brown, James", "en-US" ) ---> 99.0%

Ответы [ 5 ]

7 голосов
/ 21 июня 2009

Я использовал коэффициент Tanimoto для быстрого (но не супер) решения в 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
>>> 

Редактировать: Ссылка на хорошую и полезную книгу .

2 голосов
/ 21 июня 2009

Soundex иногда используется для сравнения похожих имен. Это не относится к упорядочению имени / фамилии, но вы могли бы просто заставить свой код искать запятую для решения этой проблемы.

1 голос
/ 21 июня 2009

В последнее время мы выполняем такую ​​работу без перерыва, и мы выбрали подходящую таблицу поиска или список псевдонимов. Если вы можете сбрасывать со счетов орфографические ошибки / неверные / неанглийские имена, то сложная часть убирается. В ваших примерах мы предполагаем, что первое слово и последнее слово - это имя и фамилия. Все промежуточное будет отброшено (отчества, инициалы). Берри и Бернард были бы в списке псевдонимов - и когда Цакала не совпадал с Берри, мы переключали порядок слов и затем получали совпадение.

Вам нужно понять одну вещь - базы данных / списки людей, с которыми вы имеете дело. В англоязычном мире отчество записывается непоследовательно. Таким образом, вы не можете сделать или отрицать совпадение, основанное на отчестве или отчестве. Soundex не поможет вам с общими псевдонимами имен, такими как «Дик» и «Ричард», «Берри» и «Бернард» и, возможно, «Стив» и «Стивен». В некоторых общинах люди часто живут по одному и тому же адресу и живут по 2-3 поколения с одним и тем же именем. Вы можете разделить их только по дате рождения. Дата рождения может быть или не быть записана. Если у вас есть влияние, вам, вероятно, следует сделать запись даты рождения обязательной. Многие «базы данных людей» либо не записывают дату рождения, либо не отдают их по причинам конфиденциальности.

По сути, сопоставление имен людей не так сложно. Это полностью основано на качестве предоставленных данных. На практике происходит то, что многие записи остаются несогласованными, и даже человек, смотрящий на них, не может устранить несоответствие. Человек может заметить псевдонимы имен, не записанные в списке псевдонимов, или может найти информацию о человеке в Интернете - но вы не можете ожидать, что ваша программа сделает это.

Банки, кредитные рейтинговые организации и правительство имеют много подробной информации о нас. Предыдущие адреса, дата рождения и т. Д. И это помогает им объединять имена. Но для нас, обычных программистов, не существует волшебной пули.

0 голосов
/ 04 июня 2012

У меня были реальные проблемы с Tanimoto, использующим utf-8.

Что подходит для языков, использующих диакритические знаки, это difflib.SequenceMatcher()

0 голосов
/ 21 июня 2009

Анализ порядка имен и наличия отчеств / инициалов, конечно, тривиален, поэтому похоже, что реальная проблема заключается в том, чтобы знать альтернативы общих имен. Я сомневаюсь, что это можно сделать без использования какой-либо таблицы поиска псевдонимов. Этот список является хорошей отправной точкой. Он не сопоставляет Бернарда с Берри, но, вероятно, поймает наиболее распространенные случаи. Возможно, еще более исчерпывающий список можно найти в другом месте, но я определенно думаю, что путь поиска для конкретной локали - это путь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...