tokens_replace () работает только с stri_trans_general (), а не с Encoding () - PullRequest
0 голосов
/ 20 февраля 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...