Как поставить новую строку для каждого n-го предложения? - PullRequest
0 голосов
/ 13 июля 2020

Проблемы с добавлением новой строки для каждого 5-го предложения в длинной текстовой строке.

Пример ввода

text = 'The puppy is cute. Summer is great. Happy Friday. Sentence4. Sentence5. Sentence6. Sentence7.

Желаемый результат:

The puppy is cute. Summer is great. Happy friday. Sentence4. Sentence5.
Sentence6. Sentence7.

Кто-нибудь может помочь с этим?

Ответы [ 5 ]

3 голосов
/ 13 июля 2020

Использование регулярного выражения. Добавьте \ n после 5 совпадений "[не.], За которым следует.".

import re
text = 'The puppy is cute. Summer is great. Happy friday. sentence4. sentence5. sentence6. sentence7.'

print(re.sub(r'((?:[^.]+\.\s*){5})',r'\1\n',text))

Более продвинутое средство сопоставления предложений регулярных выражений, которое обрабатывает сокращения и другие знаки препинания путем сопоставления в конце знаков препинания. Ссылка: https://mikedombrowski.com/2017/04/regex-sentence-splitter/ Примечание: все еще есть крайние случаи, когда это не удается, например, TV, за которым следует Mr., нужны двойные пробелы для обозначения отдельного предложения. Цитаты с предложениями в них будут разбиты. et c.

import re
sentence_regex = r'((.*?([\.\?!][\'\"\u2018\u2019\u201c\u201d\)\]]*\s*(?<!\w\.\w.)(?<![A-Z][a-z][a-z]\.)(?<![A-Z][a-z]\.)(?<![A-Z]\.)\s+)){5})'
text = 'The puppy is cute. Watch T.V.  Mr. Summers is great. Say "my name."  My name is.  Or not... Happy friday? Sentence4. Sentence5. Sentence6. Sentence7.'
text += " " + text

print(re.sub(sentence_regex,r'\1\n',text))

Что-нибудь более сложное, чем это, вы можете изучить в инструментарии обработки языка.

3 голосов
/ 13 июля 2020

Попробуйте следующее:

text = 'The puppy is cute. Summer is great. Happy friday. sentence4. sentence5. sentence6. sentence7.'
splittext = text.split(".")
for x in range(5, len(splittext), 5):
    splittext[x] = "\n"+splittext[x].lstrip()
text = ".".join(splittext)
print(text)
1 голос
/ 13 июля 2020

Вот простая функция, которая добавляет новую строку в конец 5-го предложения

def new_line(sentence: str):
    # characters that mark the end of a sentence
    end_of_sentence_markers = ['.', '!', '?', '...']
    # after n sentences insert new_line
    n = 5

    # keeps track 
    count = 0
    # final string as list for efficiency
    final_str = []
    # split at space
    sentence_split = sentence.split(' ')

    # traverse the sentence split
    for word in sentence_split:
        # if end of sentence is present then increase count
        if word[-1] in end_of_sentence_markers:
            count += 1
        # if count is equal to n then add newline otherwise add space
        if count == n:
            final_str.append(word + '\n')
            count = 0
        else:
            final_str.append(word + ' ')


    # return the string version of the list
    return ''.join(final_str)

Вот модифицированная версия:

def new_line_better(sentence: str, n: int):
    # final string as list for efficiency
    final_str = []
    # split at period and remove extra spaces
    sentence_split = list( map( lambda x : x.strip(),  sentence.split('.') ) )
    # pop off last space
    sentence_split.pop()
    
    # keeps track 
    count = 0
    # traverse the sentences
    for sentence in sentence_split:
        count += 1
        if count == n:
            count = 0
            final_str.append(sentence+'.\n')
        else:
            final_str.append(sentence+'. ')

    # return the string version of the list
    return ''.join(final_str)
0 голосов
/ 13 июля 2020

С пониманием списка

text = 'The puppy is cute. Summer is great. Happy friday. sentence4. sentence5. sentence6. sentence7.'
lines = text.split(".")
result = ".".join([l if i % 5 else "\n"+l for (i, l) in enumerate(lines)]).lstrip()
print(result)
0 голосов
/ 13 июля 2020

Другой подход:

text = 'The puppy is cute. Summer is great. Happy friday. sentence4. sentence5. sentence6. sentence7.'

out = ''
for i, e in enumerate(text.split(".")):
    if (i > 0)  & (i % 5 == 0):
        out = out + '\n'
    out = out + e + '.'
out

результат:

'The puppy is cute. Summer is great. Happy friday. sentence4. sentence5.\n sentence6. sentence7..'
...