Работает ли 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)
Другие вопросы по тегам