Библиотека Java для нормализации текста

Я ищу java-библиотеку, которая позволяет "нормализовать" текст. Что-то похоже на стандартное Normalizer, но шире (что-то вроде utf8proc LUMP).

Он должен заменить все виды специальных символов на эквиваленты ASCII (если это возможно, конечно). Все варианты пространства для кода 32, все варианты минусов (длинный, короткий, тонкий и т.д.) До кода 45 и т.д.

Ответ 1

Вы должны посмотреть Latin-ASCII в CLDR. он будет находиться в ICU 4.6

Ответ 2

Ваши специфические требования немного расплывчаты, но я предполагаю, что вы хотите что-то, что делает Normalizer, но с функцией скомбинировать определенные кодовые обозначения Unicode с одним символом - аналогично utf8proc.

Я бы пошел на двухэтапный подход:

  • Сначала используйте Normalizer.normalize, чтобы создать любой (де-) состав, который вы хотите.
  • Затем итерации через кодовые точки результата и замените унифицировать символы так, как вам нравится.

Оба должны быть простыми. Для 2, если вы имеете дело с персонажами из базовой многоязычной панели, то итерации через кодовые точки с помощью соответствующего алгоритма для этого. Если вы используете только кодовые точки BMP, просто перебирайте символы.

Для символов, которые вы хотели бы объединить вместе, создайте структуру данных подстановки для отображения единичной кодовой точки → унифицированной кодовой точки. Map<Character, Character> или Map<Integer, Integer> приходят на ум за это. Заполните карту замещения по своему вкусу, например. взяв информацию из utf8proc lump.txt и источник категории символов.

Map<Character, Character> LUMP;

static {
  LUMP = new HashMap<Character, Character>();
  LUMP.put('\u2216', '\\'); // set minus
  LUMP.put('\u007C', '|'); // divides
  // ...
}

Создайте новый StringBuilder или нечто подобное с тем же размером, что и ваша нормализованная строка. При повторении кодовых точек проверьте, не имеет ли значение LUMP.get(codePoint). В этом случае добавьте возвращаемое значение, иначе добавьте точку кода в StringBuilder. Это должно быть.

При необходимости вы можете поддерживать способ загрузки содержимого LUMP из конфигурации, например. из объекта Properties.

Ответ 3

Вы заглянули в icu4j Normalizer?

normalize преобразует текст Unicode в эквивалентную составленную или разложенную форму, что позволяет упростить сортировку и поиск текста. normalize поддерживает стандартные формы нормализации, описанные в Unicode Standard Annex # 15 - Unicode Normalization Forms.