Термин указывает, что слово существует, но совпадение не удалось? Сначала проверьте представление Unicode
Это слово явно есть в словаре, но программа говорит, что попадания нет. Распечатайте строку и увидите, что обе ее стороны кажутся совершенно одинаковыми. Причина может заключаться не в переводе, а в представлении Unicode: символ с акцентом может быть либо одной кодовой точкой, либо базовой буквой плюс объединяющий символ.
— Длина символов может измениться после нормализации, а вырезание исходного текста с использованием соответствующего смещения клавиши может привести к ошибкам. Сопоставление исходного фрагмента текста необходимо сохранить или переместить на уровне исходного текста.
- Нормализация не может решить все проблемы, которые выглядят одинаково. Запутанные символы и символы нулевой ширины необходимо диагностировать отдельно, и приведенные примеры не обеспечивают полную защиту безопасности.
Это слово явно есть в словаре, но программа говорит, что попадания нет. Распечатайте строку и увидите, что обе ее стороны кажутся совершенно одинаковыми. Проблемы такого типа часто встречаются при пакетном переводе, поиске терминов и сравнении документов. Причина зачастую не в самом переводе, а в представлении Юникода: символ с акцентом может быть либо одной кодовой точкой, либо состоять из основных букв плюс комбинированных символов.
В этой статье используются синтетические образцы для демонстрации метода обработки, который поможет вам сначала найти источник различий, а затем решить, как нормализовать и сохранить данные.
Код проверен на примерах в изолированной среде, это не является гарантией работоспособности всех реальных файлов или продукта. Перед обработкой важных документов, пожалуйста, сохраните оригиналы и просмотрите их по границам и пунктам приема в тексте.
Что делать, если сопоставление терминов не удалось? Вывод в одно предложение
Сначала определите, является ли это разницей в представлении или разницей в содержании: различия в представлении можно выровнять с помощью нормализации, такой как NFC, а различия в содержании необходимо обработать обратно к самому термину.
| твоя ситуация | Рекомендуемые практики | причина |
|---|---|---|
| Строки выглядят одинаково, но совпадение не удается | Выполните нормализацию NFC перед сравнением | NFC часто используется для согласования канонически эквивалентных представлений. |
| Требуются более широкие поисковые соответствия, например, полная и половинная ширина. | Оцените NFKC, но не перезаписывайте исходный текст. | NFKC имеет более широкую область применения, сворачивает совместимые символы и не обязательно подходит для архивных или технических символов. |
| Несогласованный случай | Создание ключей соответствия без учета регистра | Casefold можно использовать для сопоставления без учета регистра |
| Необходимо выделить или вернуть исходный текст | Сохраните исходное сопоставление фрагментов текста или измените положение на уровне исходного текста. | Длина может измениться после нормализации, а прямое использование смещения приведет к сокращению неправильного диапазона. |
Сначала подтвердите, представляет ли это разницу или разницу в содержании.
Перед сравнением выполните нормализацию NFC, которая часто используется для выравнивания канонически эквивалентных представлений. NFKC имеет более широкую область применения и сворачивает некоторые совместимые символы. Это может удовлетворить потребности поиска, но не обязательно потребности в архивном сохранении или сравнении технических символов.
Не путайте «проще сопоставить» с «семантика должна оставаться неизменной».
В синтетическом примере два способа написания é должны быть согласованы после NFC; Полноразмерные буквы и надстрочные символы используются для обозначения изменений, которые внесет NFKC. Это лишь конкретные примеры и не означают, что все проекты должны принимать определенную форму.
Используйте код, чтобы увидеть различия, которых вы раньше не видели.
import unicodedata as ud
composed = "café"
decomposed = "cafe\u0301"
assert composed != decomposed
assert ud.normalize("NFC", composed) == ud.normalize("NFC", decomposed)
fullwidth = "ABC"
assert ud.normalize("NFC", fullwidth) == fullwidth
assert ud.normalize("NFKC", fullwidth) == "ABC"
assert ud.normalize("NFKC", "x²") == "x2"
def term_key(text):
return ud.normalize("NFC", text).casefold()
assert term_key("CAFÉ") == term_key(decomposed)
assert term_key("x²") != term_key("x2")
print([f"U+{ord(c):04X}" for c in decomposed])
В примере для сопоставления терминов выбирается NFC плюс casefold, что является намеренно ограниченной стратегией сопоставления. casefold также выдает результаты свертывания, зависящие от языка, поэтому не удобно просто заменять весь исходный текст сгенерированными ключами.
Исходный текст и соответствующие ключи хранятся отдельно.
Сохраните original_text и создайте еще один normalized_key. Первый используется для отображения, отслеживания и просмотра, а второй — для поиска в соответствии с текущей стратегией.
Также запишите имя и версию политики. В будущем, когда будут использоваться другие правила, индекс можно будет перестроить соответствующим образом, вместо того, чтобы обнаруживать, что исходный текст был необратимо перезаписан.
| наблюдать | Действия, которые стоит попробовать | Вещи, которые нельзя делать случайно |
|---|---|---|
| Разница комбинированных напряжений | Следуйте четкой стратегии для NFC | Заявленное количество персонажей больше не имеет значения |
| Различия в полной и половинной ширине | Оценивайте NFKC с учётом потребностей бизнеса | Напрямую переопределить исходную техническую документацию |
| Разница в корпусе | Создание ключей, не зависящих от регистра | Пишите весь отображаемый текст строчными буквами |
| Всё ещё не попал | Ознакомьтесь с кодовыми пунктами и деталями ниже | Продолжайте накапливать и заменять правила, чтобы испытать удачу |
Нормализация не решает все «одинаковые» проблемы
Латинские буквы с похожими формами могут не иметь стандартизированного или совместимого эквивалентного отношения с символами других письменных букв. Символы нулевой ширины, разные пробелы и распознавание букв в OCR как цифр требуют индивидуальной диагностики.
При работе с чувствительными к безопасности ситуациями, такими как аккаунты или идентификаторы файлов, пожалуйста, не рассматривайте примеры совпадения терминологии в этой статье как полную запутанную защиту символов.
Отслеживание местоположения должно осуществляться отдельно
После нормализации длина струны может измениться. Использование смещений символов в клавише совпадения для обрезки исходного текста может привести к неправильному сокращению диапазона.
При необходимости выделения или обратного написания отображение между исходным текстовым сегментом и соответствующим ключом должно сохраняться или перемещаться на уровне исходного текста.
Прежде чем передавать вопросы переводчикам, сначала держите доказательства
При оценке терминологии и рабочего процесса перевода OmniDoc можно подготовить два представления одного и того же термина в Unicode, записывая исходный текст, используемую стратегию и перевод.
Таким образом, при обнаружении несоответствий можно определить, заключается ли проблема в сопоставлении входных данных или в выборе перевода, не обвиняя во всех различиях модель трансляции.
📊 Сравнение ядра
| Стратегия | Основная функция | Нужна осторожность |
|---|---|---|
| NFC | Стандартные эквивалентные представления по выравниванию подходят для предварительной обработки сравнения | Форма совместимых символов не меняется |
| NFKC | Более широкий диапазон позволяет складывать совместимые символы, что может облегчить поиск | Он может быть непригоден для архивного сохранения или технического сравнения символов |
| casefold | Создание ключей, не зависящих от регистра | Результаты связаны с языком и не должны быть напрямую заменены оригинальным текстом |
🎯 Какой способ тебе подходит?
Если нужно проверить, одинаковые ли две струны
Сначала сделайте нормализацию NFC, затем сравните. Это отправная точка для проверки различий для их отображения.
Если вы делаете поиск или поиск по запросу
Вы можете создать normalized_key и записать название и версию политики, оставив оригинальный текст без изменений.
Если нужно сохранить оригинальный текст для показа или проверки
Оставьте original_text, не перезаписывайте его ключом совпадения.
Если вы имеете дело с архивами, техническими символами или контентом, чувствительным к безопасности
Во-первых, оцените, подходит ли NFKC, и отдельно проверьте наличие символов с нулевой шириной, схожих символов и других проблем. Не рассматривайте нормализацию как полную защиту.
❓ Часто задаваемые вопросы (FAQ)
1. Две струны выглядят одинаково, так почему они не могут совпадать друг с другом?
Возможно, один и тот же акцентированный символ использует два представления: одну кодовую точку или базовую букву плюс комбинированный символ. По сравнению с нормализацией NFC, их можно выровнять.
2. Можно ли использовать NFKC напрямую для объединения всех персонажей?
Не обязательно. NFKC складывает совместимые символы и может не соответствовать требованиям архивного архивирования или технического сравнения символов; оценка должна основываться на бизнес-требованиях.
3. После нормализации можно ли напрямую выделить исходный текст, смещя символы?
Её нельзя использовать напрямую. После нормализации длина может измениться, поэтому необходимо сохранять фрагментные отображения или перемещать их в исходном тексте.
4. Может ли нормализация распознавать всех персонажей с похожей внешностью?
Нет. Символы с похожим внешним видом могут не иметь стандартизированной или совместимости эквивалентности; символы с нулевой шириной, пробелы и ошибки OCR также требуют отдельной диагностики.
📝 Краткое содержание
Когда сопоставление терминов не удаётся, сначала уточните, отражает ли Unicode разницу или разницу содержимого, а затем выберите чёткую стратегию нормализации. Исходный текст и соответствующие ключи хранятся отдельно для баланса эффективности извлечения и отслеживаемости.
Источники: Python unicodedata
Опыт сейчас: загрузите документ, чтобы начать перевод, сохраняя оригинальное форматирование


