tidytext :: unnest_tokens是否适用于西班牙语字符?

时间:2017-12-08 13:55:51

标签: r tidytext

我正在尝试使用带有西班牙文本的unnest_tokens。它适用于unigrams,但用bigrams打破了特殊角色。

代码在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 个答案:

答案 0 :(得分:2)

当您将token参数更改为ngrams时,似乎会发生这种情况。我不确定为什么会这样做,但这是一个使用包qlcMatrix

的工作
library(qlcMatrix)

splitStrings(df$text, sep = ' ', bigrams = TRUE, boundary = FALSE, bigram.binder = ' ')$bigrams
#[1] "César Moreira" "Moreira Nuñez"

答案 1 :(得分:1)

挖掘tidytext的{​​{3}},看起来使用tokenizer包拆分了单词和ngram。这些函数使用不同的方法:tokenize_words使用stri_split,而tokenize_ngrams使用source code

我想最后一步 - 在R和C ++数据类型之间切换 - 使变音符号变得麻烦,尽管我无法解释为什么会这样。

答案 2 :(得分:1)

我们曾与几位曾遇到过编码问题的人聊过PolishEstonian。它总是有点棘手,因为我永远无法在本地重现问题,因为我无法解决您的问题:

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包中的代码甚至是tokenizers包无关;从我所看到的,我怀疑这与stringi中的C库以及它们如何在Windows上与其他平台相比起作用。因此,你可能会遇到与stringi相关的任何问题(R实际上是NL中的所有NLP)。

答案 3 :(得分:0)

我不知道问题是什么,但我能够重现它。我还可以确认以下内容适用于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)