Выборка похожих результатов / MySQL

Есть база с примерно таким содержанием:
Пупкин Вася
Пупкин В.
Вася Пупкин
Фамилькин Л.
Людвиг Аристархович Фамилькин
Фамилькин
Держиморда Кирилл


Надо выбрать и посчитать количество похожих записей средствами PHP/MySQL.
Например:
Пупкин - 3 шт.
Фамилькин - 3 шт.
Держиморда - 1 шт.


Как реализовать?
  • Вопрос задан
  • 3460 просмотров
Пригласить эксперта
Ответы на вопрос 3
@TimTowdy
Вы сначала определитесь как вы будете выделять кластера. Если в ваш список добавить «Людвиг Аристархович Пупкин» — куда его отнесёте? К Пупкиным, или к Людвигам, или к обоим одновременно?
После того как решите как выделять кластера, можете воспользоваться расстоянием Левенштейна для определения принадлежности к кластеру.
Ответ написан
Комментировать
JeanLouis
@JeanLouis
I. Если вы хотите посчитать количество одинаковых слов, то есть:
Пупкин — встречается 3 раза
Вася — встречается 2 раза и т.д, то это можно сделать либо с помощью хранимой процедуры, либо другим методом перебора (в php), либо (лучше) нормализовать данные, чтобы в одной строке было только одно слово, тогда можно будет использовать оператор GROUP BY.

II. Если выхотите посчитать количество одинаковых фамилий (что я думаю вы и хотите), то базу данных опять же лучше нормальзовать по такому принципу:

1. Самое длинное слово в строке брать за фамилию, если оно не оканчивается на «ич», «еч» и другие характериные для отчества окончания, в противном случае брать следующее наиболее длинное слово в строке.
2. Самое короткое слово в строке брать за имя.

Эти данные записать в таблицу с колонками Фамилия и Имя (или какой-то другой подходящий формат) при этом можно сохранить ключи на исходные заиписи. После чего по полю Фамилия можно использовать GROUP BY.

Как-то так. Ваша проблема в ненормализованных данных.
Ответ написан
@Jazzist
Если решение должно быть нересурсоемким, и его надо сделать как можно быстрее — добавьте два поля, заполните их разбитым на слова (по пробелу и trim точку) ФИО, и ищите по ним OR LIKE
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы