LoginSignup
0
1

【Python】指定したデリミタで文章を分割し、リストの要素としてそれぞれ追加する方法

Posted at

概要

句点で区切られている文章を、句点ごとに区切ってリストに変換する方法を紹介します。

複数の文からなる文章を指定したデリミタ(句点など)で分割し、それぞれの部分にデリミタを追加するという処理を行います。

サンプルコード

例えば、

'私はりんごが好きです。また、バナナも良いですよね。皆さんの好きなフルーツ教えてください。'

という文章を「。」ごとに区切る関数を作成しました。
「。」だけでなく、「♪」や「!」の場合も同様に以下の関数で可能としています。

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()関数は、常にリストを返す、と言うのも重要な点ですね。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1