2010-04-21 96 views
21

我写这一段代码分割字符串,并将其存储在一个字符串数组: -将字符串分割成句子

String[] sSentence = sResult.split("[a-z]\\.\\s+"); 

不过,我已经添加了[AZ]因为我想处理一些缩写问题。但后来我的结果显示为这样: -

此外,当埃弗雷特试图指导他们在基础数学他们证明unresponsiv

我知道我失去了在拆分功能指定的模式。我可以失去这段时间,但丢失这个词的最后一个字母会扰乱它的意义。

有人可以帮我解决这个问题,另外,有人可以帮我处理缩写吗?例如,因为我基于句点分割字符串,所以我不想丢失缩写。

回答

45

即使对于拉丁语言(如英语)来说,解析句子也不是一项简单的任务。像你在你的问题中概述的那种天真的方法经常失败,以至于在实践中证明它是无用的。

更好的方法是使用配置了正确语言环境的BreakIterator

BreakIterator iterator = BreakIterator.getSentenceInstance(Locale.US); 
String source = "This is a test. This is a T.L.A. test. Now with a Dr. in it."; 
iterator.setText(source); 
int start = iterator.first(); 
for (int end = iterator.next(); 
    end != BreakIterator.DONE; 
    start = end, end = iterator.next()) { 
    System.out.println(source.substring(start,end)); 
} 

产生以下结果:

  1. 这是一个测试。
  2. 这是T.L.A.测试。
  3. 现在有一个博士在里面。
+6

当我使用这句话时 - “我的朋友琼斯先生有一只新狗。”由于琼斯的资本化,它正在发生。你知道一个方法吗?否则BreakIterator非常棒! – nbz 2014-05-02 10:53:22

11

这将是很难得到一个正则表达式在所有情况下工作,但要立即解决的问题,你可以使用一个回顾后:

String sResult = "This is a test. This is a T.L.A. test."; 
String[] sSentence = sResult.split("(?<=[a-z])\\.\\s+"); 

结果:

This is a test 
This is a T.L.A. test. 

注意,有是不以大写字母结尾的缩写,例如缩写,先生等等......而且还有句子不会以句号结束!

+0

谢谢您的回复。 – 2010-04-22 00:15:54

+1

这将在9.3%的句子中失败。以及使用省略号的句子。并在他们的错字。等等。不管你做什么,你的代码都会犯错,从人的角度来看。 – 2010-04-22 01:12:00

4

如果可以,请使用自然语言处理工具,例如LingPipe。有许多细微之处,这将是非常困难使用正则表达式,例如,(例如 :-))来捕捉,先生缩写省略号(...),等等

在LingPipe网站有一个非常简单的关于Sentence Detection的教程。

+0

嗨,我检查了教程。它看起来很完美,但是我似乎无法弄清楚如何在eclipse中使用它。你能帮我一下吗? – 2010-04-23 22:46:18