У меня есть текстовый файл. Мне нужен список предложений.
Как это можно реализовать? Есть много тонкостей, например, использование точки в сокращениях.
Мое старое регулярное выражение работает плохо:
re.compile('(\. |^|!|\?)([A-Z][^;↑\.<>@\^&/\[\]]*(\.|!|\?) )',re.M)
Ответы:
В наборе средств естественного языка ( nltk.org ) есть все, что вам нужно. Эта групповая публикация указывает, что это делает это:
(Я не пробовал!)
источник
nltk .tokenize.punkt.PunktSentenceTokenizer
.nltk.download()
сначала выполнить и загрузить модели ->punkt
'This fails on cases with ending quotation marks. If we have a sentence that ends like "this." This is another sentence.'
и мой вывод Мне['This fails on cases with ending quotation marks.', 'If we have a sentence that ends like "this."', 'This is another sentence.']
кажется правильным.Эта функция может разбить весь текст Гекльберри Финна на предложения примерно за 0,1 секунды и обрабатывает многие из наиболее болезненных крайних случаев, которые делают синтаксический анализ предложений нетривиальным, например: « Мистер Джон Джонсон-младший родился в США, но получил докторскую степень. Д. в Израиле до прихода в Nike Inc. в качестве инженера. Он также работал на сайте craigslist.org бизнес-аналитиком ».
источник
prefixes = "(Mr|St|Mrs|Ms|Dr|Prof|Capt|Cpt|Lt|Mt)[.]"
,websites = "[.](com|net|org|io|gov|me|edu)"
иif "..." in text: text = text.replace("...","<prd><prd><prd>")
Вместо использования регулярного выражения для разделения текста на предложения вы также можете использовать библиотеку nltk.
ссылка: https://stackoverflow.com/a/9474645/2877052
источник
for sentence in tokenize.sent_tokenize(text): print(sentence)
Вы можете попробовать использовать Spacy вместо регулярного выражения. Я использую его, и он выполняет свою работу.
источник
Вот середина пути, который не полагается на какие-либо внешние библиотеки. Я использую понимание списка, чтобы исключить перекрытия между аббревиатурами и терминаторами, а также для исключения совпадений между вариантами завершения, например: '.' против '. "'
Я использовал функцию Карла find_all из этой записи: Найти все вхождения подстроки в Python
источник
...
и?!
.Для простых случаев (когда предложения заканчиваются нормально) это должно работать:
Регулярное выражение
*\. +
соответствует периоду, окруженному 0 или более пробелами слева и 1 или более справа (чтобы что-то вроде точки в re.split не учитывалось как изменение предложения).Очевидно, не самое надежное решение, но в большинстве случаев оно подойдет. Единственный случай, который это не касается, - это сокращения (возможно, просмотрите список предложений и убедитесь, что каждая строка в нем
sentences
начинается с заглавной буквы?)источник
SyntaxError: EOL while scanning string literal
указывая на закрывающую скобку (послеtext
). Кроме того, регулярное выражение, на которое вы ссылаетесь в своем тексте, не существует в вашем примере кода.r' *[\.\?!][\'"\)\]]* +'
Вы также можете использовать функцию токенизации предложений в NLTK:
источник
@ Артём,
Здравствуй! Вы можете создать новый токенизатор для русского (и некоторых других языков) с помощью этой функции:
а затем назовите его так:
Удачи, Марилена.
источник
Несомненно, НЛТК наиболее подходит для этой цели. Но начать работу с NLTK довольно болезненно (но как только вы его установите - вы просто пожнете плоды)
Итак, вот простой код на основе re, доступный по адресу http://pythonicprose.blogspot.com/2009/09/python-split-paragraph-into-sentences.html
источник
Пришлось читать файлы с субтитрами и разбивать их на предложения. После предварительной обработки (например, удаления информации о времени и т.д. из файлов .srt) переменная fullFile содержала полный текст файла субтитров. Приведенный ниже грубый способ аккуратно разделил их на предложения. Наверное, мне повезло, что предложения всегда заканчивались (правильно) пробелом. Сначала попробуйте это, и если есть исключения, добавьте больше сдержек и противовесов.
Ой! хорошо. Теперь я понимаю, что, поскольку мой контент был испанским, у меня не было проблем с «мистером Смитом» и т. Д. Тем не менее, если кому-то нужен быстрый и грязный парсер ...
источник
Я надеюсь, что это поможет вам с латинским, китайским, арабским текстом
источник
вывод:
Источник: https://www.geeksforgeeks.org/nlp-how-tokenizing-text-sentence-words-works/
источник