Java: как проверить, принадлежит ли символ определенному блоку юникода?

Мне нужно определить, к какому естественному языку принадлежит мой ввод. Цель состоит в том, чтобы различать слова арабский и английский в смешанном вводе, где ввод - это Unicode и извлекается из текстовых узлов XML. Я заметил класс Character.UnicodeBlock. Это связано с моей проблемой? Как заставить его работать?

Редактировать: Подход Character.UnicodeBlock был полезен для арабского языка, но, очевидно, не подходит для английского (или других европейских языков), потому что блок Unicode BASIC_LATIN охватывает символы и непечатаемые символы, а также буквы. Итак, теперь я использую метод matches() объекта String с выражением регулярного выражения "[A-Za-z]+". Я могу смириться с этим, но, возможно, кто-то может предложить более приятный / быстрый способ.

Вы можете получить лучшие результаты, ища "категорию" Unicode, а не конкретный блок ... если только вам не нужен "ровно один конкретный точный блок" :)

rogerdpack 02.04.2020 20:33
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
16
1
11 777
5

Ответы 5

Да, вы можете просто использовать Character.UnicodeBlock.of (char)

У вас проблема, противоположная Вот этот, но, по иронии судьбы, то, что не работает для него, просто должно отлично сработать для вас. Это просто поиск слов на английском языке (только символы, совместимые с ASCII) с reg-exp "\ w".

Если [A-Za-z]+ соответствует вашим требованиям, вы не найдете ничего быстрее или красивее. Однако, если вы хотите сопоставить все буквы в блоке Latin1 (включая буквы с диакритическими знаками и лигатуры), вы можете использовать это:

Pattern p = Pattern.compile("[\\pL&&\\p{L1}]+");

Это пересечение набора всех букв Unicode и набора всех символов Latin1.

Английские символы, как правило, находятся в этих 4 блоках Unicode:

ArrayList<Character.UnicodeBlock> english = new ArrayList<>();
english.add(Character.UnicodeBlock.BASIC_LATIN);
english.add(Character.UnicodeBlock.LATIN_1_SUPPLEMENT);
english.add(Character.UnicodeBlock.LATIN_EXTENDED_A);
english.add(Character.UnicodeBlock.GENERAL_PUNCTUATION);

Итак, если у вас есть String, вы можете перебрать все символы и посмотреть, в каком блоке Unicode находится каждый символ:

for (char currentChar : myString.toCharArray())  
{
    Character.UnicodeBlock unicodeBlock = Character.UnicodeBlock.of(currentChar);
    if (english.contains(unicodeBlock))
    {
        // This character is English
    }
}

Если все они английские, то вы знаете, что у вас есть все английские символы. Вы можете повторить это для любого языка; вам просто нужно выяснить, какие блоки Unicode использует каждый язык.

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

Есть и другие способы определить реальный естественный язык. Такие библиотеки, как langdetect, которыми я пользовался с большим успехом, могут сделать это за вас:

https://code.google.com/p/language-detection/

Unicode Script свойство, вероятно, более полезен. В Java его можно найти с помощью класса java.lang.Character.UnicodeScript:

Character.UnicodeScript script = Character.UnicodeScript.of(c);

Другие вопросы по теме