2010-01-28 99 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