2015-04-16 6 views
4

Я пытаюсь подсчитать количество предложений в тексте с помощью регулярного выражения. Я пришел с regex1 найти все точки:Подсчитайте количество предложений, используя REGEX и игнорируя аббревиатуры

([^.!?\s][^.!?]*) 

После этого я попытался найти большинство аббревиатур следующего regex2:

([A-Z]+[a-z]{0,3}\.). 

Однако у меня есть несколько проблем:

  1. Если акроним находится в конце предложения, он найден (например, с 20 000 до н.э.) по формуле regex2. Это не предназначено, я только хочу найти аббревиатуры в предложении.

  2. Если мы предположим, что проблема 1 решена, я хочу объединить обе формулы регулярных выражений вместе, чтобы окончательная формула выводила только действительное количество предложений. Как, например, мы можем рассмотреть следующий текст из Википедии:

Национальное управление по аэронавтике и исследованию космического пространства (НАСА) является правительственным учреждением Соединенных государства, ответственное за гражданскую космическую программу как также аэронавтики и космонавтики исследование.

президент Дуайт Эйзенхауэр создал Национальное управление по аэронавтике и исследованию космического пространства администрации (НАСА) в 1958 году [5] с отчетливо гражданского (а не военных) ориентации поощряет мирных применений в области космической науки. Закон о национальной аэронавтике и космосе был принят 29 июля 1958 года, отменив предшественника НАСА, Национальный консультативный комитет по аэронавтике (NACA) Национального комитета по аэронавтике и космосу. Новое агентство стало , действующее 1 октября 1958 года. [6] [7]

С того времени большинство усилий США N исследования космоса, были во главе с НАСА, в том числе посадка на Луну Аполлоном, пространство станции Skylab, а позже Space Shuttle. В настоящее время НАСА поддерживает Международную космическую станцию ​​и осуществляет надзор за разработкой многоцелевого транспортного средства Orion, системы космического запуска и Коммерческие транспортные средства. Агентство также несет ответственность за Программу запуска программ (LSP) , которая обеспечивает контроль за запуском операций и обратного отсчета для запуска беспилотных запусков NASA.

НАСА наука ориентирована на лучшее понимании Земли через системы наблюдения Земли, [8] опережение гелиофизики усилий из программы исследований Гелиофизики Научной Миссии директората, [9] исследующих тел по всем Солнечной системе с прогрессирующим Robotic миссий космических кораблей, таких как New Horizons, [10] и исследования тем астрофизики, таких как Большой взрыв, через Великие Обсерватории и связанные с ними программы. [11] NASA делится данными с различными национальными и международными организациями, такими как от наблюдательного спутника наблюдения за парниковыми газами .

Вышеупомянутый текст содержит 9 предложений.

Regex1: 12 совпадений (D., U.И С. рассматриваются как «полные остановки»)

Regex2: 3 матча (D., U., и S.)

Что мне нужно сейчас лучше regex1 формула только найти аббревиатуры в и затем «объединить» формулы регулярного выражения для получения всех предложений.

Если слияние обеих формул не представляется возможным (по какой-либо уважительной причины), то рассматривать только задачу 1, потому что в данный момент моя программа JAVA использовать обе формулы разделенным:

public void breakIntoSentences() 
{ 
    //Find all points 
    Pattern p = Pattern.compile("([^.!?\\s][^.!?]*)"); 
    Matcher m = p.matcher(content); 

    int allPoints = 0; 
    while(m.find()) 
     allPoints++; 

    //Find all acronyms with length 0-4 
    p = Pattern.compile("([A-Z]+[a-z]{0,3}\\.)"); 
    m = p.matcher(content); 

    int allAcronyms = 0; 
    while(m.find()) 
     allAcronyms++; 

    numberOfSentences = allPoints - allAcronyms;   
} 

Спасибо заранее за помощь

+0

Вы хотите только слова, не так ли? Как насчет '\ w + ([^ \ W \ d])'? http://regexr.com/3ar0d Используя PatternMatcher, вы можете подсчитать, сколько у вас есть. – deadfish

+0

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

ответ

1

Вот картина:

.+?(?:(?<![\s.]\p{Lu})[.!?]|$) 

Demo

  • .+? только здесь, чтобы соответствовать полному предложению. Если вы просто хотите подсчет, вы можете заменить его на .
  • (?<![\s.]\p{Lu}) означает , которому не предшествует прописная буква, которой предшествует пробел или период. Это используется как раз перед [.!?], который проверяет окончание предложения. Кажется, что это правильно относится к аббревиатурам.
  • $ есть только для того, чтобы заставить неживых .+? в начале совпадать до конца текста на всякий случай текст не заканчивается на период.

Данное регулярное выражение обрабатывает [6][7] как часть следующего предложения. Если это неприемлемо, вы можете немного изменить шаблон, добавив [\d\[\]]* сразу после [.!?].

+0

Большое спасибо! Это действительно правильно подсчитывает количество предложений в обоих примерах :) Однако, если 2 аббревиатуры одно друг за другом (например, д-р Проф. Кто-то столкнулся с проблемой.) Формула считается взаимозависимой (здесь 3) – Flu

+1

@ Хорошо, проблема при этом вы не можете надежно распознать аббревиатуры в общем случае. Вы можете настроить шаблон по-разному (например: '. +? (?: (?

+0

Это абсолютно верно Лукас!Я не ожидаю получить идеальный вариант, но если можно исключить все аббревиатуры (предыдущая формула) и все двойные аббревиатуры, вы можете быть верными более чем в 90% случаев. Потому что ваше последнее решение хорошо работает с «Dr. Prof.» но если вы переключите их «Проф. д-р», это логично. Следовательно, если это возможно, и если бы вы могли предоставить мою формулу, игнорируя все двойные аббревиатуры, я был бы доволен :) – Flu

0

Похоже, что все, что вы хотите, это то, что проверяет, что не было капитала до периода. Это довольно легко сделать:

((?:[A-Z]\.|[^\.!?])+)[\.!?] 

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

Более чем один символ также позволяет избежать записи трех предложений для:

Что-то вроде этого ...

+0

Ваш пример имеет такое же количество чем моя формула регулярного выражения (15). Таким образом, аббревиатуры не исключаются, как предполагалось. – Flu

+0

@Flu Вы можете видеть, как он работает здесь: https://regex101.com/r/tO5bC6/1 Это определенно пропускает аббревиатуры. И я получаю подсчет 9 предложений? –

+0

@Flu Я только что проверил регулярное выражение с вашим кодом здесь: http://ideone.com/8SqA5k определенно дает мне 9 * не * 15. –

Смежные вопросы