3

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

4 回答 4

2

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

library(qlcMatrix)

splitStrings(df$text, sep = ' ', bigrams = TRUE, boundary = FALSE, bigram.binder = ' ')$bigrams
#[1] "César Moreira" "Moreira Nuñez"
于 2017-12-08T14:20:31.423 回答
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),您都可能会遇到同样的问题。

于 2017-12-11T17:25:33.727 回答
1

挖掘源代码tidytext看起来单词和 ngram 是使用tokenizer包拆分的。这些函数使用不同的方法:tokenize_words使用stri_split,而tokenize_ngrams使用自定义 C++ 代码

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

于 2017-12-08T15:00:01.743 回答
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加入结果,例如:dftext

y <- df %>% term_counts(ngrams = 2)
cbind(df[y$text,], y)
于 2017-12-11T17:52:00.720 回答