Поиск расширенных шаблонов регулярных выражений с помощью kwi c () - PullRequest
2 голосов
/ 31 марта 2020

Я хочу использовать kwi c (), чтобы найти шаблоны в тексте с более продвинутыми фразами регулярных выражений, но я борюсь с тем, как kwi c () разбивает фразы на две части, и возникли две проблемы:

1) Как использовать группировку с фразами, содержащими пробелы:

kwic(text, pattern = phrase("\\b(address|g[eo]t? into|gotten into)\\b \\bno\\b"), valuetype="regex")

Ошибка в stri_detect_regex (types_search, pattern, case_insensitive = case_insensitive): неправильно вложенные скобки в шаблоне регулярных выражений , (U_REGEX_MISMATCHED_PAREN)

2) Как искать более длинную последовательность слов (аналогично первому вопросу):

kwic("this is a test", pattern= phrase("(\\w+\\s){1,3}"), valuetype="regex", remove_separator=FALSE)

kwi c объект с 0 строками

kwic("this is a test", pattern= phrase("(\\w+ ){0,2}"), valuetype="regex", remove_separator=FALSE)

Ошибка в stri_detect_regex (types_search, pattern, case_insensitive = case_insensitive): неправильно вложенные скобки в шаблоне регулярных выражений. (U_REGEX_MISMATCHED_PAREN)

Спасибо за любые советы!

1 Ответ

0 голосов
/ 31 марта 2020

Что нужно понять с помощью phrase(), так это то, что он позволяет создавать последовательности шаблонов, разделенных пробелами, как однозначное значение. Он не должен, по крайней мере для обычного использования, включать разделители пробелов в качестве части шаблона.

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

Здесь мы просто помещаем различные шаблоны в phrase() с пробелом между ними. Это эквивалентно обертыванию их внутри list() и превращению последовательности отдельных шаблонов в элементы вектора символов.

library("quanteda")
#> Package version: 2.0.1

kwic("a b c a b d e", pattern = phrase("b c|d"), valuetype = "regex")
#>                                      
#>  [text1, 2:3]       a | b c | a b d e
#>  [text1, 5:6] a b c a | b d | e
kwic("a b c a b d e", pattern = list(c("b", "c|d")), valuetype = "regex")
#>                                      
#>  [text1, 2:3]       a | b c | a b d e
#>  [text1, 5:6] a b c a | b d | e

Мы также могли бы рассмотреть вектор совпадений последовательности, в том числе с очень инклюзивными совпадениями Например, ".+ ^a$" ниже соответствует любой последовательности из 1 или более символов, за которой следует токен "a". Обратите внимание, как ^$ явно указывает, что это начало и конец регулярного выражения (с одним токеном).

kwic("a b c a b d e", pattern = phrase(c("b c|d", ".+ ^a$")), valuetype = "regex")
#>                                      
#>  [text1, 2:3]       a | b c | a b d e
#>  [text1, 3:4]     a b | c a | b d e  
#>  [text1, 5:6] a b c a | b d | e

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

kwic("this is a test", pattern = phrase("* * *"))
#>                                      
#>  [text1, 1:3]      | this is a | test
#>  [text1, 2:4] this | is a test |

kwic("this is a test", pattern = phrase("* *"))
#>                                         
#>  [text1, 1:2]         | this is | a test
#>  [text1, 2:3]    this |  is a   | test  
#>  [text1, 3:4] this is | a test  |

Обратите внимание, наконец, что возможно включить пробел как часть сопоставления с образцом, но только если у вас есть токены, которые включают пробелы. Это было бы верно, если бы вы передавали аргумент remove_separators = FALSE в вызов tokens() через ... (см. ?kwic), или если вы создали токены другим способом, чтобы убедиться, что они содержат пробелы.

as.tokens(list(d1 = c("a b", " ", "c"))) %>%
  kwic(phrase("\\s"), valuetype = "regex")
#>                        
#>  [d1, 1]     | a b |  c
#>  [d1, 2] a b |     | c

Там отображаемое «ab» - это фактически один токен «ab», а не последовательность токенов «a», «b». Пробел во второй строке - это токен "".

Создан в 2020-03-31 пакетом Представить (v0.3.0)

...