2010-09-24 2 views
3

Есть ли простой трюк, чтобы изолировать первое предложение в большой строке текста? (Возможно, с использованием регулярных выражений.)Извлечь первое предложение из строки текста

Поиск первого полного перерыва "." не работает, как акронимы, такие как «U.S.A.» будет винить вещи.

(Там, вероятно, нет правильного ответа.)

ответ

0

Использование простой текстовой строки Theres не гарантировано способ сделать это, но, используя строку с некоторыми маскирования, например, если ваша строка имеет \ п в конце каждого строка или предложение, которое вы можете использовать для определения конца строки, кроме того, что вы должны просто угадать.

1

Обычно вы будете искать первую полную остановку, которая не следует за большой буквы. Но это не будет работать с некоторыми сокращениями.

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

7

№ Нет. Простой трюк. Чтобы сделать это правильно, вам нужно выполнить синтаксический анализ текста. Никто не может этого сделать. По крайней мере, пока. По крайней мере, не в 100% случаев. Главным образом потому, что он также влечет за собой семантический анализ текста. Видите ли, вопреки тому, что тип лингвистов, который учил вас грамматике в школе, считает, что то, что составляет предложение, довольно сложно подытожить в наборе правил, которым компьютер мог следовать, не понимая текст.

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

Но вы можете подобраться.

Возможно, я попытался бы найти первый период, знак вопроса или восклицательный знак, за которым следует пробел.

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

((.*?) является нежадным регулярное выражение, чтобы убедиться, что вы на самом деле найти только первое предложение.

+0

Это регулярное выражение терпит неудачу, если в предложении содержится акроним, такой как среднее предложение от U.S.A. :) – pauldoo

+0

@pauldoo, вы правы. Я только защищал (с '\ s') от первых двух символов пунктуации :( –

5

Вы заплатили бы за это делается? Если это так зе Амазонки Mechanical Turk, который ОХОТХОЗЯЙСТВА задачи для реальных людей по курсу, скажем, 0,01 доллара за обновление. По крайней мере, это чертовски чертит из двухлетней вычислительной лингвистики. ;-)

1

Как уже говорилось ранее, нет простого решения.

Более расширенная версия регулярного выражения может быть: /^(.*?(?<!\b\w)[.?!])\s+[A-Z0-9]/. Это не останавливается на аббревиатурах среднего предложения (но также и нет, если они находятся в конце предложения ...), следующее предложение должно начинаться с буквы верхнего регистра другой цифры ....

Если вы знайте список сокращений, которые вы не хотите, чтобы ваше регулярное выражение останавливалось, вы добавляете их как: /^(.*?(?<!\b\w|U\.S\.A|eg)[.?!])\s+[A-Z0-9]/.

Если вы знаете, на каком языке вы собираетесь использовать, может быть какой-то набор инструментов для анализа языка (NLP) - но это выходит за рамки этого вопроса.

0

Можете ли вы предположить, что аббревиатуры не имеют промежутков между периодами?Если это так, то это будет работать:

string.split('. ').first 

e.g.

s = "Lorem ipsum dolor sit amet, U.S.A adipiscing elit. Phasellus nulla magna, suscipit dapibus bibendum sit amet." 
s.split('. ').first 

=> "Lorem ipsum dolor sit amet, U.S.A adipiscing elit" 

Обратите внимание, что он разделяет конечный период.

+0

В вашем примере вы оставляете последний период в« США », поэтому это не решает проблему. Если аббревиатура была правильно акцентировался, он отрезал бы после «США», не доведя его до «элиты». – Matt

2

Это не может быть сделано в гарантированном порядке, но это поможет вам довольно близко с относительно простым выражением:

/(^.*?[a-z]{2,}[.!?])\s+\W*[A-Z]/ 

Начиная в начале строки (^) она без жадностью смотрит для любого количества произвольных символов (.*?), заканчивающихся как минимум двумя строчными буквами ([a-z]{2,}), а также вопросительным знаком или восклицательным знаком ([.!?]), за которым следует одно или несколько пробелов (\s+), ноль или более символов без слов например (\W*) и заглавную букву ([A-Z]).

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

  • капитализируется, как в «U.S.A.»
  • являются строчными, но индивидуальными буквами, как в "например" или "то есть"
  • или за ним следует строчная буква, как в «Это аббревиатура означает аббревиатуру».

Один недостаток заключается в том, что он не остановится, если предложение заканчивается пунктирным аббревиатурой в верхнем регистре или аббревиатурой, но для его простоты и эффективности это кажется справедливым компромиссом.

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