Можно ли найти или сопоставить два имени, которые имеют разные специальные символы Django - PullRequest
2 голосов
/ 18 июня 2019

Я пытаюсь заполнить города в штате, используя API OpenstreetMaps для моего приложения django.База данных уже была заполнена некоторыми городами.Я сталкиваюсь с проблемой дублирования данных, поскольку в названиях городов иногда используются специальные символы.

Например, в стране Turkey, штат Bursa имеет город Gursu.В моей базе данных есть объект города с именем Gürsu.И название города из Openstreet Map API - Gürsü.Я пытаюсь найти решение, чтобы сопоставить существующий город со специальным именем персонажа и обновить его, если он существует.Так что я могу избежать дубликатов.

Ответы [ 2 ]

1 голос
/ 18 июня 2019

Решение, включающее , заключается в сопоставлении текста в соответствии с UAX # 10.Вы можете сделать это в базе данных или в Python (возможно, используя PyICU).Вот краткий код, демонстрирующий:

#!/usr/bin/env perl
use 5.010;
use utf8;
use open qw(:std :encoding(UTF-8));
use Unicode::Collate qw();

my $c = Unicode::Collate->new(normalization => undef, level => 1);
my @g = qw(Gursu Gürsu Gursü Gürsü);

for my $o (@g) {
    for my $i (@g) {
        say "$i matches $o" if -1 != $c->index($o, $i, 0);
    }
}

__END__
Gursu matches Gursu
Gürsu matches Gursu
Gursü matches Gursu
Gürsü matches Gursu
Gursu matches Gürsu
Gürsu matches Gürsu
Gursü matches Gürsu
Gürsü matches Gürsu
Gursu matches Gursü
Gürsu matches Gursü
Gursü matches Gursü
Gürsü matches Gursü
Gursu matches Gürsü
Gürsu matches Gürsü
Gursü matches Gürsü
Gürsü matches Gürsü
0 голосов
/ 18 июня 2019

Прежде всего, они не одинаковы, у них разные значения ASCII.Но если вы хотите сопоставить ü с u, вам нужно немного поработать, чтобы сгруппировать похожие символы, которые вы считаете в списке, как это грубое решение, которое вы можете изменить соответствующим образом

import difflib
similar_groups=[['ü','u']] #add similar special characters here
country = 'Gursu'
country_b = 'Gürsü'
output_list = list(set([li[-1:] for li in difflib.ndiff(country, country_b) if li[0] != ' ']))
match=False #keep false for match found
print(output_list)
for val in similar_groups:
    if(sorted(output_list)==sorted(val)):
        match=True
    else:
        match=False

if match:
    print("Equal")
    #update or skip your stuff here
...