символы юникода

В моем приложении у меня есть строки unicode, мне нужно указать, на каком языке находится строка, я хочу сделать это, сузив список возможных языков, определив, в каком диапазоне находятся символы строки.

У меня есть диапазоны из http://jrgraphix.net/research/unicode_blocks.php.

И возможные языки из http://unicode-table.com/en/.

Проблема в том, что алгоритм должен обнаруживать все языки, знает ли кто-нибудь более широкое сопоставление диапазонов Unicode с языками?

Спасибо Войцех


person user1701097    schedule 19.12.2012    source источник
comment
Система письма !== язык. Многие языки имеют одну и ту же систему письма. Используйте статистический анализатор, например, из проекта Tika, для определения языков. tika.apache.org   -  person deceze♦    schedule 19.12.2012
comment
Вы не можете надежно определить язык, даже гугл-переводчик не может. Самый простой способ - использовать API-интерфейс Google Translate и посмотреть, на каком языке он предлагает текст. Выполнение этого алгоритма самостоятельно ... может быть, не так просто = D   -  person Esailija    schedule 19.12.2012


Ответы (2)


На самом деле это невозможно по нескольким причинам:

  • Многие языки имеют одну и ту же систему письма. Посмотрите, например, на английский и голландский. Оба используют основной латинский алфавит. Только взглянув на диапазон кодовых точек, вы просто не сможете их различить.

  • Некоторые языки используют больше символов, но нет гарантии, что конкретный фрагмент текста их содержит. Немецкий, например, использует основной латинский алфавит плюс «ä», «ö», «ü» и «ß». Хотя эти буквы не особенно редки, без них можно легко составить целые предложения. Поэтому в коротком тексте их может и не быть. Таким образом, опять же, недостаточно смотреть только на кодовые точки.

  • Текст не всегда «чист». Английский текст может содержать французские буквы из-за французского заимствования (например, «дежавю»). Или он может содержать иностранные слова, потому что в тексте говорится о иностранном (например, «Götterdämmerung — опера Рихарда Вагнера…» или «Великая Китайская стена (万里长城) — это…»). Если рассматривать только кодовые точки, это может ввести в заблуждение.

Подводя итог, нет, вы не можете надежно сопоставить диапазоны кодовых точек с языками.

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

Но это тяжело и много работы. Лучше использовать существующее решение, например, рекомендованное deceze и Esailija.

person Sebastian Negraszus    schedule 20.12.2012
comment
Я понимаю, что не могу определить точный язык на основе диапазона символов Юникода, я хочу сузить список возможностей до нескольких языков. - person user1701097; 21.12.2012

Мне нравится предложение использовать что-то вроде Google Translate, так как они будут делать всю работу за вас.

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

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

Предположительно Google делает гораздо более сложную версию этого.

person ndp    schedule 08.09.2013