tokens_replace() работает только с stri_trans_general(), а не с Encoding()
Во время игры с лемматизацией, удалением стоп-слов, выделением и т. Д. Для немецкого текста у меня были проблемы с использованием tokens_replace()
функция в quanteda
пакет. Я нашел решение (см. Код), которое, кажется, работает, хотя я не понимаю, почему. Таким образом, кто-то может объяснить:
Почему tokens_replace()
от quanteda
пакет работает правильно только при использовании stri_trans_general()
а не при использовании Encoding()
для немецких специальных символов, хотя оба, кажется, изменяют кодировку таким же образом?
Вот фрагмент воспроизводимого кода:
Сначала я создал словарь со словами, которые я хотел бы заменить (V2
) и их замена (V1
). С помощью tokens_replace()
с этими данными работает, но заменяет специальные символы для преобразованных слов, которые я не хочу:
dict <- as.data.frame(rbind(c("Bürger", "Bürgerin"), c("Bürger", "Bürgerinnen"),
c("Menschenrecht", "Menschenrechte"), c("Menschenrecht", "Menschenrechts"),
c("Straße", "Straßen")))
dict$V1 <- as.character(dict$V1)
dict$V2 <- as.character(dict$V2)
library(quanteda)
tokens <- tokens(c("Bürger", "Bürgerinnen", "Menschenrechte", "Menschenrechts", "Straße", "Straßen"))
tokens <- tokens_replace(x = tokens, pattern = dict$V2, replacement = dict$V1, valuetype = "fixed")
tokens
tokens from 6 documents:
text1 : [1] "Bürger"; text2 : [1] "B\xfcrger"; text3 : [1] "Menschenrecht"; text4 : [1] "Menschenrecht"; text5 : [1] "Straße"; text6 : [1] "Stra\xdfe""
Используя тот же словарь и тот же объект токенов и Encoding() <- "UTF-8"
Я получаю следующие результаты. Обратите внимание, что я использую stringi
пакет только для того, чтобы показать, что кодировка словарных статей была изменена с latin1/ASCII
в utf8/ASCII
,
library(stringi)
stri_enc_mark(dict$V1)
#[1] "latin1" "latin1" "ASCII" "ASCII" "latin1"
Encoding(dict$V1) <- "UTF-8"
Encoding(dict$V1)
#[1] "UTF-8" "UTF-8" "unknown" "unknown" "UTF-8"
stri_enc_mark(dict$V1)
#[1] "UTF-8" "UTF-8" "ASCII" "ASCII" "UTF-8"
stri_enc_mark(dict$V2)
#[1] "latin1" "latin1" "ASCII" "ASCII" "latin1"
Encoding(dict$V2) <- "UTF-8"
Encoding(dict$V2)
#[1] "UTF-8" "UTF-8" "unknown" "unknown" "UTF-8"
stri_enc_mark(dict$V2)
#[1] "UTF-8" "UTF-8" "ASCII" "ASCII" "UTF-8"
tokens <- tokens(c("Bürger", "Bürgerinnen", "Menschenrechte", "Menschenrechts", "Straße", "Straßen"))
tokens <- tokens_replace(x = tokens, pattern = dict$V2, replacement = dict$V1, valuetype = "fixed")
tokens
"токены из 6 документов: text1: [1] "Bürger"; text2: [1] "Bürgerinnen"; text3: [1] "Menschenrecht"; text4: [1] "Menschenrecht"; text5: [1] "Straße"; text6: [1] "Straßen"" - Так что в основном tokens_replace() ничего не заменил.
Опять же, я использую исходный набор данных, созданный выше, и делаю то же преобразование, но с stri_trans_general()
от stringi
пакет. Теперь он делает именно то, что я хочу - чего я не понимаю, потому что кодировка была изменена точно так же (с latin1/ASCII
в utf8/ASCII
).
dict <- as.data.frame(rbind(c("Bürger", "Bürgerin"), c("Bürger", "Bürgerinnen"),
c("Menschenrecht", "Menschenrechte"), c("Menschenrecht", "Menschenrechts"),
c("Straße", "Straßen")))
dict$V1 <- as.character(dict$V1)
dict$V2 <- as.character(dict$V2)
tokens <- tokens(c("Bürger", "Bürgerinnen", "Menschenrechte", "Menschenrechts", "Straße", "Straßen"))
stri_enc_mark(dict$V1)
dict$V1 <- stri_trans_general(dict$V1, "ASCII-Latin")
Encoding(dict$V1)
#[1] "UTF-8" "UTF-8" "unknown" "unknown" "UTF-8"
stri_enc_mark(dict$V1)
#[1] "UTF-8" "UTF-8" "ASCII" "ASCII" "UTF-8"
stri_enc_mark(dict$V2)
dict$V2 <- stri_trans_general(dict$V2, "ASCII-Latin")
Encoding(dict$V2)
#[1] "UTF-8" "UTF-8" "unknown" "unknown" "UTF-8"
stri_enc_mark(dict$V2)
#[1] "UTF-8" "UTF-8" "ASCII" "ASCII" "UTF-8"
tokens <- tokens_replace(x = tokens, pattern = dict$V2, replacement = dict$V1, valuetype = "fixed")
tokens
Буду признателен за любые комментарии по этому поводу. Я думаю, что это о том, как Encoding()
ручки UTF-8
против как stringi
ручки UTF-8
но я хотел бы получить больше деталей. Я здесь упускаю важный момент?