Java文本规范化库

11

我正在寻找一款Java库,可以对文本进行“标准化”,类似于标准的Normalizer,但是更广泛(类似于utf8proc LUMP)。

它应该将所有类型的特殊字符替换为ASCII等效字符(如果可能的话)。将所有空格的变体替换为代码32,将所有破折号的变体(长、短、细等)替换为代码45等。


看起来我得实现它。有什么想法怎么做吗? - valodzka
3个回答

4
您的具体要求有点模糊,但我认为您想要一个类似于utf8proc的东西,它可以将某些Unicode代码点合并成一个字符,就像Normalizer所做的那样。
我建议采用两步方法:
1.首先使用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对象中加载。

2

谢谢,看起来是一个不错的解决方案。 - valodzka
1
拉丁-ASCII转换器已经进入ICU 4.6 / CLDR 1.9。 - Steven R. Loomis

1

是的,我已经检查过了。默认情况下它不能满足我的需求。我已经查看了Normalizer2(http://icu-project.org/apiref/icu4j/com/ibm/icu/text/Normalizer2.html),它可以进行配置,但这不是一个简单的任务。 - valodzka

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接