Как решить дилемму хранения человеческих имен в MySQL и сохранить как различимость, так и поиск похожих имен? - PullRequest
1 голос
/ 29 июля 2011

Мне было дано прекрасное задание ;-) создать несколько таблиц в базе данных MySQL, которые должны содержать человеческие имена.

Критерии:

  1. У меня есть только полные имена,(Нет разделения, например, имя, фамилия и т. Д.)
  2. Хранилище должно быть чувствительным к диакритическим знакам.(Следующие имена обозначают разных людей)

    • "Восс" и "Голос".
    • "Джоэл" и "Жоэль".
    • "франк" и"Franc" и "Fránc".
  3. Поиск должен возвращать все похожие имена в строке поиска: Например, поиск "franc" должен возвращать ["franc", "Franc "," Fránc "] и так далее ... (Было бы замечательно, если бы поиск возвращал не только нечувствительные к диакритике совпадения, но, возможно, похожие по звучанию имена или имена, которые по частям совпадают с строкой поиска, тоже ...)

Я хотел бы использовать COLLATION utf8_bin для столбца (объявленного как unique), в котором я буду хранить имена.Это удовлетворило бы пункт 2. Но это повредит пункту три.Объявление имени столбца как unique с collation utf8_unicode_ci удовлетворяет пункт 3., но это вредит пункт 2.

Итак, мой вопрос: есть ли способ решить эту задачу и соблюдать все критерии?И поскольку я не хочу изобретать велосипед: существует ли элегантный способ обработки человеческих имен (и их поисков) в базах данных?(К сожалению, у меня нет возможности разбить имена на имена, фамилии и дополнительные промежуточные имена ...)

Редактировать:

Количество имен составляет миллион (~ 1.000.000) записей.И если это имеет значение: я использую python в качестве языка сценариев для заполнения базы данных и запроса данных позже.

Ответы [ 2 ]

2 голосов
/ 29 июля 2011

Что полезно, если вы можете разложить полное имя на компонент «именные слова» и сохранить фонетическую кодировку (метафон или один из множества других вариантов) для каждого из них. Вам просто нужно понятие именных слов, а не конкретизировать его как первое или среднее или последнее, что хорошо, потому что эти категории в любом случае плохо работают в разных культурах). Но вы можете использовать информацию о позиционном порядке позже в ранжировании, если хотите, чтобы поиск "Paul Carl" соответствовал "Paul Karl" лучше, чем "Carl Paul". Вы должны знать о неоднозначной пунктуации, которая может потребовать хранения нескольких версий некоторых именных слов. Например, Бре-Анна Хейм была бы разбита на имена «бре», «анна», «бреанна» и «хейм». Иногда черта не имеет значения, как Бре-Анна, но иногда не так, как в Салли-июне ". Бре-Анна никогда не использует только Бре или Анну, но Салли-Джун иногда может просто использовать Салли или только июнь. Трудно понять, какой, так что покрыть обе возможности.

Вы можете написать свой запрос против этого, аналогичным образом разложив и фонетически кодировав полное имя, которое вы ищете. Ваш запрос может вернуть, скажем, те полные имена, которые имеют два или более фонетических совпадения имен компонентов (или одно, если в поиске или источнике есть только одно имя). Это дает вам подмножество полных имен для дальнейшего рассмотрения. Вы могли бы придумать их простое ранжирование или даже сделать что-то вроде алгоритма сопоставления расстояний в этом подмножестве, что было бы слишком дорого в вычислительном отношении для всего миллиона имен. Когда я говорю о согласовании расстояний, я говорю о таких онлайн-алгоритмах, как расстояние Левенштейна и т. П.

(правка) Это объясняется тем, что я обращаюсь со следующими именами: Мария де Лос-Анджелес Гомес-Родригес. Один человек для ввода данных может просто ввести Марию Гомес. Другой может войти в Марию Гомес Родригес. Еще один мог бы войти в Марию Анджелес Родригус.

1 голос
/ 29 июля 2011

Вы можете использовать алгоритм, подобный Метафон (или Двойной Метафон), в другом столбце, чтобы вы могли попытаться найти имена, которые «похожи» друг на друга.Вам придется искать международную версию, которая знает о немецком символе esset.

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