Во время игры с лемматизацией, удалением стоп-слов, переносом слов и т. Д. Для немецкого текста у меня возникли проблемы с использованием функции 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]"Бюргер"; текст2: [1] "Бюргериннен"; текст3: [1] "Меншенрехт"; текст4: [1] "Меншенрехт"; текст5: [1] "Штрассе"; текст6: [1] "Штрасен" "-Таким образом, по сути, 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
, но я хотел бы получить более подробную информацию. Я здесь упускаю важный момент?