Soundex может быть не идеальным, но это кажется разумным подходом, по крайней мере для вашего конкретного примера соответствия английского / иврита.
Вы определенно не можете использовать правило о сохранении первой буквыимя, но мне никогда не нравилось это даже для латинского алфавита (потому что я должен был бы искать и "E" и "Y" для фамилии моей матери).Я рекомендую просто обращаться с первой буквой, как со всеми остальными.
Тогда нужно просто сопоставить буквы иврита с кодами Soundex.Вам действительно не нужна промежуточная английская транслитерация;просто закодируйте отображение иврита → Soundex напрямую.
- בוףפ → 1
- גזחךכסקש → 2
- דטת → 3
- ץצ → 32
- ל → 4
- םמןנ → 5
- ר → 6
- אהיע → игнорируется
Однако, потому что Soundex является англо-в центре, он может некорректно обрабатывать определенные неоднозначности в произношении на иврите:
- ו отображается на 1 (как английский V) в приведенном выше списке, но часто представляет O, U или W, вэтот случай следует игнорировать в Soundex.
- hard трудно классифицировать из-за отсутствия английского эквивалента.Я поместил его в категорию 2, потому что это (1) соответствует транслитерации "ch", и (2) позволяет ך / have иметь одну и ту же категорию с дагешем или без него.
- Произношение ашкенази делит ת между категориями2 и 3.
Чтобы справиться с этим, вы можете сгенерировать несколько ключей Soundex для строки.Например, «שבת» будет отображаться как в 212, так и в 213.
Подобные сопоставления могут быть сделаны для греческого:
- ΒΠΦ → 1
- Ψ → 12
- ΓΖΚΞΣΧ → 2
- ΔΘΤ → 3
- Λ → 4
- ΜΝ → 5
- Ρ → 6
- ΑΕΗΙΟΥΩ→ игнорируется
или русский:
- БВПФ → 1
- ГЖЗКСХЧШЩ → 2
- ДТ → 3
- Ц → 32
- Л → 4
- МН → 5
- Р → 6
- АЕЁИЙОУЪЫЬЭЮЯ → игнорируется
(Примечаниечто некоторые из 2-х могут быть 32-х, в зависимости от вашего соглашения о транслитерации.)
"Оценка" подобия может быть получена на основе показателя, такого как самая длинная общая подпоследовательность длина или Расстояние Левенштейна для значений Soundex.
Например, вы можете определить «сходство» между двумя строками как 2 * lcslen (A, B) / (len (A) + len (B))) чтобы получить оценку междуen 0 и 1.