Существует ли список символов, похожих на английские буквы?
Я пытаюсь реализовать фильтрацию нецензурной лексики для веб-форума, написанного на Python.
В рамках этой задачи я пишу функцию, которая принимает слово и возвращает все возможные "псевдонаписания" этого слова, используя визуально схожие символы вместо определённых букв (например, s†å©køv€rƒ|øw).
Я понимаю, что со временем мне придётся расширить этот список для учета креативности пользователей, но существует ли где-то в интернете список, который я мог бы использовать в качестве отправной точки?
5 ответ(ов)
Это, вероятно, гораздо глубже, чем вам нужно, но при этом не охватывает весь ваш случай использования. Тем не менее, Консорциум Unicode столкнулся с проблемами, связанными с атаками на интернационализированные доменные имена, и составил список омографов (символов с одинаковым или схожим отображением):
http://www.unicode.org/Public/security/latest/confusables.txt
Это может стать отправной точкой по крайней мере.
Символы, похожие на буквы (Letterlike Symbols) – это специальный блок символов Unicode, который включает в себя альтернативные версии букв и знаков для различных целей, таких как математические выражения, списки и другие контексты. Эти символы часто используются для добавления стиля или для представления информации в более графическом виде.
Так как блок символов содержит буквы и знаки, которые могут отображаться как обычные буквы, при использовании их в тексте необходимо помнить о совместимости с различными шрифтами и системами отображения. Например, некоторые символы могут не поддерживаться в определённых приложениях или веб-браузерах, что может привести к неправильному отображению.
Важно отметить, что, хотя символы могут выглядеть визуально аналогично обычным буквам, они могут не иметь той же семантики или функций, что делает их менее универсальными для некоторых применений. Однако их использование может значительно улучшить визуальное восприятие текста в определённых ситуациях.
Вы создали класс на Python для решения своей задачи, вдохновленный ссылкой Робина на "confusables".
Вы можете ознакомиться с реализованным решением на GitHub: Confusables.
Например, строка "Hello" будет расширена в набор классов символов для регулярных выражений:
[H\H\ℋ\ℌ\ℍ\𝐇\𝐻\𝑯\𝓗\𝕳\𝖧\𝗛\𝘏\𝙃\𝙷\Η\𝚮\𝛨\𝜢\𝝜\𝞖\Ⲏ\Н\Ꮋ\ᕼ\ꓧ\𐋏\Ⱨ\Ң\Ħ\Ӊ\Ӈ]
[e\℮\e\ℯ\ⅇ\𝐞\𝑒\𝒆\𝓮\𝔢\𝕖\𝖊\𝖾\𝗲\𝘦\𝙚\𝚎\ꬲ\е\ҽ\ɇ\ҿ]
[l\\|\∣\⏽\│1\\۱\𐌠\\𝟏\𝟙\𝟣\𝟭\𝟷I\I\Ⅰ\ℐ\ℑ\𝐈\𝐼\𝑰\𝓘\𝕀\𝕴\𝖨\𝗜\𝘐\𝙉\𝙸\Ɩ\l\ⅼ\ℓ\𝐥\𝑙\𝒍\𝓁\𝓵\𝔩\𝕝\𝖑\𝗅\𝗹\𝘭\𝙡\𝚕\ǀ\Ι\𝚰\𝛪\𝜤\𝝞\𝞘\Ⲓ\І\Ӏ\\\\\\\\\ⵏ\ᛁ\ꓲ\𖼨\𐊊\𐌉\\\ł\ɭ\Ɨ\ƚ\ɫ\\\\\ŀ\Ŀ\ᒷ\🄂\⒈\\⒓\㏫\㋋\㍤\⒔\㏬\㍥\⒕\㏭\㍦\⒖\㏮\㍧\⒗\㏯\㍨\⒘\㏰\㍩\⒙\㏱\㍪\⒚\㏲\㍫\lj\IJ\‖\∥\Ⅱ\ǁ\\𐆙\⒒\Ⅲ\𐆘\㏪\㋊\㍣\Ю\⒑\㏩\㋉\㍢\ʪ\₶\Ⅳ\Ⅸ\ɮ\ʫ\㏠\㋀\㍙]
[l\\|\∣\⏽\│1\\۱\𐌠\\𝟏\𝟙\𝟣\𝟭\𝟷I\I\Ⅰ\ℐ\ℑ\𝐈\𝐼\𝑰\𝓘\𝕀\𝕴\𝖨\𝗜\𝘐\𝙉\𝙸\Ɩ\l\ⅼ\ℓ\𝐥\𝑙\𝒍\𝓁\𝓵\𝔩\𝕝\𝖑\𝗅\𝗹\𝘭\𝙡\𝚕\ǀ\Ι\𝚰\𝛪\𝜤\𝝞\𝞘\Ⲓ\І\Ӏ\\\\\\\\\ⵏ\ᛁ\ꓲ\𖼨\𐊊\𐌉\\\ł\ɭ\Ɨ\ƚ\ɫ\\\\\ŀ\Ŀ\ᒷ\🄂\⒈\\⒓\㏫\㋋\㍤\⒔\㏬\㍥\⒕\㏭\㍦\⒖\㏮\㍧\⒗\㏯\㍨\⒘\㏰\㍩\⒙\㏱\㍪\⒚\㏲\㍫\lj\IJ\‖\∥\Ⅱ\ǁ\\𐆙\⒒\Ⅲ\𐆘\㏪\㋊\㍣\Ю\⒑\㏩\㋉\㍢\ʪ\₶\Ⅳ\Ⅸ\ɮ\ʫ\㏠\㋀\㍙]
[o\ం\ం\ം\ං\०\੦\૦\௦\౦\೦\൦\๐\໐\၀\\۵\o\ℴ\𝐨\𝑜\𝒐\𝓸\𝔬\𝕠\𝖔\𝗈\𝗼\𝘰\𝙤\𝚘\ᴏ\ᴑ\ꬽ\ο\𝛐\𝜊\𝝄\𝝾\𝞸\σ\𝛔\𝜎\𝝈\𝞂\𝞼\ⲟ\о\ჿ\օ\\\\\\\\\\\\\\\\\\\\\ഠ\ဝ\𐓪\𑣈\𑣗\𐐬\\ø\ꬾ\ɵ\ꝋ\ө\ѳ\ꮎ\ꮻ\ꭴ\\ơ\œ\ɶ\∞\ꝏ\ꚙ\ൟ\တ]
Это регулярное выражение будет успешно сопоставляться с текстом "𝓗℮𝐥1೦".
У меня нет решения в полном смысле этого слова, но есть несколько идей.
Подход @collapsar в комментариях звучит вполне разумно, но я бы рекомендовал использовать готовую библиотеку OCR, вместо того чтобы пытаться анализировать изображения самостоятельно. Для создания изображений я бы использовал шрифт, например, из семейства DejaVu, так как он хорошо поддерживает относительно редкие символы Юникода.
Еще один простой способ получить данные — это взглянуть на разложение «предкомпозированных» символов, таких как «à». Если символ можно разложить на один или несколько комбинирующих символов, за которыми следует базовый символ, похожий на английскую букву, то, вероятно, он сам выглядит как английская буква.
Ничто не заменит большого объема данных для решения этой задачи. Вы можете собрать множество хороших примеров замен символов, которые сделали люди, просматривая соответствующие веб-форумы. Затем вы можете использовать эту процедуру, чтобы учиться на новом: сначала найдите «слова», состоящие в основном из символов, которые вы можете идентифицировать, вместе с некоторыми, которые не можете. Создайте регулярное выражение из слова, заменив все, что можете, на обычные буквы, а все остальное - на «.» Затем сопоставьте ваше регулярное выражение со словарем, и если у вас будет только одно совпадение, у вас будут очень хорошие кандидаты на то, что обозначают неизвестные символы. (На самом деле я бы не использовал регулярное выражение для поиска в словаре, но вы поняли идею.)
Вместо того чтобы копать форумы, вы можете попробовать использовать корпус n-грамм от Google (http://storage.googleapis.com/books/ngrams/books/datasetsv2.html), но я не могу проверить прямо сейчас, содержит ли он нужные вам псевдословa.
На другом источнике представлено несколько креативных вариантов, которых нет в списке Unicode:
https://www.i2symbol.com/abc-123
Нажмите на символ, чтобы увидеть совпадения.
UnicodeEncodeError: 'ascii' кодек не может закодировать символ u'\xa0' на позиции 20: номер не в диапазоне (128)
UnicodeDecodeError: Кодек 'charmap' не может декодировать байт X в позиции Y: символ отображается как <неопределённый>
Как лучше всего удалить акценты (нормализовать) в строке Unicode Python?
Python DictWriter: Запись UTF-8 закодированных CSV файлов
Как получить не-ASCII URL с помощью urlopen?