Soundex: различия между версиями

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
[отпатрулированная версия][непроверенная версия]
Содержимое удалено Содержимое добавлено
Нет описания правки
Описание алгоритма: Вернул в примеры комментарии. Они очень полезны для понимания алгоритма.
Строка 19: Строка 19:
# Любая последовательность одинаковых цифр сокращается до одной такой цифры.
# Любая последовательность одинаковых цифр сокращается до одной такой цифры.
# Удаляем все a, e, i, o, u, y, за исключением первой буквы слова.
# Удаляем все a, e, i, o, u, y, за исключением первой буквы слова.
# Заменяем первую букву буквой, запомненной на шаге 1, делая ее заглавной.
# Заменяем первый символ буквой, запомненной на шаге 1, делая ее заглавной.
# Итоговая строка обрезается до первых четырех символов. Если длина строки меньше требуемой, недостающие символы заменяются знаком 0.
# Итоговая строка обрезается до первых четырех символов. Если длина строки меньше требуемой, недостающие символы заменяются знаком 0.


Строка 26: Строка 26:
* implementation → i514e5e53a3io5 → i51455335 → i514 → I514
* implementation → i514e5e53a3io5 → i51455335 → i514 → I514
* "Robert" и "Rupert" → "R163", "Rubin" → "R150"
* "Robert" и "Rupert" → "R163", "Rubin" → "R150"
* "Ashcraft" и "Ashcroft" → "A261"
* "Ashcraft" и "Ashcroft" → "A261", а не "A226" (буквы 's' и 'c' в словах дадут 1 цифру '2', а не 22, т.к. разделены 'h').
* "Tymczak" → "T522", а не "T520" (буквы 'z' и 'k' заменяются на 22, т.к. разделены гласной).
* "Tymczak" → "T522"
* "Pfister" → 11i23e6 → 1i23e6 → 1236 → P236
* "Pfister" → "P236", а не "P123" (Pfister → 11i23e6 → 1i23e6 → 1236 → P236).


== Пример исполнения ==
== Пример исполнения ==

Версия от 14:07, 30 декабря 2015

Soundex — один из алгоритмов сравнения двух строк по их звучанию. Он устанавливает одинаковый индекс для строк, имеющих схожее звучание в английском языке.

Soundex был разработан Робертом Расселом (Robert C. Russel) и Маргарет Кинг Оделл (Margaret King Odell) и запатентован в 1918 и 1922 годах[1][2]. Этот алгоритм стал популярным в 1960-х годах, после того как стал темой нескольких статей в журналах «Communications of the Association for Computing Machinery» и «Journal of the Association for Computing Machinery» (CACM и JACM). Еще большую популярность этот алгоритм получил после того, как был опубликован в книге Дональда Кнута. Часть 6. Поиск // Искусство программирования = The Art of Computer Programming. — 2012. — Т. 3. Сортировка и поиск. — С. 249.

Описание алгоритма

  1. Запоминаем первую букву. Удаляем все 'h' и 'w', за исключением первой буквы слова.
  2. Согласные заменяем на цифры от 1 до 6, причём похожим по звучанию буквам соответствуют одинаковые цифры:
    • b, f, p, v → 1
    • c, g, j, k, q, s, x, z → 2
    • d, t → 3
    • l → 4
    • m, n → 5
    • r → 6
  3. Любая последовательность одинаковых цифр сокращается до одной такой цифры.
  4. Удаляем все a, e, i, o, u, y, за исключением первой буквы слова.
  5. Заменяем первый символ буквой, запомненной на шаге 1, делая ее заглавной.
  6. Итоговая строка обрезается до первых четырех символов. Если длина строки меньше требуемой, недостающие символы заменяются знаком 0.

Примеры:

  • аmmonium → а55o5iu5 → а5o5iu5 → a555 → A555
  • implementation → i514e5e53a3io5 → i51455335 → i514 → I514
  • "Robert" и "Rupert" → "R163", "Rubin" → "R150"
  • "Ashcraft" и "Ashcroft" → "A261", а не "A226" (буквы 's' и 'c' в словах дадут 1 цифру '2', а не 22, т.к. разделены 'h').
  • "Tymczak" → "T522", а не "T520" (буквы 'z' и 'k' заменяются на 22, т.к. разделены гласной).
  • "Pfister" → "P236", а не "P123" (Pfister → 11i23e6 → 1i23e6 → 1236 → P236).

Пример исполнения

Ниже приведен пример реализации алгоритма на языке программирования Perl.

sub soundex {
	my $word = uc shift;
	$word =~ s/[HW\s]//g;
	my $fl = substr $word, 0, 1;
	$word  = substr $word, 1;
	$word  =~ tr/BFPVCGJKQSXZDTLMNR/111122222222334556/ds;
	$word  =~ tr/AEIOUY//d;
	$word  = substr $word, 0, 3;
	$trail = "0" x (3 - length($word));
	return $fl.$word.$trail;
}

См. также

Примечания