Как разделить текст на предложения в питоне
Перейти к содержимому

Как разделить текст на предложения в питоне

  • автор:

Разделить текст на предложения

Разделить текст на предложения, чтоб каждое начиналось с новой строки
Всем доброго дня! Я только начала изучать python, буквально только второй день, нашла самообучалку.

Разделить предложения по типу
У меня есть программа, которая делит большой текст на предложения, затем предложения на слова.

Разделить текст на предложения, предложения на слова. (через двумерный массив строк)
Задача заключается в том, что надо разделить текст на предложения, предложения на слова. Решил.

Разделить текст по предложения
$text из 10-11 предложений, все кончаются точкой.(внутри нет других знаков препинания) Надо.

RegExp: Разделить текст на предложения
Написать функцию, которая превращает фрагмент текста в массив, элементами которого являются.

135 / 120 / 37
Регистрация: 30.09.2012
Сообщений: 400

string.split('.')

чем не подходит?

Добавлено через 5 минут
либо пример нескольких разделителей

re.split('. |! ',str)

44 / 44 / 66
Регистрация: 22.07.2015
Сообщений: 191
pashtet-kun, в предложении могут быть сокращения, например » 1999 г. »

Эксперт Python

5415 / 3839 / 1214
Регистрация: 28.10.2013
Сообщений: 9,554
Записей в блоге: 1

Лучший ответ

Сообщение было отмечено a1d4r как решение

Решение

Разделить текст (любой,человеческий ) на предложения обычными способами практически невозможно. И это следствие сложности и неоднозначности грамматики естественных языков, в отличие от машинных, подчиняющихся строгим правилам.
Вот приблизительное регулярное выражение дающее правильную сегментацию на относительно простых предложениях.

1 2 3 4 5 6 7 8 9 10 11 12 13
import re pattern = re.compile(r'([А-ЯA-Z]((т.п.|т.д.|пр.|г.)|[^. \(]|\([^\)]*\))*[. ])') text="""В конце 1811 г., в эпоху нам достопамятную, жил в своем поместье Ненарадове добрый Гаврила Гаврилович Р**. Он славился во всей округе гостеприимством и радушием; соседи поминутно ездили к нему поесть, попить, поиграть по пяти копеек в бостон с его женою, а некоторые для того, чтоб поглядеть на дочку их, Марью Гавриловну, стройную, бледную и семнадцатилетнюю девицу. Она считалась богатой невестою, и многие прочили ее за себя или за сыновей. Марья Гавриловна была воспитана на французских романах, и следственно была влюблена. Предмет, избранный ею, был бедный армейский прапорщик, находившийся в отпуску в своей деревне. """ for i,sent in enumerate(pattern.findall(text)): print('[<>]<>'.format(i+1,sent[0]))

Но оно не учитывает десятки языковых нюансов — прямую речь с . названия с восклицательными знаками(Yahoo!), аббревиатуры с точками внутри, сокращения (только частично) и т.д. Поэтому в реальных приложениях используются контекстно-свободные грамматики, словари исключений и много чего еще.
P.S. Единственный эффективный сегментатор на предложения для русского языка — Томита-парсер от Яндекса. Но он существует в открытом доступе только в виде бинарника весом 50 mb (теперь вы понимает какой сложности алгоритмы там используются) и никаких удобных python API к нему нет.

Python разделить строку на списки

В этой статье мы расскажем, как можно разбивать строки на списки. Вы узнаете, как при этом использовать разделители (в частности — как отделять часть строки только по первому разделителю и как быть с последовательно идущими разделителями) и регулярные выражения. Безусловно, эта информация будет особенно полезна начинающим питонистам, но, возможно, и более опытные найдут для себя кое-что интересное.

Простое разделение строки и получение списка ее составляющих

Если вы хотите разбить любую строку на подстроки и составить из них список, вы можете просто воспользоваться методом split(sep=None, maxsplit=-1) . Этот метод принимает два параметра (опционально). Остановимся пока на первом из них — разделителе ( sep ).

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

Пример использования метода split() без указания разделителя:

print("Python2 Python3 Python Numpy".split()) print("Python2, Python3, Python, Numpy".split())
['Python2', 'Python3', 'Python', 'Numpy'] ['Python2,', 'Python3,', 'Python,', 'Numpy']

Разделение строки с использованием разделителя

Python может разбивать строки по любому разделителю, указанному в качестве параметра метода split() . Таким разделителем может быть, например, запятая, точка или любой другой символ (или даже несколько символов).

Давайте рассмотрим пример, где в качестве разделителя выступает запятая и точка с запятой (это можно использовать для работы с CSV-файлами).

