作者:jimscloudy | 来源:互联网 | 2023-02-01 14:10
我使用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));
}
}
}
我的示例文本来自/sf/ask/17360801/
我得到的输出是
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文件大小不是一个大问题.我试图找到给定内容中与使用最小公共子序列(但在单词上)的示例内容相比不同的单词数.
我究竟做错了什么?
1> Sean Van Gor..:
该标准BreakIterator
不支持在不间断的CJK表意文字字符串中检测"单词"边界.有一个关于这个主题的错误报告,但它在2006年被关闭为"不会修复".
相反,您需要使用ICU实现.如果您是在Android上进行开发,那么您已经拥有了这个android.icu.text.BreakIterator
.否则,您需要从http://site.icu-project.org/download下载ICU4J库,其中包含它com.ibm.icu.text.BreakIterator
.