2017-06-22 25 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.'] 
関連する問題