Есть ли список символов, похожих на английские буквы? - PullRequest
30 голосов
/ 29 февраля 2012

У меня проблемы с фильтрацией ненормативной лексики для веб-форума, написанного на Python.

В рамках этого я пытаюсь написать функцию, которая принимает слово и возвращает все возможные ложные варианты написания.этого слова, которые используют визуально похожие символы вместо определенных букв (например, s † å © køv € rƒ | øw).

Я ожидаю, что мне придется со временем расширять этот список, чтобы охватить творчество людей, ноесть ли где-нибудь в Интернете список, который я мог бы использовать в качестве отправной точки?

Ответы [ 4 ]

36 голосов
/ 09 апреля 2012

Возможно, это гораздо глубже, чем нужно, но недостаточно широко, чтобы охватить ваш вариант использования, но консорциум Unicode должен был бороться с атаками на интернационализированные доменные имена и придумал этот список гомографий (символы стот же или подобный рендеринг):

http://www.unicode.org/Public/security/latest/confusables.txt

Может быть как минимум отправной точкой.

13 голосов
/ 12 декабря 2013

http://en.wikipedia.org/wiki/Letterlike_Symbols

Это гораздо менее понятно, но более понятно.

4 голосов
/ 01 февраля 2018

Я создал класс Python, чтобы сделать именно это, основываясь на юникодовой ссылке Робина для «confusables»

https://github.com/wanderingstan/Confusables

Например, «Hello» будет расширен в следующий наборклассов символов регулярного выражения:

[H\H\ℋ\ℌ\ℍ\?\?\?\?\?\?\?\?\?\?\Η\?\?\?\?\?\Ⲏ\Н\Ꮋ\ᕼ\ꓧ\?\Ⱨ\Ң\Ħ\Ӊ\Ӈ] [e\℮\e\ℯ\ⅇ\?\?\?\?\?\?\?\?\?\?\?\?\ꬲ\е\ҽ\ɇ\ҿ] [l\‎\|\∣\⏽\│1\‎\۱\?\‎\?\?\?\?\?I\I\Ⅰ\ℐ\ℑ\?\?\?\?\?\?\?\?\?\?\?\Ɩ\l\ⅼ\ℓ\?\?\?\?\?\?\?\?\?\?\?\?\?\ǀ\Ι\?\?\?\?\?\Ⲓ\І\Ӏ\‎\‎\‎\‎\‎\‎\‎\‎\ⵏ\ᛁ\ꓲ\?\?\?\‎\‎\ł\ɭ\Ɨ\ƚ\ɫ\‎\‎\‎\‎\ŀ\Ŀ\ᒷ\?\⒈\‎\⒓\㏫\㋋\㍤\⒔\㏬\㍥\⒕\㏭\㍦\⒖\㏮\㍧\⒗\㏯\㍨\⒘\㏰\㍩\⒙\㏱\㍪\⒚\㏲\㍫\lj\IJ\‖\∥\Ⅱ\ǁ\‎\?\⒒\Ⅲ\?\㏪\㋊\㍣\Ю\⒑\㏩\㋉\㍢\ʪ\₶\Ⅳ\Ⅸ\ɮ\ʫ\㏠\㋀\㍙] [l\‎\|\∣\⏽\│1\‎\۱\?\‎\?\?\?\?\?I\I\Ⅰ\ℐ\ℑ\?\?\?\?\?\?\?\?\?\?\?\Ɩ\l\ⅼ\ℓ\?\?\?\?\?\?\?\?\?\?\?\?\?\ǀ\Ι\?\?\?\?\?\Ⲓ\І\Ӏ\‎\‎\‎\‎\‎\‎\‎\‎\ⵏ\ᛁ\ꓲ\?\?\?\‎\‎\ł\ɭ\Ɨ\ƚ\ɫ\‎\‎\‎\‎\ŀ\Ŀ\ᒷ\?\⒈\‎\⒓\㏫\㋋\㍤\⒔\㏬\㍥\⒕\㏭\㍦\⒖\㏮\㍧\⒗\㏯\㍨\⒘\㏰\㍩\⒙\㏱\㍪\⒚\㏲\㍫\lj\IJ\‖\∥\Ⅱ\ǁ\‎\?\⒒\Ⅲ\?\㏪\㋊\㍣\Ю\⒑\㏩\㋉\㍢\ʪ\₶\Ⅳ\Ⅸ\ɮ\ʫ\㏠\㋀\㍙] [o\ం\ಂ\ം\ං\०\੦\૦\௦\౦\೦\൦\๐\໐\၀\‎\۵\o\ℴ\?\?\?\?\?\?\?\?\?\?\?\?\ᴏ\ᴑ\ꬽ\ο\?\?\?\?\?\σ\?\?\?\?\?\ⲟ\о\ჿ\օ\‎\‎\‎\‎\‎\‎\‎\‎\‎\‎\‎\‎\‎\‎\‎\‎\‎\‎\‎\‎\ഠ\ဝ\?\?\?\?\‎\ø\ꬾ\ɵ\ꝋ\ө\ѳ\ꮎ\ꮻ\ꭴ\‎\ơ\œ\ɶ\∞\ꝏ\ꚙ\ൟ\တ]

Это регулярное выражение сопоставляется с "?℮?1೦"

0 голосов
/ 26 октября 2017

У меня нет решения как такового, но у меня есть некоторые идеи.

Подход

@ collapsar в комментариях в принципе звучит для меня хорошо, но я думаю, что вы захотите использовать готовую библиотеку OCR, а не пытаться анализировать изображения самостоятельно. Для создания изображений я использовал бы шрифт, похожий на что-то в семействе DejaVu, потому что он имеет хорошее покрытие относительно неясных символов Unicode.

Другой простой способ получить данные - посмотреть на декомпозиции "предварительно составленных" символов, таких как "а"; если символ можно разложить на одну или несколько глав, за которыми следует базовый символ, который выглядит как английская буква, он, вероятно, выглядит как сама английская буква.

Ничто не сравнится с большим количеством данных для такой проблемы. Вы можете собрать много хороших примеров замены персонажей, которые делали люди, просматривая нужные веб-форумы. Затем вы можете использовать эту процедуру для изучения новых: сначала найдите «слова», содержащие в основном символы, которые вы можете идентифицировать, а также некоторые, которые вы не можете. Сделайте регулярное выражение из слова, преобразовав все, что вы можете, в обычные буквы и заменив все остальное на «.». Затем сопоставьте свое регулярное выражение со словарем, и если вы получите только одно совпадение, у вас есть несколько очень хороших кандидатов на то, что должны представлять неизвестные символы. (Я бы на самом деле не использовал регулярное выражение для поиска в словаре, но вы поняли.)

Вместо форумов по майнингу вы можете использовать n-граммовый корпус Google (http://storage.googleapis.com/books/ngrams/books/datasetsv2.html) вместо этого, но сейчас я не могу проверить, содержит ли он нужный вам псевдослов.

...