我一直在尝试使用:如何拆分段落成句子
$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工作等
有没有人有什么更好的建议?
我一直在尝试使用:如何拆分段落成句子
$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工作等
有没有人有什么更好的建议?
嗯,也许你可以试试$sentences = preg_split('/.*?[?.!]+\s+/', $string);
这几乎是不可能的,因为你的例子清楚地表明,在例如可以使用的标点字符Dr.,U.S.A等,使得不可能知道句子开始/结束的地方。
您必须搜索以下字符以确定新句子是否跟在后面(开始于)您提及的标点符号之后。
没有什么是不可能的... – 2010-01-28 23:41:31
几乎不可能....用这种方法..把“几乎”:)问候 – Andreas 2010-01-29 11:07:32
没有任何简单的解决方案。你需要在你的应用程序中做一些自然语言处理(NLP)并识别每个句子。有些东西叫OpenNLP,它是一个基于JAVA的NLP解析器工具。或Ruby中的Stanford NLP parser。你可以找到类似于PHP的东西。
here我在PHP中找到了一组用于自然语言处理的类。
+1 - 实际上,即使是使用NLP的解决方案,在面对非常非正式(例如草率)写作时也很可能失败。如果人们不遵循标点符号的基本规则,那么你就被塞满了。 – 2010-01-28 22:23:40
似乎该项目的文件不再在线 – 2012-04-03 09:12:42
我不知道正则表达式是否足够好,但我在想如果有一种方法可以在最后一个句子之前说出最少5个字符或类似的东西...... – 2010-01-28 22:04:48
类似这样的: (\ W +'?\ s?)+ \。 – 2010-01-28 22:08:09
那么,为了满足这种情况,你需要一个正则表达式来检查一个空格后跟一个大写字母,然后再进行分割。我对Regex的不熟悉,可能你可以做到这一点,但我认为规则很快会变得更加复杂,可能你会使用一个简单的正则表达式+一个小型的状态机来正确执行它。 – 2010-01-28 22:14:01