Regex не фиксирует числа, записанные как слова
Я смотрю на Оливера Твиста на английском и французском языках. Я нашел этот сайт ( https://cran.r-project.org/web/packages/tidytext/vignettes/tidytext.html), который предоставляет код для применения номера главы к каждой строке текста. Когда я применяю его к английскому тексту, он работает нормально:
library(gutenbergr)
library(dplyr)
library(tidytext)
library(stringr)
twistEN <- gutenberg_download(730)
twistEN <- twistEN[118:nrow(twistEN),]
chaptersEN <- twistEN %>%
mutate(line = row_number(), chapter = cumsum(str_detect(text, regex("^chapter [\\divxlc]", ignore_case = TRUE)))) %>%
ungroup()
Когда я затем смотрю на chaptersEN, я вижу, что он правильно применяет номер главы в каждой строке. У меня проблемы с французским текстом. Вот мой код:
twistFR <- gutenberg_download(16023)
twistFR <- twistFR[123:nrow(twistFR),]
twistFR$text <- iconv(twistFR$text, "latin1", "UTF-8")
chaptersFR <- twistFR %>%
mutate(line = row_number(), chapter = cumsum(str_detect(text, regex("^chaptitre [\\divxlc]", ignore_case = TRUE)))) %>%
ungroup()
Проблема здесь в том, что главы не называются Глава 1 и Глава 2, они называются Chapitre Premier, Chapitre Deuxieme. Я считаю, что регулярное выражение находит номер главы, глядя на цифру, следующую за словом chapter (поправьте меня, если я ошибаюсь), поэтому оно не знает, что делать, если эта цифра записана как слово. Есть идеи, как применить номер главы?
2 ответа
В этом случае достаточно сопоставления строк, которые начинаются с заглавной буквы "CHAPITRE".
chaptersFR <- twistFR %>%
mutate(line = row_number(), chapter = cumsum(str_detect(text, regex("^CHAPITRE")))) %>%
ungroup()
chaptersFR %>%
filter(grepl("^chapitre", text, ignore.case = TRUE)) %>%
head(5)
# A tibble: 5 x 4
gutenberg_id text line chapter
<int> <chr> <int> <int>
1 16023 CHAPITRE PREMIER. 1 1
2 16023 CHAPITRE II 124 2
3 16023 CHAPITRE III 604 3
4 16023 CHAPITRE IV. 1006 4
5 16023 CHAPITRE V. 1333 5
chaptersFR %>%
filter(grepl("^chapitre", text, ignore.case = TRUE)) %>%
tail(5)
# A tibble: 5 x 4
gutenberg_id text line chapter
<int> <chr> <int> <int>
1 16023 CHAPITRE L. 18443 50
2 16023 CHAPITRE LI. 18973 51
3 16023 chapitre, Olivier se trouvait, à trois heures de l'après-midi, 18979 51
4 16023 CHAPITRE LII 19580 52
5 16023 CHAPITRE LIII. 19989 53
Короткий ответ: вы написали chaptitre вместо chapitre
Для чего вы используете [\\divxlc]
часть в коде?
Например:^chapitre [\\divxlc]
^
означает в начале строкиchapitre
соответствует только слову chapitre(только в нижнем регистре)пустое поле соответствует пространству
и части[\\divxlc]
соответствует только '\', 'd', 'i','v','x','l' или 'c'
Таким образом, он может соответствовать этим примерам:chapitre d, chapitre i или chapitre \
И если вы хотите, чтобы c в начале chapitre был в верхнем или нижнем регистре, вы можете использовать это: ^[cC]hapitre [\\divxlc]