print("Python2, Python3, Python, Numpy".split(',')) print("Python2; Python3; Python; Numpy".split(';'))
['Python2', ' Python3', ' Python', ' Numpy'] ['Python2', ' Python3', ' Python', ' Numpy']

Как видите, в результирующих списках отсутствуют сами разделители.

Если вам нужно получить список, в который войдут и разделители (в качестве отдельных элементов), можно разбить строку по шаблону, с использованием регулярных выражений (см. документацию re.split). Когда вы берете шаблон в захватывающие круглые скобки, группа в шаблоне также возвращается как часть результирующего списка.

import re sep = re.split(',', 'Python2, Python3, Python, Numpy') print(sep) sep = re.split('(,)', 'Python2, Python3, Python, Numpy') print(sep)
['Python2', ' Python3', ' Python', ' Numpy'] ['Python2', ',', ' Python3', ',', ' Python', ',', ' Numpy']

Если вы хотите, чтобы разделитель был частью каждой подстроки в списке, можно обойтись без регулярных выражений и использовать list comprehensions:

text = 'Python2, Python3, Python, Numpy' sep = ',' result = [x+sep for x in text.split(sep)] print(result)
['Python2,', ' Python3,', ' Python,', ' Numpy,']

Разделение многострочной строки (построчно)

Создать список из отдельных строчек многострочной строки можно при помощи того же метода split() , указав в качестве разделителя символ новой строки \n . Если текст содержит лишние пробелы, их можно удалить при помощи методов strip() или lstrip() :

str = """ Python is cool Python is easy Python is mighty """ list = [] for line in str.split("\n"): if not line.strip(): continue list.append(line.lstrip()) print(list)
['Python is cool', 'Python is easy', 'Python is mighty']

Разделение строки-словаря и преобразование ее в списки или словарь

Допустим, у нас есть строка, по сути являющаяся словарем и содержащая пары ключ-значение в виде key => value . Мы хотим получить эти пары в виде списков или настоящего словаря. Вот простой пример, как получить словарь и два списка:

dictionary = """\ key1 => value1 key2 => value2 key3 => value3 """ mydict = <> listKey = [] listValue = [] for line in dictionary.split("\n"): if not line.strip(): continue k, v = [word.strip() for word in line.split("=>")] mydict[k] = v listKey.append(k) listValue.append(v) print(mydict) print(listKey) print(listValue)
 ['key1', 'key2', 'key3'] ['value1', 'value2', 'value3']

Отделение указанного количества элементов

Метод split() имеет еще один опциональный параметр — maxsplit . С его помощью можно указать, какое максимальное число «разрезов» нужно сделать. По умолчанию maxsplit=-1 , это означает, что число разбиений не ограничено.

Если вам нужно отделить от строки несколько первых подстрок, это можно сделать, указав нужное значение maxsplit . В этом примере мы «отрежем» от строки первые три элемента, отделенные запятыми:

str = "Python2, Python3, Python, Numpy, Python2, Python3, Python, Numpy" data = str.split(", ",3) for temp in data: print(temp)
Python2 Python3 Python Numpy, Python2, Python3, Python, Numpy

Разделение строки при помощи последовательно идущих разделителей

Если вы для разделения строки используете метод split() и не указываете разделитель, то разделителем считается пробел. При этом последовательно идущие пробелы трактуются как один разделитель.

Но если вы указываете определенный разделитель, ситуация меняется. При работе метода будет считаться, что последовательно идущие разделители разделяют пустые строки. Например, ‘1,,2’.split(‘,’) вернет [‘1’, », ‘2’] .

Если вам нужно, чтобы последовательно идущие разделители все-таки трактовались как один разделитель, нужно воспользоваться регулярными выражениями. Разницу можно видеть в примере:

import re print('Hello1111World'.split('1')) print(re.split('1+', 'Hello1111World' ))
['Hello', '', '', '', 'World'] ['Hello', 'World']

Как разделить текст на предложения на Python?

В Питоне я полный новичок, поэтому прошу помочь и не ругаться.

На входе имеется файл с текстом в котором могут быть абзацы, переносы строк, несколько пробелов, троеточие, и собственно предложения текста.

Как бы мне грамотно поделить текст на предложения и получить их в массив?

Прошу не ругаться а дать пример кода, который работает, примеры которые я нагуглил работают некорректно, оставляя в некоторых элементах массива по 2-3 предложения вместо одного.

  • Вопрос задан более трёх лет назад
  • 17228 просмотров

4 комментария

Оценить 4 комментария

gim0

Кинь ссылки на примеры, которые не работают для тебя. На ум приходит сделать банальный «split» текста по точке и затем «trim» чтобы избавиться от лишних пробелов.

iwqn

Иван @iwqn Автор вопроса

gim0: я кинул ссылку выше — я пробую разделить на предложения текст книги

