【问题标题】:Does tidytext::unnest_tokens works with spanish characters?tidytext::unnest_tokens 是否适用于西班牙语字符?
【发布时间】:2018-05-22 18:50:24
【问题描述】:

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

【问题讨论】:

  • 你也可以发布Sys.getlocale() 的输出吗?将有助于调试。
  • 我无法重现此问题,但我强烈怀疑这是Unicode normalization 问题。 stringi 具有转换功能;见?stringi::stri_trans_nfc

标签: r tidytext


【解决方案1】:

当您将token 参数更改为ngrams 时,似乎会发生这种情况。我不知道为什么会这样,但这里有一个使用包qlcMatrix的解决方法

library(qlcMatrix)

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

【讨论】:

    【解决方案2】:

    我们与之前遇到过编码问题的几个人进行了交谈,他们分别是 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 中的所有 NLP)的东西,您都可能会遇到同样的问题。

    【讨论】:

    • 令牌生成器的这个问题现在已经解决,应该可以在包括 Windows 在内的所有平台上运行:github.com/ropensci/tokenizers/issues/58 我不知道为什么@meczupevi 下面的答案被删除了;这个问题非常相关。
    【解决方案3】:

    source code 中挖掘tidytext,看起来单词和ngram 是使用tokenizer 包拆分的。这些函数使用不同的方法:tokenize_words 使用stri_split,而tokenize_ngrams 使用custom C++ code

    我想最后一步——在 R 和 C++ 数据类型之间切换——会混淆变音符号,尽管我无法准确解释原因。

    【讨论】:

    • 您的评估对我来说似乎是正确的:这是tokenizers 中的一个错误。 skip_ngrams 的 C++ 源代码从不指定编码。最有可能的是,它默认为原生编码,在 Linux 和 MacOS 上为 UTF-8,在 Windows 上为 Windows-1252。
    • 我在github.com/ropensci/tokenizers/issues/58提交了一个错误报告
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 2018-04-14
      • 2023-03-18
      • 2020-08-25
      • 2012-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-03
      相关资源
      最近更新 更多