Работает ли tidytext::unnest_tokens с испанскими символами?
Я пытаюсь использовать unnest_tokens с испанским текстом. Он отлично работает с униграммами, но разбивает специальные символы биграммами.
Код отлично работает на Linux. Я добавил информацию о локали.
library(tidytext)
library(dplyr)
df <- data_frame(
text = "César Moreira Nuñez"
)
# works ok:
df %>%
unnest_tokens(word, text)
# # A tibble: 3 x 1
# word
# <chr>
# 1 césar
# 2 moreira
# 3 nuñez
# breaks é and ñ
df %>%
unnest_tokens(bigram, text, token = "ngrams", n = 2 )
# # A tibble: 2 x 1
# bigram
# <chr>
# 1 cã©sar moreira
# 2 moreira nuã±ez
> Sys.getlocale()
[1] "LC_COLLATE=English_United States.1252;LC_CTYPE=English_United
States.1252;LC_MONETARY=English_United
States.1252;LC_NUMERIC=C;LC_TIME=English_United States.1252"
4 ответа
Кажется, что это происходит, когда вы меняете token
аргумент ngrams
, Я не уверен, почему это так, но вот обойти использование пакета qlcMatrix
library(qlcMatrix)
splitStrings(df$text, sep = ' ', bigrams = TRUE, boundary = FALSE, bigram.binder = ' ')$bigrams
#[1] "César Moreira" "Moreira Nuñez"
Мы пообщались с несколькими людьми, которые ранее сталкивались с проблемами с кодировкой, с польским и эстонским языками. Это всегда немного сложно, потому что я никогда не могу воспроизвести проблему локально, как я не могу с вашей проблемой:
library(tidytext)
library(dplyr)
df <- data_frame(
text = "César Moreira Nuñez"
)
df %>%
unnest_tokens(word, text)
#> # A tibble: 3 x 1
#> word
#> <chr>
#> 1 césar
#> 2 moreira
#> 3 nuñez
df %>%
unnest_tokens(bigram, text, token = "ngrams", n = 2 )
#> # A tibble: 2 x 1
#> bigram
#> <chr>
#> 1 césar moreira
#> 2 moreira nuñez
Вы говорите, что ваш код отлично работает в Linux, и это соответствует опыту других. Кажется, это всегда проблема с кодировкой Windows. Это не относится к коду в пакете tidytext или даже к пакету токенизаторов; из того, что я видел, я подозреваю, что это связано с библиотеками C в stringi и тем, как они работают в Windows по сравнению с другими платформами. Из-за этого у вас, вероятно, будут те же проблемы со всем, что зависит от stringi (который практически ВСЕ из NLP в R).
Копаться в исходном коде для tidytext
похоже, слова и нграммы разделены с помощью tokenizer
пакет. Эти функции используют разные методы: tokenize_words
использования stri_split
, в то время как tokenize_ngrams
использует пользовательский код C++.
Я представляю себе последний шаг - переключение между типами данных R и C++ - искажает диакритические знаки, хотя я не могу точно объяснить, почему.
Я не знаю, в чем проблема, но я смог ее воспроизвести. Я также могу подтвердить, что в Windows работает следующее:
library(corpus)
df %>% term_counts(ngrams = 2)
#> text term count
#> 1 1 césar moreira 1
#> 2 1 moreira nuñez 1
Результат здесь очень похож на unnest_tokens
, но агрегирует по термину и не сохраняет другие переменные в df
, Чтобы получить результаты, как unnest_tokens
дает вам, присоединиться к результату с df
с использованием text
колонка, что-то вроде:
y <- df %>% term_counts(ngrams = 2)
cbind(df[y$text,], y)