【发布时间】:2012-12-20 09:26:47
【问题描述】:
我正在获取一个文本并将其拆分成句子 - 创建一个数组,其中每个项目都包含一个完整的句子。我决定最好的方法是使用 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());
}
当用户记得在句子末尾包含一个空格时(大多数人都会这样做),这非常有效。然而,人们在打字时确实会出错,如果他们没有在句号后加一个空格,代码似乎并没有意识到已经到了句子的结尾。我该怎么办?
我确实意识到我可以改用正则表达式,但似乎最好使用 BreakIterator,因为这就是它的用途。还要编写一个正则表达式来区分句号和句号的所有其他可能用途,这让我很头疼:-)
【问题讨论】:
-
API 文档说
getSentenceInstance的工作方式因地区而异。也许您可以找到适合您的语言的语言环境并且即使没有尾随空格也能识别句号。 -
您是否正在寻找 StringTokenizer? (docs.oracle.com/javase/1.4.2/docs/api/java/util/…)
-
(具体来说,使用句尾字符作为分隔符并启用 returnDelims 标志。(即
new StringTokenizer(myText,".!?", true)) -
@Mike - StringTokenizer 的两个问题 - 首先是使用“.?!”作为分隔符意味着缩写、数字、温度、URL 和一大堆其他使用的句点将被分解为假定的句子。另一个问题是 javadoc 说“StringTokenizer 是一个遗留类,尽管出于兼容性原因而保留不鼓励在新代码中使用它。建议任何寻求此功能的人使用 String 的 split 方法或 java.util.regex 包。"
-
真正的句子检测是某种机器学习任务。查看Apache OpenNLP的句子检测文档(opennlp.apache.org/documentation/1.5.2-incubating/manual/…)