Java getSentenceInstance和空格

Java getSentenceInstance和空格,java,iterator,Java,Iterator,我把一篇课文分成几个句子——创建一个数组,每个项目包含一个完整的句子。我决定最好的方法是使用BreakIterator类。以下是我正在使用的代码: theSentences = new ArrayList<String>(); String myText = aString; //the text is produced through a text box BreakIterator boundary = BreakIterator.getSentenceInstance(); b

我把一篇课文分成几个句子——创建一个数组,每个项目包含一个完整的句子。我决定最好的方法是使用BreakIterator类。以下是我正在使用的代码:

theSentences = new ArrayList<String>();
String myText = aString; //the text is produced through a text box
BreakIterator boundary = BreakIterator.getSentenceInstance();
boundary.setText(myText);
int start = boundary.first();
for (int end = boundary.next();
         end != BreakIterator.DONE;
         start = end, end = boundary.next())
{
    String temp = myText.substring(start,end);
    theSentences.add(temp.trim());
}
thecontents=newarraylist();
字符串myText=aString//文本通过文本框生成
BreakIterator边界=BreakIterator.getSentenceInstance();
边界.setText(myText);
int start=boundary.first();
for(int end=boundary.next();
结束!=BreakIterator.DONE;
开始=结束,结束=边界。下一步()
{
String temp=myText.substring(开始、结束);
内容添加(临时修剪());
}
当用户记得在句末加空格(大多数人都这么做)时,这种方法绝对有效。然而,人们在打字时确实会出错,如果他们没有在句号后加上空格,代码似乎没有意识到句子已经到了结尾。我能做些什么


我确实意识到我可以使用正则表达式,但似乎最好使用BreakIterator,因为这就是它的用途。另外,写一个正则表达式来区分句号和句号的所有其他可能用法也会让我头疼:-)

很少。分句不是100%可以完成的任务。我自己使用和ssplit注释器,它是管道的一部分,用于进行句子拆分。对于简单的任务,这是一个巨大的jar,您可能不想下载,但它显示了这是一个多么复杂的任务


对于句子拆分的轻量级实现,最好实现基于规则的正则表达式方法。

API文档说,
getSentenceInstance
根据语言环境的不同而工作。也许您可以找到一个适合您的语言的区域设置,即使没有尾随空格也可以识别句号。您可能正在寻找StringTokenizer吗?()(特别是,使用句末字符作为分隔符并启用returnDelims标志。(即,
新的StringTokenizer(myText,“.!?”,true)
)@Mike-StringTokenizer有两个问题-首先是使用“?”作为定界符意味着缩写、数字、温度、URL和整个句号的其他用法将被分解为假定的句子“StringTokenizer是一个遗留类,出于兼容性原因保留该类,尽管新代码中不鼓励使用它。建议寻求此功能的任何人使用String的split方法或java.util.regex包。“真正的句子检测是一种机器学习任务。请查看Apache OpenNLP()的句子检测文档