用于文本规范化的 Java 库 [关闭]
Posted
技术标签:
【中文标题】用于文本规范化的 Java 库 [关闭]【英文标题】:Java library for text normalization [closed] 【发布时间】:2011-05-05 19:23:24 【问题描述】:我正在寻找允许文本“规范化”的 java 库。类似于标准Normalizer,但更宽(类似于utf8proc LUMP)。
它应该将所有类型的特殊字符替换为 ASCII 等价物(当然,如果可能的话)。所有空格的变体编码为 32,所有减号的变体(长、短、细等)编码为 45,依此类推。
【问题讨论】:
PS:看来我必须实现它。有什么想法吗? 【参考方案1】:您的具体要求有点模糊,但我想您想要一个功能与 Normalizer 一样,但具有将某些 Unicode 代码点集中到一个字符的功能 - 类似于 utf8proc。
我会采用两步法:
-
首先使用Normalizer.normalize 创建您想要的任何(去)构图
然后遍历结果的代码点,按照自己喜欢的方式替换统一字符。
两者都应该简单明了。对于 2,如果您要处理基本多语言窗格之外的字符,则使用 appropriate algorithm for doing so 遍历代码点。如果您只使用 BMP 代码点,则只需遍历字符即可。
对于您想集中在一起的字符,为映射统一代码点 -> 统一代码点创建一个替换数据结构。 Map<Character, Character>
或 Map<Integer, Integer>
想到这一点。根据您的喜好填充替换映射,例如通过从 utf8proc 的 lump.txt 和 character 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 中描述的标准规范化形式。
【讨论】:
是的,我查过了。默认情况下,它不满足我的需要。我看过 Normalizer2 (icu-project.org/apiref/icu4j/com/ibm/icu/text/Normalizer2.html),它可以配置,但它不是简单的任务。以上是关于用于文本规范化的 Java 库 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章