【问题标题】:getSentenceInstance and whitespacegetSentenceInstance 和空格
【发布时间】: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/…

标签: java iterator


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2013-05-05
    • 1970-01-01
    • 2021-11-05
    • 2010-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多