2010-01-28 85 views
2

我一直在尝试使用:如何拆分段落成句子

$string="The Dr. is here!!! I am glad I'm in the U.S.A. for the Dr. quality is great!!!!!!"; 
preg_match_all('~.*?[?.!]~s',$string,$sentences); 
print_r($sentences); 

但它不会对博士,USA工作等

有没有人有什么更好的建议?

+0

我不知道正则表达式是否足够好,但我在想如果有一种方法可以在最后一个句子之前说出最少5个字符或类似的东西...... – 2010-01-28 22:04:48

+0

类似这样的: (\ W +'?\ s?)+ \。 – 2010-01-28 22:08:09

+1

那么,为了满足这种情况,你需要一个正则表达式来检查一个空格后跟一个大写字母,然后再进行分割。我对Regex的不熟悉,可能你可以做到这一点,但我认为规则很快会变得更加复杂,可能你会使用一个简单的正则表达式+一个小型的状态机来正确执行它。 – 2010-01-28 22:14:01

回答

1

嗯,也许你可以试试$sentences = preg_split('/.*?[?.!]+\s+/', $string);

0

这几乎是不可能的,因为你的例子清楚地表明,在例如可以使用的标点字符Dr.,U.S.A等,使得不可能知道句子开始/结束的地方。

您必须搜索以下字符以确定新句子是否跟在后面(开始于)您提及的标点符号之后。

+0

没有什么是不可能的... – 2010-01-28 23:41:31

+1

几乎不可能....用这种方法..把“几乎”:)问候 – Andreas 2010-01-29 11:07:32

12

没有任何简单的解决方案。你需要在你的应用程序中做一些自然语言处理(NLP)并识别每个句子。有些东西叫OpenNLP,它是一个基于JAVA的NLP解析器工具。或Ruby中的Stanford NLP parser。你可以找到类似于PHP的东西。

here我在PHP中找到了一组用于自然语言处理的类。

+0

+1 - 实际上,即使是使用NLP的解决方案,在面对非常非正式(例如草率)写作时也很可能失败。如果人们不遵循标点符号的基本规则,那么你就被塞满了。 – 2010-01-28 22:23:40

+0

似乎该项目的文件不再在线 – 2012-04-03 09:12:42