разбить строку на предложения с сохранением нового разделителя строк - PullRequest
0 голосов
/ 15 апреля 2020

скажем, у меня есть строка вроде:

s = "Hello world. Hello world.\n\n This is foo.\n Goodbye world."

В настоящее время я разделяю эту строку на предложения с помощью ., используя

 from nltk import tokenize
    sentences = tokenize.sent_tokenize(s)
sentences = ['Hello world.', 'Hello world.', 'This is foo.', 'Goodbye world.']

Мне нужно сделать несколько подстановок в каждом предложение, что-то вроде этого:

for i, sentence in enumerate(sentences):
    if "world" in sentence:
        sentences[i] = sentence.replace("world", "internet")
    if "foo" in sentence:
        sentences[i] = sentence.replace("foo", "me")

Но если после их разделения я хочу снова присоединиться к ним и сохранить разделители строк \n, вывод будет неправильным

ss = " ".join(sentences)
print(ss)
Hello internet. Hello internet. This is me. Goodbye internet.

Это должен быть правильный вывод:

Hello internet. Hello internet.

 This is me.
 Goodbye internet.

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 15 апреля 2020

Просто измените ss = " ".join(sentences)

на ss = "\n".join(sentences)

0 голосов
/ 15 апреля 2020

Замените " " на "\n" в вашем join вызове. Вот пример:

s = "Hello world.\n\n This is foo.\n Goodbye world."

split = s.split('\n')
print(split)
# ['Hello world.', '', ' This is foo.', ' Goodbye world.']

joined = '\n'.join(s.split('\n'))
print(joined)
# Hello world.
#
#  This is foo.
#  Goodbye world.

РЕДАКТИРОВАТЬ (16.04.20), чтобы ответить на обновленный вопрос:

Если вы собираетесь делать одна и та же операция для каждого предложения, что-то вроде этого будет работать для выполнения sh того, что вы пытаетесь сделать:

from nltk import tokenize

s = "Hello world. Hello world.\n\n This is foo.\n Goodbye world."
sentences = tokenize.sent_tokenize(s)

for sentence in sentences:
    # Add a line like this for every replace you'd like to do
    s = s.replace(sentence, sentence.replace("world", "internet"))

# s now contains replacements AND the original newlines

Однако это решение перезапишет одну замену другой, если второе replace относится к результату первого replace.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...