it-swarm.com.ru

Есть ли список символов, похожих на английские буквы?

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

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

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

26
Paul D. Waite

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

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

Мог бы сделать отправную точку по крайней мере.

32
Robin Whittleton

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

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

12
spnzr

Я создал класс 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೦"

3
Stan James

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

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

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

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

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

0
John Williams