BreakIterator 无法正确处理中文文本
BreakIterator not working correctly with Chinese text
我用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));
}
}
}
我的示例文本来自
我得到的输出是
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 文件大小不是一个大问题。我正在尝试使用最少公共子序列(但在单词上)查找给定内容中与样本内容不同的单词数。
我做错了什么?
标准 BreakIterator
不支持在 CJK 表意文字的完整字符串中检测 "word" 边界。有一个关于这个主题的 bug report,但它在 2006 年作为 "Won't Fix".
关闭了
相反,您需要使用 ICU implementation. If you're developing on Android, you already have this as android.icu.text.BreakIterator
. Otherwise, you'll need to download the ICU4J library from http://site.icu-project.org/download,其形式为 com.ibm.icu.text.BreakIterator
。
我用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));
}
}
}
我的示例文本来自
我得到的输出是
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 文件大小不是一个大问题。我正在尝试使用最少公共子序列(但在单词上)查找给定内容中与样本内容不同的单词数。
我做错了什么?
标准 BreakIterator
不支持在 CJK 表意文字的完整字符串中检测 "word" 边界。有一个关于这个主题的 bug report,但它在 2006 年作为 "Won't Fix".
相反,您需要使用 ICU implementation. If you're developing on Android, you already have this as android.icu.text.BreakIterator
. Otherwise, you'll need to download the ICU4J library from http://site.icu-project.org/download,其形式为 com.ibm.icu.text.BreakIterator
。