Python вырезал строку после X-го предложения - PullRequest
4 голосов
/ 05 августа 2010

Мне нужно вырезать строку Юникод , которая на самом деле является статьей (содержит предложения). Я хочу вырезать эту строку статьи после X-го предложения в python.

Хорошим показателем окончания предложения является то, что оно заканчивается точкой (".") И словом после начала с заглавной буквы. Такие как

myarticle == "Hi, this is my first sentence. And this is my second. Yet this is my third."

Как этого достичь?

Спасибо

Ответы [ 4 ]

15 голосов
/ 05 августа 2010

Рассмотрите возможность загрузки набора инструментов для естественного языка (NLTK). Тогда вы можете создавать предложения, которые не будут ломаться для таких вещей, как "США". или не разбить предложения, заканчивающиеся на «?!».

>>> import nltk
>>> paragraph = u"Hi, this is my first sentence. And this is my second. Yet this is my third."
>>> sentences = nltk.sent_tokenize(paragraph)
[u"Hi, this is my first sentence.", u"And this is my second.", u"Yet this is my third."]

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

>>> sentences[1]
u"And this is my second."
2 голосов
/ 05 августа 2010

Вот более надежное решение:

myarticle = """This is a sentence.
   And another one.
   And a 3rd one."""

N = 3  # 3 sentences

print ''.join(sentence+'.' for sentence in re.split('\.(?=\s*(?:[A-Z]|$))', myarticle, maxsplit=N)[:-1])

Это решение имеет несколько преимуществ по сравнению с некоторыми другими возможностями, упомянутыми ранее:

  1. Оно работает даже вв вашем тексте ровно N предложений.Некоторые другие ответы дают двойной . в конце.Этого здесь избегают, принимая во внимание тот факт, что за последним предложением следует не заглавная буква, а конец текста ($).

  2. Это работаетдаже если в тексте меньше N предложений.

  3. Количество разбиений ограничено аргументом maxsplit до re.split(), что ограничивает количество разбиений ипоэтому весьма эффективен.

Надеюсь, это поможет!

1 голос
/ 05 августа 2010

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

re.split('\W(?=[A-Z])',ss)

Возвращает список предложений.Конечно, это не относится к случаям, упомянутым Павлом.

0 голосов
/ 05 августа 2010

Попробуйте это:

'.'.join(re.split('\.(?=\s*[A-Z])', myarticle)[:2]) + '.'

Это обрезает вашу строку после второго предложения ([: 2]).

Однако есть некоторые проблемы (как всегда, если вы имеете дело с естественным языком): в первую очередь он распознает только предложение, начинающееся с 'A-Z'. Это может быть верно для английского языка, но не для других языков.

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