概要
句点で区切られている文章を、句点ごとに区切ってリストに変換する方法を紹介します。
複数の文からなる文章を指定したデリミタ(句点など)で分割し、それぞれの部分にデリミタを追加するという処理を行います。
サンプルコード
例えば、
'私はりんごが好きです。また、バナナも良いですよね。皆さんの好きなフルーツ教えてください。'
という文章を「。」ごとに区切る関数を作成しました。
「。」だけでなく、「♪」や「!」の場合も同様に以下の関数で可能としています。
def split_paragraph_into_sentences(paragraph, delimiters):
sentences = [paragraph]
for delimiter in delimiters:
sentences = [part + delimiter for sentence in sentences for part in sentence.split(delimiter)[:-1]] + [sentence.split(delimiter)[-1] for sentence in sentences]
sentences = list(filter(None, sentences))
return sentences
delimiters = ['♪', '!', '。']
paragraph = '私はりんごが好きです♪また、バナナも良いですよね♪皆さんの好きなフルーツ教えてください♪'
sentences = split_paragraph_into_sentences(paragraph, delimiters)
print(sentences)
# ['私はりんごが好きです♪', 'また、バナナも良いですよね♪', '皆さんの好きなフルーツ教えてください♪']
paragraph2 = '私はりんごが好きです!また、バナナも良いですよね!皆さんの好きなフルーツ教えてください!'
sentences = split_paragraph_into_sentences(paragraph2, delimiters)
print(sentences)
# ['私はりんごが好きです!', 'また、バナナも良いですよね!', '皆さんの好きなフルーツ教えてください!']
paragraph3 = '私はりんごが好きです。また、バナナも良いですよね。皆さんの好きなフルーツ教えてください。'
sentences = split_paragraph_into_sentences(paragraph3, delimiters)
print(sentences)
# ['私はりんごが好きです。', 'また、バナナも良いですよね。', '皆さんの好きなフルーツ教えてください。']
ちょっと何しているかわかりづらいコードですね...
以下でも同じように結果が得られます。
def split_by_delimiter(paragraph, delimiters):
sentences = [paragraph]
for delimiter in delimiters:
new_sentences = []
for sentence in sentences:
parts = sentence.split(delimiter)
new_parts = [part + delimiter for part in parts[:-1]] + [parts[-1]]
new_sentences.extend(new_parts)
sentences = new_sentences
if sentences and sentences[-1] == '':
sentences.pop()
return sentences
注意点1
まず、一つ目のコードで言うsentences = list(filter(None, sentences))
や二つ目のコードのif sentences and sentences[-1] == '':
など、''
のものを除去している部分があります。
なぜか、というと、split()
関数は、指定したデリミタ文字列で文字列を分割します。
今回で言うと、「。」が文字列の末尾にある場合、split()
関数はその後に空の文字列を追加します。
公式ドキュメントにも記載がありますが、以下の通り、デリミタを基に文字列を分割する際、デリミタの後に何もない場合は空の文字列を追加するのです。
>>> '1,2,,3,'.split(',')
['1', '2', '', '3', '']
なので、上記サンプルコードでは、空の文字列を除去するコードを入れています。
ただし、二つ目に指定したサンプルコードでは、リストの最後の要素だけをチェックしています。リストの中間に空の文字列がある場合は別のコードを使用する必要があります。
注意点2
これは、split()
関数自体における注意点ですが、デリミタが文字列に存在しない場合、元の文字列を含むリストを返します。
例えば、以下のように文字列に存在しないデリミタ(以下で言えば「!
」)を選択すると、元の文字列がそのまま返ってきます。
sentence = '私はりんごが好きです。'
new_sentence = sentence.split('!')
print(new_sentence)
# ['私はりんごが好きです。']
また、split()
関数は、常にリストを返す、と言うのも重要な点ですね。