2017-06-22 40 views
-1

我試圖將文章拆分爲句子。並使用以下代碼(由離開組織的人編寫)。幫助我理解代碼基於正則表達式的句子拆分

re.split(r' *[.,:-\@/_&?!;][\s ]+', x) 
+0

哪部分你不明白?分裂,或正則表達式模式? –

回答

1

它查找標點符號,如停止,逗號和冒號,可選擇用空格前面和後面總是跟着至少一個空白字符。最常見的情況是". "。然後,通過刪除匹配的標點符號並將返回的任何內容作爲列表返回,將字符串x拆分爲小塊。

>>> x = "First sentence. Second sentence? Third sentence." 
>>> re.split(r' *[.,:-\@/_&?!;][\s ]+', x) 
['First sentence', 'Second sentence', 'Third sentence.'] 

正則表達式是不必要的複雜,並沒有做很好的工作。

此位::-\@有一個冗餘的引用反斜槓,意思是ascii 58和64之間的字符,換句話說: ; <=> ? @,但最好明確列出7個字符,因爲大多數人不會知道字符是什麼字符在那個範圍內。這包括我:我必須查找它。而且顯然還包括代碼的作者,因爲他在最後再次指定了;

該位[\s ]+意味着一個或多個空格或空白字符但空間一個空格字符,這樣可以更簡單地表示爲\s+

請注意在返回列表的第3個元素中保留的句號。這是因爲當句號結束時,句號後面沒有空格,並且正則表達式堅持它是肯定的。保持完全停頓是可以的,但前提是對所有句子一致地進行,而不僅僅是對於以換行符結束的那些句子。

扔掉那段代碼並從頭開始。或者使用nltk,它具有將文本分割成句子的電源工具,並且可能會做出更加令人尊敬的工作。

>>> import nltk 
>>> sent_tokenizer=nltk.punkt.PunktSentenceTokenizer() 
>>> sent_tokenizer.sentences_from_text(x) 
['First sentence.', 'Second sentence?', 'Third sentence.']