【问题标题】:Java library for text normalization [closed]用于文本规范化的 Java 库 [关闭]
【发布时间】:2011-05-05 19:23:24
【问题描述】:

我正在寻找允许文本“规范化”的 java 库。类似于标准Normalizer,但更宽(类似于utf8proc LUMP)。

它应该将所有类型的特殊字符替换为 ASCII 等价物(当然,如果可能的话)。所有空格的变体编码为 32,所有减号的变体(长、短、细等)编码为 45,依此类推。

【问题讨论】:

  • PS:看来我必须实现它。有什么想法吗?

标签: java string text normalization


【解决方案1】:

您的具体要求有点模糊,但我想您想要一个功能与 Normalizer 一样,但具有将某些 Unicode 代码点集中到一个字符的功能 - 类似于 utf8proc。

我会采用两步法:

  1. 首先使用Normalizer.normalize 创建您想要的任何(去)构图
  2. 然后遍历结果的代码点,按照自己喜欢的方式替换统一字符。

两者都应该简单明了。对于 2,如果您要处理基本多语言窗格之外的字符,则使用 appropriate algorithm for doing so 遍历代码点。如果您只使用 BMP 代码点,则只需遍历字符即可。

对于您想集中在一起的字符,为映射统一代码点 -> 统一代码点创建一个替换数据结构。 Map<Character, Character>Map<Integer, Integer> 想到这一点。根据您的喜好填充替换映射,例如通过从 utf8proc 的 lump.txtcharacter categories 的来源获取信息。

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】:

    您应该查看CLDR 中的Latin-ASCII 转换。它将在ICU 4.6

    【讨论】:

    • 谢谢,看起来不错的解决方案
    • 拉丁语 ASCII 音译进入 ICU 4.6 / CLDR 1.9。
    【解决方案3】:

    你看过 icu4j 的Normalizer吗?

    normalize 将 Unicode 文本转换为等效的组合或分解形式,从而可以更轻松地对文本进行排序和搜索。 normalize 支持Unicode Standard Annex #15 — Unicode Normalization Forms 中描述的标准规范化形式。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-07
    • 2016-11-18
    • 1970-01-01
    • 2012-05-04
    • 2012-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多