Как обрезать текст до определенной длины, полные предложения?

Я ищу решение для обрезки неизвестного текста до определенной длины. Сохранение только полных предложений.

Итак, текст, подобный этому

"Were you born 1. 3. 1987 in Prague? Štěpán Jr. lives there for 3 years now! "

следует превратить в

"Were you born 1. 3. 1987 in Prague? "

для ограничения символов 50, 40 (и 20 с --find-next-sentence-ending).

Я прочитал много вопросов SO - большинство ответов были вариациями

substr($text, 0, strrpos('.', $text) + 1);

Но это явно не подходит для вышеупомянутого предложения и других подобных. Другие предлагают использовать Stanford Text Parser или OpenNLP. Они действительно крутые, но непригодны для обычного применения. Вы бы не стали устанавливать Java на свой сервер Ruby/PHP, просто чтобы обрезать текст, верно. Поэтому я ищу какое-нибудь решение 80/20, которое не зависит от языка и сможет обрабатывать типичные возникающие случаи.

Я не мог придумать более проблематичного предложения, чем это (содержит дату, окончание предложения без точки и символ без ascii в начале следующего предложения и неконечную точку в середине «предельного» предложения).

Я также создал GIST (https://gist.github.com/4051035), чтобы вы могли разветвить и поиграть с ним — разветвление гарантирует, что пользователи могут перейти к различным решениям этой проблемы, поэтому, пожалуйста, используйте его;) Я хотел сделайте этот вопрос комьюнити-вики, но похоже он не работает для вопросов - только для ответов. Поэтому, пожалуйста, добавляйте любые предложения/соответствующие вопросы SO в комментарии. Спасибо.


person Tomáš Fejfar    schedule 10.11.2012    source источник


Ответы (2)


Если вам достаточно получить точность 80%, вы можете применить простое правило:

  • Каждый '?' и '!' отметить конец предложения
  • Когда вы найдете точку, проверьте, начинается ли следующее слово с заглавной буквы, но не все ли оно в верхнем регистре (помните, что это только для правила 80/20)

Если вам нужно что-то получше, то, боюсь, вам нужна библиотека nlp. Если у вас есть хостинг php/ruby, вы сможете использовать NLTK. Он написан на питоне и имеет отличную поддержку.

person Klangner    schedule 17.11.2012

Моя грубая идея решения этой проблемы состояла бы в том, чтобы проверить разделитель последнего предложения (т. Е. Точечный пробел), проверить, есть ли числа, разделенные точками, или известный шаблон вокруг этой позиции, и если есть, трусливо выбрать предыдущее предложение. Возможно, вычислить следующую позицию, не являющуюся номером, и, если она находится в каком-то мягком пределе (скажем, $ limit + 10), выбрать текущее предложение.

person Tomáš Fejfar    schedule 10.11.2012