tidytext::unnest_tokens 能处理西班牙语字符吗?

3

我正在尝试使用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"

你能同时发布 Sys.getlocale() 的输出结果吗?这将有助于调试。 - BrodieG
我无法重现这个问题,但我强烈怀疑这是一个Unicode规范化问题。stringi有转换函数;请参阅?stringi::stri_trans_nfc - alistaire
4个回答

2
我们已经与遇到编码问题的几个人进行了交谈,其中包括波兰语和爱沙尼亚语。这总是有点棘手,因为我无法像您的问题一样在本地重现该问题:
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中NLP)中遇到同样的问题。

这个与分词器相关的问题现在已经解决,应该可以在所有平台上运行,包括Windows:https://github.com/ropensci/tokenizers/issues/58 我不知道为什么@meczupevi下面的答案被删除了;它对这个问题非常相关。 - Julia Silge

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
挖掘源代码中的tidytext,看起来单词和ngram是使用tokenizer包拆分的。这些函数使用不同的方法:tokenize_words使用stri_split,而tokenize_ngrams使用自定义的C++代码。我想最后一步——在R和C++数据类型之间切换——会破坏变音符号,尽管我无法准确解释为什么。

你的评估对我来说是正确的:这是tokenizers中的一个错误。skip_ngrams的C++源代码从未指定编码。很可能,默认为本地编码,在Linux和MacOS上为UTF-8,而在Windows上为Windows-1252。 - Patrick Perry
我在 https://github.com/ropensci/tokenizers/issues/58 提交了一个错误报告。 - Patrick Perry

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给出的结果,请使用text列将结果与df连接起来,如下所示:
y <- df %>% term_counts(ngrams = 2)
cbind(df[y$text,], y)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接