2012-04-03 2 views
0

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

Так мой пример:

  • строка = «Мне нравится сыр, автомобили и т.д., но мой самый любимый сайт StackOverflow. Моя новая лошадь называется Рэнди.

И результат должен быть:

  • результат = 'Мне нравится сыр, автомобили и т.д., но мой самый любимый сайт StackOverflow.

Обычно я хотел бы сделать с:

re.findall(r'^(\s*.*?\s*)(?:\.|$)', event)

, но я хотел бы, чтобы пропустить некоторые заранее определенные слова, как выше т.д.

Я пришел с парой но никто из них не работал.

+4

http://stackoverflow.com/a/1732454/203705 - вдвойне верно для естественного языка. Что вы действительно пытаетесь сделать? Какая большая проблема вы пытаетесь решить? –

+0

У меня есть строка с некоторыми ссылками на события, и я создаю аббревиатуру для этого события. Как я выяснил, основная информация находится в первом предложении с названием события, но иногда используются аббревиатуры типа intern. = международный и так далее, и это действительно может быть болью в заднице. – skornos

+0

Последний раз, когда я опубликовал ссылку Тони Пони, [tchrist] (http://stackoverflow.com/users/471272/tchrist) вышел из дерева и поспорил меня в подчинении. Во всяком случае, существуют ли какие-либо ограничения, или мы говорим о произвольных английских предложениях? Было бы полезно, если бы вы могли сказать, что ваш список заранее определенных слов (включая 'и т. Д.) Никогда не появляется в конце предложения или что предложение всегда начинается с заглавной буквы и слова после' и т. Д. 'никогда не делает. – cha0site

ответ

4

Вы можете попробовать NLTK's Punkt sentence tokenizer, что делает этот вид вещи, используя реальный алгоритм, чтобы выяснить, какие аббревиатуры вместо вашей специальной коллекции сокращений.

NLTK включает в себя предварительно подготовленный для английского; загрузить его с:

nltk.data.load('tokenizers/punkt/english.pickle') 

Из исходного кода:

>>> sent_detector = nltk.data.load('tokenizers/punkt/english.pickle') 
>>> print '\n-----\n'.join(sent_detector.tokenize(text.strip())) 
Punkt knows that the periods in Mr. Smith and Johann S. Bach 
do not mark sentence boundaries. 
----- 
And sometimes sentences 
can start with non-capitalized words. 
----- 
i is a good variable 
name. 
+0

+1, эта штука замечательная. Английский язык является жестким и не подходит для регулярного выражения. –

+0

Спасибо, это похоже на идеальное решение, потому что я на самом деле использую NLTK, но только для разбора слов предложения.Но даже несмотря на то, что у меня есть библиотека, кажется, что она поднимает LookupError, поэтому я предполагаю, что мне не хватает ее части. – skornos

+0

@skornos. Вероятно, вам не хватает соответствующего файла данных, как в [этом вопросе] (http://stackoverflow.com/вопросы/4867197/неудавшегося погрузо-английский-рассол-с-NLTK-данные нагрузки). – Dougal

1

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

import re 
r = re.compile("^(.+?[.?!])\s*[A-Z]") 
print r.match('I like cheese, cars, etc. but my the most favorite website is stackoverflow. My new horse is called Randy.').group(1) 

выходы

'I like cheese, cars, etc. but my the most favorite website is stackoverflow.' 
Смежные вопросы