Предложения могут заканчиваться троеточием, восклицательным и вопросительным знаком а не только точкой

iwqn

Иван @iwqn Автор вопроса

Вот пример текста который тестировался:

Открылась тяжёлая дверь, и перед глазами изумлённого мальчика предстал удивительный мир.

Прямо перед ним два бурых медвежонка схватились в обнимку. Их старший братишка-нянька не спускал глаз с озорников, а медведица-мать развалилась на пригорке и дремлет.

А там, немножко дальше, два тигра — один на скале, другой внизу — оскалили зубы, — сейчас кинутся друг на друга… Мальчик, крадучись, прошёл мимо них. В страхе оглянулся. А вдруг кинутся? Нет, не кидаются, — так и остались…

Вот высоко в воздухе застыл без движения орёл. Вот взлетевшая утка замерла над гнездом; в гнезде — яйца. Мальчик быстро протянул руку за ними — и пальцы больно ударились о что-то крепкое, холодное…

Стекло. Все звери и птицы за стеклом!

Неужели они не живые? Тогда, наверно, они заколдованы, как в сказке. Узнать бы такое волшебное слово, чтобы разом всех оживить. Кто научит его этому слову?

Мальчик попал в Зоологический музей Академии наук. Здесь работал его отец — русский учёный-естествоиспытатель. В доме напротив родился в 1894 году мальчик — будущий писатель Виталий Валентинович Бианки.

С природой его познакомил отец. Он брал сына с собой на охоту и на прогулки. Называл ему каждую травку, каждую птицу и зверюшку. Научил его узнавать птиц по полёту, зверя — по следу и — самое главное — научил сына записывать свои наблюдения.

К двадцати семи годам жизни у Виталия Валентиновича Бианки накопились целые тома дневников. И опять, как в детстве, ему захотелось найти то волшебное слово, которое заставило бы ожить всех этих птиц и зверей.

Таким словом и стало художественное слово рассказчика-писателя.

Первая В. В. Бианки для детей — «Лесные домишки» — вышла в 1923 году. За двадцать пять лет своей литературной работы Бианки написал около двухсот сказок, рассказов, повестей. Юным читателям хорошо известны его сборники: «Сказки», «Лесная газета», «По следам», «Где раки зимуют», «Рассказы об охоте», «Последний выстрел» и многие другие.

На двадцати восьми языках народов нашей Родины издавались его произведения. На многие иностранные языки переведены его книги.

Прекрасно зная и горячо любя родную природу, большую часть своей жизни Бианки проводит в лесу с ружьём, биноклем, записной книжкой. И его рассказы, сказки, повести раскрывают перед юными читателями картины живой природы. В самом обыкновенном он умеет показать новое, незамеченное нами.

Бианки ведёт юного читателя по охотничьим тропам Алтая, поднимается с ним без дорог по горам Кавказа, бродит по тайге, тундре, степи…

Но больше всего Бианки любит рассказывать о тех животных и растениях, которых всякий может встретить у себя в саду, на берегу соседней речки, в лесах и полях северной и среднерусской полосы нашей Родины.

Писатель раскрывает своему юному читателю глаза на окружающий мир, отвечает на его вопросы.

Много загадок природы уже раскрыто нашими учёными. Ещё больше надо изучить, разгадать, понять.

И книги Бианки зовут юного читателя наблюдать, сравнивать, думать, быть хорошим следопытом, исследователем. Бианки не только показывает, — он учит юного читателя раскрывать тайны леса, разгадывать маленькие и большие загадки из жизни зверей и птиц.

Ведь только тот, кто хорошо знает природу, может ею управлять, обращая её богатства на пользу Родине.

Советский человек — хозяин своих лесов, полей, рек, озёр и он должен хорошо знать своё хозяйство.

Юный читатель многое узнает, прочитав рассказы и сказки Бианки. Он научится наблюдать, он станет бережливым хозяином богатств родной природы, он полюбит её.

Художественное слово писателя поможет ему в этом.

Как разделить строку по пробелам python

Такую задачу всегда можно решить с помощью цикла. Но в Python есть метод .split() . Именно его обычно используют для разделения строки на части. В качестве разделителя можно использовать любой символ: пробел, запятую, перенос строки ( \n ) и т.д.

На выходе мы получим список строк:

str = 'how are you' str.split(' ') # ['how', 'are', 'you'] 

Пробел как разделитель можно не указывать. Метод .split() будет использовать параметр по умолчанию:

str = 'how are you?' str.split() # ['how', 'are', 'you'] 

Иногда перед тем, как разделить строку, необходимо избавиться от лишних знаков препинания:

str = 'Hi, how are you?' str[:-1].replace(',', '').split() # ['Hi', 'how', 'are', 'you'] 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *