2017-12-08 6 views
1

私はスペイン語のテキストでunnest_tokensを使用しようとしています。ユニグラムでは正常に動作しますが、バイグラムでは特殊文字が壊れます。tidytext :: 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" 
+0

あなたは() 'だけでなく' Sys.getlocaleの出力を投稿することができます:text列、のようなものを使用してunnest_tokensような結果は、あなたが、dfで結果を参加与える取得するには?デバッグに役立ちます。 – BrodieG

+0

これを再現することはできませんが、私はそれが[Unicode正規化](https://en.wikipedia.org/wiki/Unicode_equivalence)の問題だと強く思っています。 stringiには変換関数があります。 '?stringi :: stri_trans_nfc'を参照してください。 – alistaire

答えて

1

あなたがngramstoken引数を変更したときにそれが起こるようです。それはtidytextためsource codeに掘るパッケージqlcMatrix

library(qlcMatrix) 

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

を使用して周りの仕事をすることを行いますが、ここで、なぜ私はよく分からない、それは言葉のように見えるとngramsはtokenizerパッケージを使用して分割されています。これらの関数は異なるメソッドを使用します。tokenize_wordsは​​を使用しますが、tokenize_ngramscustom C++ codeを使用します。

RとC++のデータタイプを切り替える最後のステップが分かりますが、なぜ私は正確に説明できないのでしょうか?

+0

あなたの評価は正しいようです:これは 'tokenizers'のバグです。 skip_ngramsのC++ソースは、エンコーディングを指定しません。おそらく、デフォルトではネイティブエンコーディングになります。これは、LinuxおよびMacOSではUTF-8、WindowsではWindows-1252です。 –

+0

私はhttps://github.com/ropensci/tokenizers/issues/58にバグレポートを提出しました。 –

0

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すべて)に依存するものと同じ問題が発生する可能性があります。

0

問題の原因はわかりませんが、再現できました。ここでの結果は非常にunnest_tokensのそれに似ていますが、凝集体は用語であるとdfで他の変数を保持しません

library(corpus) 
df %>% term_counts(ngrams = 2) 
#> text term   count 
#> 1 1 césar moreira  1 
#> 2 1 moreira nuñez  1 

:私はまた、Windows上で、次の動作していることを確認することができます。

y <- df %>% term_counts(ngrams = 2) 
cbind(df[y$text,], y) 
関連する問題