Используйте gsub, чтобы заменить фигурный апостроф прямым апострофом в R списке векторов символов

Ищете руководство о том, как заменить фигурный апостроф прямым апострофом в списке R векторов символов.

Причина, по которой я заменяю фигурные апострофы, — позже в сценарии я проверяю каждый элемент списка, чтобы увидеть, найден ли он в словаре (используя qdapDictionary), чтобы убедиться, что это настоящее слово, а не мусор. В словаре используются прямые апострофы, поэтому слова с фигурными апострофами «отбрасываются».

Ниже приведен пример кода, который у меня есть в настоящее время. В моем тестовом списке элемент № 6 содержит фигурный апостроф, а элемент № 2 — прямой апостроф.

Пример:

list_TestWords <- as.list(c("this", "isn't", "ideal", "but", "we", "can’t", "fix", "it"))

func_ReplaceTypographicApostrophes <- function(x) {
   gsub("’", "'", x, ignore.case = TRUE)
 }

list_TestWords_Fixed <- lapply(list_TestWords, func_ReplaceTypographicApostrophes)

Результат: Без изменений. Пункт 6 по-прежнему использует фигурный апостроф. См. вывод ниже.

list_TestWords_Fixed
[[1]]
[1] "this"

[[2]]
[1] "isn't"

[[3]]
[1] "ideal"

[[4]]
[1] "but"

[[5]]
[1] "we"

[[6]]
[1] "can’t"

[[7]]
[1] "fix"

[[8]]
[1] "it"

Любая помощь, которую вы можете предложить, будет высоко оценена!


person SarahWeaver    schedule 18.10.2017    source источник
comment
Попробуйте gsub("’", "'", x, fixed=TRUE)   -  person Wiktor Stribiżew    schedule 18.10.2017
comment
Спасибо за предложение, Виктор. Не сработало, но буду рад дополнительным предложениям!   -  person SarahWeaver    schedule 18.10.2017
comment
Дополнительно: gsub("(*UCP)’", "'", x, perl=TRUE) или просто gsub("’", "'", x, perl=TRUE). Обратите внимание, что ignore.case = TRUE можно безопасно удалить.   -  person Wiktor Stribiżew    schedule 18.10.2017
comment
Пробовал каждую из этих модификаций, безрезультатно. :( . Может это как-то связано со структурой моего списка?   -  person SarahWeaver    schedule 18.10.2017


Ответы (5)


Возможно, вы столкнулись с ошибкой в ​​R в Windows. . Попробуйте использовать utf8::as_utf8 для ввода. В качестве альтернативы это также работает:

library(utf8)
list_TestWords <- as.list(c("this", "isn't", "ideal", "but", "we", "can’t", "fix", "it"))
lapply(list_TestWords, utf8_normalize, map_quote = TRUE)

Это заменит следующие символы апострофом ASCII:

U+055A ARMENIAN APOSTROPHE
U+2018 LEFT SINGLE QUOTATION MARK
U+2019 RIGHT SINGLE QUOTATION MARK
U+201B SINGLE HIGH-REVERSED-9 QUOTATION MARK
U+FF07 FULLWIDTH APOSTROPHE

Он также преобразует ваш текст в составную нормальную форму (NFC).

person Patrick Perry    schedule 18.10.2017
comment
Похоже, что utf_normalize и as_utf8 теперь находятся в пакете utf8. - person John M; 03.04.2018

Это может сработать: gsub("[\u2018\u2019\u201A\u201B\u2032\u2035]", "'", x)

Я нашел это здесь: http://axonflux.com/handy-regexes-for-smart-quotes

person bcarothers    schedule 19.10.2017

Я вижу проблему в вашем вызове gsub:

gsub("/’", "/'", x, ignore.case = TRUE)

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

gsub("’", "'", x, ignore.case = TRUE)

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

Демо

person Tim Biegeleisen    schedule 18.10.2017
comment
Спасибо, Тим, только что внес эту корректировку в свой сценарий (и в вопрос), но функция по-прежнему не заменяет фигурный апостроф. Любые другие идеи? - person SarahWeaver; 18.10.2017
comment
Часто бывает проще включить заменяемую вещь в класс символов, поэтому первый аргумент gsub становится "[’]" - person JDL; 18.10.2017
comment
@SarahWeaver Предлагаемый мной код работает в демо-версии, в которой используется версия R 3.3.2. - person Tim Biegeleisen; 18.10.2017
comment
@JDL Мы можем использовать класс символов по нескольким причинам. Во-первых, потому что у нас есть класс символов для представления в шаблоне регулярного выражения. Во-вторых, мы хотим избежать экранирования метасимвола регулярного выражения. Ни один из этих случаев здесь не применим. - person Tim Biegeleisen; 18.10.2017
comment
@Tim Biegeleisen - только что попробовал вашу демонстрационную функцию в тестовом списке, и она сработала, но когда я применил ту же функцию к моему реальному списку, это не сработало. Может ли это быть как-то связано со структурой списка? Когда я применяю функцию к элементу из моего реального списка (list_CorpusWords), она не меняет апостроф, но когда я ввожу само слово в функцию, он меняет. Какие-нибудь мысли? Пример: list_CorpusWords[1304] $word [1] не является › func_ReplaceTypographicApostrophes(list_CorpusWords[1304]) [1] не является › list_CorpusWords[1304] $word [1] не является - person SarahWeaver; 18.10.2017

То же самое собирался сказать.

Попробуйте использовать str_replace из пакета stringr, косая черта не понадобится.

person sorearm    schedule 18.10.2017

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

gsub("(\\w)(\\W)(\\w\\s)", "\\1'\\3","sid’s bicycle")
[1] "sid's bicycle"

Надеюсь, это поможет кому-то.

person user6793824    schedule 07.10.2018