2017-12-08 2 views
1

Ich versuche, unnest_tokens mit spanischem Text zu verwenden. Es funktioniert gut mit Unigrammen, aber bricht die Sonderzeichen mit Bigrammen.Funktioniert tidytext :: unnest_tokens mit spanischen Zeichen?

Der Code funktioniert unter Linux in Ordnung. Ich habe einige Informationen zum Gebietsschema hinzugefügt.

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

Können Sie die Ausgabe von 'Sys.getlocale()' als auch schreiben? Wird beim Debuggen helfen. – BrodieG

+0

Ich kann das nicht reproduzieren, obwohl ich stark befürchte, dass es sich um ein [Unicode normalization] (https://en.wikipedia.org/wiki/Unicode_equivalence) Problem handelt. Stringi hat Konvertierungsfunktionen; siehe '? stringi :: stri_trans_nfc'. – alistaire

Antwort

1

Es scheint, dass es passiert, wenn man das zu ngramstoken Argument ändern. Ich bin nicht sicher, warum es das tut, aber hier ist eine Arbeit um-Paket mit qlcMatrix

library(qlcMatrix) 

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

Graben in den source code für tidytext, es sieht aus wie die Worte und ngrams sind das tokenizer Paket aufgeteilt werden. Diese Funktionen verwenden unterschiedliche Methoden: tokenize_words verwendet stri_split, während tokenize_ngramscustom C++ code verwendet.

ich den letzten Schritt vor - Umschalten zwischen R und C++ Datentypen - garbles die diakritischen Zeichen, obwohl ich nicht, warum genau erklären kann.

+0

Ihre Einschätzung scheint mir richtig zu sein: Dies ist ein Fehler in 'Tokenizers'. Die C++ - Quelle für skip_ngrams gibt niemals die Codierung an. Höchstwahrscheinlich wird standardmäßig die native Codierung verwendet, bei Linux und MacOS UTF-8, bei Windows-1252 jedoch. –

+0

Ich habe einen Fehlerbericht unter https://github.com/opensci/tokenizers/issues/58 eingereicht –

0

Wir haben mit mehreren Personen geplaudert, die schon einmal Probleme mit der Kodierung hatten, mit und Estonian. Es ist immer ein bisschen schwierig, weil ich nie vor Ort das Problem reproduzieren kann, wie ich kann nicht mit Ihrem Problem:

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 

Sie sagen, dass Ihr Code auf Linux funktioniert gut, und dies steht im Einklang mit den Erfahrungen anderer und . Dies scheint immer ein Problem mit der Windows-Codierung zu sein. Dies steht nicht im Zusammenhang mit dem Code im Paket "tidtext" oder dem Tokenizers-Paket. Von dem, was ich gesehen habe, vermute ich, dass dies mit den C-Bibliotheken in Stringi zusammenhängt und wie sie sich auf Windows im Vergleich zu anderen Plattformen verhalten. Aus diesem Grund haben Sie wahrscheinlich die gleichen Probleme mit allem, was von Stringi abhängt (was praktisch ALL von NLP in R ist).

0

Ich weiß nicht, was das Problem ist, aber ich konnte es reproduzieren. Ich kann auch bestätigen, dass die folgenden Arbeiten unter Windows:

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

Das Ergebnis hier ist ähnlich wie die unnest_tokens, sondern Aggregate Begriff und nicht die anderen Variablen in df behalten. Um Ergebnisse wie unnest_tokens geben Sie, verbinden sich das Ergebnis mit df mit der text Spalte, so etwas wie:

y <- df %>% term_counts(ngrams = 2) 
cbind(df[y$text,], y) 
Verwandte Themen