регулярное выражение, чтобы выделить предложения длиннее, чем n слов - PullRequest
0 голосов
/ 18 сентября 2018

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

До сих пор я получал следующее выражение для работы в большинстве случаев:

(\[*\(*[\w|\-|–|−|\/|≥|≤|’|“|”|μ]+\%*\)*\]*,*\:*\s+){24,}?(\[*\(*[\w|\-|–|−|\/|≥|≤|’|“|”|μ]+\%*\)*\]*[\.|?|!|$])

Кстати, я получилвдохновленный этим постом

Он содержит:

group1:
(\[*\(*[\w|\-|–|−|\/|≥|≤|’|“|”|μ]+\%*\)*\]*,*\:*\s+)


a repetition element (stating how many words n - 1):
{24,}?

group2:
(\[*\(*[\w|\-|–|−|\/|≥|≤|’|“|”|μ]+\%*\)*\]*[\.|?|!|$])

Основное назначение: group1 соответствует любому количеству символов слова ИЛИ другим символам, присутствующим в тексте, за которым следуетс одним или несколькими пробелами group1 должен повторяться 24 раза (или столько раз, сколько вы хотите, чтобы предложения были длинными) group2 соответствует любому количеству символов слова ИЛИ другим символам, присутствующим в тексте, после которых ставится точка, восклицательный знак,знак вопроса или разрыв абзаца.

Затем будет выделена любая строка, которая удовлетворяет всем вышеперечисленным требованиям.

Что я пока не могу решить, так это заставить работать, когда в тексте появляется точкас другим значением, чем полная остановка.Такие вещи, как: например, и т. Д., Рис., 1.89, и т. Д. .... Также мне не нравится, что мне пришлось вручную настроить его, чтобы иметь возможность обрабатывать предложения, содержащие несловесные символы, такие как, [(% - # µ "'и т. д. Я должен был бы расширять выражение каждый раз, когда сталкиваюсь с каким-то другим необычным символом.

Я был бы рад любой помощи или предложениям других способов решения этой проблемы..

1 Ответ

0 голосов
/ 18 сентября 2018

Вы можете многое сделать с помощью регулярного выражения для швейцарского армейского ножа, но проблема, которую вы представили, приближается к ограничениям регулярных выражений.Некоторые из вещей, которые вы хотите обнаружить, могут быть обработаны с небольшими изменениями, в то время как другие немного сложнее.Если ваша цель состоит в том, чтобы иметь какой-то инструмент, который точно измеряет длину предложения для каждой возможной мутации символов, вам, вероятно, нужно будет выйти за пределы LibreOffice и перейти к выделенному пользовательскому фрагменту программного обеспечения или стороннему инструменту.

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

  • Возможно, вы можете настроить регулярное выражение для нескольких особых случаев, таких как Fig. и Mr., включивих напрямую.Там, где у вас сейчас есть [\w|\-|–|−|\/|≥|≤|’|“|”|μ]+, что в основном равно [\w]+ с кучей других «специальных» символов, вы можете использовать что-то вроде ([\w|...]+|Mr\.|Mrs\.|Miss\.|Fig\.) (заменяя все специальные символы, где я написал ..., конечно).Регулярные выражения являются «жадными» алгоритмами и будут пытаться использовать как можно большую часть текста, поэтому, включив специальные «точечные слова» напрямую, вы можете заставить регулярное выражение «пропускать» определенные символы периода, которые являются проблематичными в вашем тексте.Убедитесь, что, когда вы хотите добавить «период пропуска», вам всегда предшествует обратный слеш, как в i\.e\., чтобы он не обрабатывался как специальный «любой» символ.

  • Подобный трюк может лучше захватывать числа, предполагая, что цифры, за которыми следует период, за которым следуют дополнительные цифры, должны «съесть» период: ([\w|...]+|\d+\.\d+|...) Это не обрабатывает все, и если авторы вашего документапишите что-то наподобие 0. в середине предложений, тогда у вас есть серьезная проблема, но она может по крайней мере правильно обрабатывать pi и e .

  • Кроме того, прямо сейчас, ваше регулярное выражение потребляет символы, пока не достигнет любого завершающего знака пунктуации - ., или !, или ?, или конца документа.Это проблема для таких вещей, как i.e., и 3.14, поскольку в отношении вашего регулярного выражения предложение останавливается на ..Вы могли бы требовать, чтобы ваше регулярное выражение останавливало предложение только после достижения ._ - период, за которым следует пробел.Это не исправит несоответствия для слов, подобных Mr., но это будет относиться к "словам", таким как 3.14, как к слову, а не как к концу предложения, которое ближе, чем вы в настоящее время.Чтобы сделать это, вам нужно будет включить нечетную последовательность как часть регулярного выражения «word», что-то вроде (\.[^ ]), которая говорит, что «точка, за которой следует не пробел», является частью слова;и тогда вам придется изменить завершающую последовательность на (\. |!|?|$).Повторите изменения аналогично для ! и ?.

  • Еще один полезный прием - использовать преимущества диапазонов кодов символов вместо непосредственного кодирования каждого специального символа.Прямо сейчас вы делаете это трудным путем, излагая каждого акцентированного персонажа, диграф и диакритик во вселенной.Вместо этого вы можете просто сказать, что все , что является «специальным символом», считается частью «слова»: вместо [\w|\-|–|−|\/|≥|≤|’|“|”|μ]+ напишите [\w|\-|\/|\u0080-\uFFFF], который захватывает каждый символ, кроме emoji инемногие из действительно малоизвестных мертвых языков.LibreOffice , кажется, имеет поддержку Unicode, поэтому использование шаблонов \uXXXX должно работать внутри [ диапазонов символов ].

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

...