gpt4 book ai didi

java - BreakIterator 无法正确处理中文文本

转载 作者:塔克拉玛干 更新时间:2023-11-01 23:03:31 24 4
gpt4 key购买 nike

我使用 BreakIterator.getWordInstance 将中文文本拆分为单词。这是我的例子

import java.text.BreakIterator;
import java.util.Locale;

public class Sample {
public static void main(String[] args) {
String stringToExamine = "I like to eat apples. 我喜欢吃苹果。";

//print each word in order
BreakIterator boundary = BreakIterator.getWordInstance(new Locale("zh", "CN"));
boundary.setText(stringToExamine);

printEachForward(boundary, stringToExamine);
}

public static void printEachForward(BreakIterator boundary, String source) {
int start = boundary.first();
for (int end = boundary.next(); end != BreakIterator.DONE; start = end, end = boundary.next()) {
System.out.println(start + ": " + source.substring(start, end));
}
}
}

我的示例文本取自 https://stackoverflow.com/a/42219474/954439

我得到的输出是

0: I
1:
2: like
6:
7: to
9:
10: eat
13:
14: apples
20: .
21:
22: 我喜欢吃苹果
28: 。

然而,预期的输出是

0 I
1
2 like
6
7 to
9
10 eat
13
14 apples
20 .
21
22 我
23 喜欢
25 吃
26 苹果
28 。

我什至尝试过纯中文文本,但单词在空格和标点符号上都被打断了。

我正在为服务器编程,所以 jar 文件的大小不是一个大问题。我正在尝试使用 Least Common Subsequence(但在单词上)查找给定内容中与样本内容不同的单词数。

我做错了什么?

最佳答案

标准 BreakIterator 不支持检测 CJK 表意文字的完整字符串中的“单词”边界。有一个bug report关于这个主题,但它在 2006 年以“无法修复”为由关闭。

相反,您需要使用 ICU implementation .如果您在 Android 上进行开发,那么您已经将其作为 android.icu.text.BreakIterator。否则,您需要从 http://site.icu-project.org/download 下载 ICU4J 库,其中包含 com.ibm.icu.text.BreakIterator

关于java - BreakIterator 无法正确处理中文文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44507838/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com