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 но я хотел бы получить больше деталей. Я здесь упускаю важный момент?

0 ответов

Другие вопросы по тегам