Отдельные предложения, заканчивающиеся научным справочным номером в r

Я работаю над проектом, в котором одним из шагов является разделение текста научных статей на предложения. Для этого я использую textrank, который, как я понимаю, ищет . , ? или ! и т. Д., Чтобы определить конец предложения токенизации.

Проблема, с которой я сталкиваюсь, заключается в предложениях, которые заканчиваются точкой, за которой непосредственно следует ссылочный номер (который также может быть в скобках). Приведенные ниже примеры представляют шаблоны, которые я идентифицировал и собрал до сих пор.


xx = c ("hello.1 World", "hello.1,2 World",  "hello.(1) world", "hello.(1,2) World", "hello.[1,2] World", "hello.[1] World")

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

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

любые предложения, как это сделать с регулярным выражением в R? Я изо всех сил пытался поискать в Интернете, но не нашел ответа.

В этом вопросе объясняется, как добавить пробел между нижним регистром и последующим верхним регистром. Добавить пробел между двумя буквами в строке в R в моем случае, я полагаю, мне нужно будет добавить пробел между буквой, точкой и цифрой / скобкой.

Мой ожидаемый результат выглядит примерно так:

("hello. 1 World", "hello. 1,2 World",  "hello. (1) world", "hello. (1,2) World", "hello. [1,2] World", "hello. [1] World")

Спасибо


person Bahi8482    schedule 05.03.2021    source источник
comment
Помогло бы это? \.(?=[[(]?\d+). Замените каждое совпадение на . , т. Е. Точку, за которой следует пробел   -  person Gurmanjot Singh    schedule 05.03.2021
comment
@GurmanjotSingh большое спасибо. Это работает. и спасибо, что отправили ссылку на регулярное выражение 101, так я могу понять это и изменить, если я встречусь с вариациями в этом шаблоне.   -  person Bahi8482    schedule 05.03.2021
comment
одно небольшое изменение, которое я сделал, - это добавить \D, поэтому я не добавляю пробел в десятичные дроби. \D\.(?=[[(]?\d+) regex101.com/r/vffKdU/1   -  person Bahi8482    schedule 05.03.2021


Ответы (1)


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

\.(?=\d+|\(\d+(?:,\d+)*\)|\[\d+(?:,\d+)*\])

а затем замените точкой с последующим одним пробелом. Пример сценария:

xx <- c("hello.1 World", "hello.1,2 World", "hello.(1) world", "hello.(1,2) World",
        "hello.[1,2] World", "hello.[1] World")
output <- gsub("\\.(?=\\d+|\\(\\d+(?:,\\d+)*\\)|\\[\\d+(?:,\\d+)*\\])", ". ", xx, perl=TRUE)
output

[1] "hello. 1 World"     "hello. 1,2 World"   "hello. (1) world"
[4] "hello. (1,2) World" "hello. [1,2] World" "hello. [1] World"
person Tim Biegeleisen    schedule 05.03.2021