@LionG

Можно ли как то бороться с одинаковыми по написанию символами латиницы и кириллицы?

Есть массив рейсов по определенному маршруту в формате json. В каждом рейсе указан самолет который используется в данном рейсе. Простая задачка спарсить уникальные самолеты на данном маршруте. Беда в том что составлял эти данные диверсант и после парсинга получаются дубли самолетов...

Airbus A320
Airbus А320


Визуально одинаковы но стоит посмотреть код символов и сразу становится ясно что в 1м случае А написана на латинице и имеет код A, а во 2м случае А написана на кириллице и имеет код уже А. Возможно ли такое как то пофиксить автоматически ?
  • Вопрос задан
  • 207 просмотров
Пригласить эксперта
Ответы на вопрос 2
dollar
@dollar
Делай добро и бросай его в воду.
Нужно набрать в гугле "поиск кириллицы".
Ваш Кэп.

UPD
Мда, я думал вам нужно просто в тексте увидеть визуально) Не правильно понял вопрос.

База - это уже слишком, имхо. Ну т.е. если она не меняется, то ладно, а если каждый раз пополняется, то сегодняшняя и вчерашняя функции могут давать разные результаты, и нужно будет заново перепарсивать старые данные. Разве что нужно исправлять опечатки, но это уже более крутая задача, чем в вопросе.

Думаю, нужен хитрый алгоритм. Превосходящее число символов - верное направление. Но также, имхо, нужно учитывать процент и тип символов и порядок слов.

Тип символов. Каждому символу ставим в соответствие число, которое означает русскость от 0 до 1. Например, Б = 1, i = 0, T = 0.5, то есть три варианта. Хотя я бы сделал исключение для пары символов Р = 0.4 и Х = 0.3. Вряд ли самолёт назовут Х320 (буква ха, хз как это звучать будет). Но это может вызвать казусы, так что решать вам. Хотя можно два массива придумать для разных случаев, но это уже сложно для понимания.

1) Считаем средний вес символа в слове. Тут всё очевидно. Но если 0.5, то не спешим округлять, а переходим к п.2

2) Когда вес 0.5, смотрим на предыдущее слово, если вы уверены, что это часть названия. Например, оно с большой буквы (если вы парсите цельный текст). Если у предыдущего слова вес тоже был 0.5, то тогда уже округляете текущее слово в определенную сторону.

3) Соответственно, если три и более слова в названии, то тоже их учитываете по цепочке.

4) Если заранее можно выделить название и быть уверенным, что все слова - его части, то можно посчитать среднюю температуру по больнице. И на её основе делать выводы о каждом слове, у которого вес 0.5.
То есть название
Аве Maria T100 считаем так: первое слово вес 0.66, второе слово вес 0.3, проблемы нет, а вот третье слово вес 0.5 - проблемка. Считаем среднюю по всему названию, выходит 0.44, то есть вывод, что Т - английская.

Хотя если присмотреться, то здесь вообще хорошо бы заменить Аве на Ave, но, как писал выше, это уже другая задача. Но напишу немного про неё. Я бы на вашем месте просто делал бы русский вариант и соответствующую ему латиницу и заносил бы в базу и считал. В случае, если оба названия после приведение встречаются по 1 разу, то есть где-то привели как Аве Мария, а где-то Ave Maria, то парсер вам сигналит ошибкой, а вы уже смотрите своими глазами на название и заносите его в исключение, чтобы везде было одинаково. Также есть опечатки типа AirBus - аналогично в базу, только преобразования по регистру, и вариантов больше - все возможные комбинации, из которых для ошибки достаточно накопить два разных варианта.
Ответ написан
@grinat
Простая регулярка по диапазону символов, если код символа выше значение(по идее выше 127 идет не латиница), то менять символы по словарю.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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