2017-04-12 3 views
5

Ich will, um zu bestimmen, welche Elemente meines Vektors Emoji enthalten:Wie kann ich Emoji mit einem R Regex übereinstimmen?

x = c('', 'no', '', '', 'no', '', '䨺', '감사') 
x 
# [1] "\U0001f602" "no"   "\U0001f379" "\U0001f600" "no"   "\U0001f61b" "䨺"   "감사" 

Related posts andere Sprachen nur decken, und weil meist beziehen sie sich auf Fachbibliotheken, kann ich nicht einen Weg finden, um R zu übersetzen:

Die zweite sahen sehr vielversprechend aus, aber leider (nicht durch Zufuhr von perl = TRUE fest):

x[grepl('[\u{1F600}-\u{1F6FF}]', x)] 

Error: invalid \u{xxxx} sequence (line 1)

ähnlichen Fragen aus anderen Fragen zu kommen. Wie können wir Emoji in R zusammenbringen?

+6

Hauptstadt U? (3 zu gehen) – SymbolixAU

+0

@SymbolixAU oh mein! Nun, das ist peinlich orz – MichaelChirico

+0

Sie wollen auch die Reichweite reduzieren, um die "Getränk" Emoji zu erfassen :) – SymbolixAU

Antwort

2

Ich konvertiere die Codierung in UTF-8, um den UTF-8-Wert von Emojis Wert mit dem gesamten Emoji-Wert in remoji Bibliothek zu vergleichen, die in UTF-8 ist. Ich verwende die Bibliothek stringr, um die Position von Emojis im Vektor zu finden. Man kann grep oder eine andere Funktion verwenden.

1. Methode:

library(stringr) 
xvect = c('', 'no', '', '', 'no', '') 

Encoding(xvect) <- "UTF-8" 

which(str_detect(xvect,"[^[:ascii:]]")==T) 
# [1] 1 3 4 6 

Hier 1,3,4 und 6 sind Charakter Emoji in diesem Fall.

Edited:

2. Methode: ein Paket remoji mit devtools unter Befehl namens Install verwenden, da wir bereits die Emoji-Elemente in UTF umgewandelt -8. Wir können nun die UTF- Werte aller in der Emoji-Bibliothek vorhandenen Emojis vergleichen. Verwenden trimws, um die Leerzeichen zu entfernen

install.packages("devtools") 

devtools::install_github("richfitz/remoji") 
library(remoji) 
emj <- emoji(list_emoji(), TRUE) 
xvect %in% trimws(emj) 

Output:

which(xvect %in% trimws(emo)) 
# [1] 1 3 4 6 

Beide oben genannten Verfahren sind nicht voll fest und ersten Methode wird davon ausgegangen, dass es keine irgendwelche ASCII-Zeichen außer Emojis in dem Vektor und zweite Methode stützt sich auf die Bibliothek Informationen von remoji. Falls eine bestimmte Emoji-Information nicht in der Bibliothek vorhanden ist, kann der letzte Befehl einen FALSE anstelle von TRUE ergeben.

Finale Edit:

Gemäß der Diskussion unter dem OP (@MichaelChirico) und @SymbolixAU.Dank der beiden scheint es das Problem mit dem kleinen Tippfehler des Kapitals U zu sein. Der neue Regex ist xvect[grepl('[\U{1F300}-\U{1F6FF}]', xvect)]. Der Bereich in der Zeichenklasse wird von F300 bis F6FF genommen. Man kann natürlich diesen Bereich auf einen neuen Bereich ändern, wenn ein Emoji außerhalb dieses Bereichs liegt. Dies ist möglicherweise nicht die vollständige Liste und im Laufe der Zeit können diese Bereiche weiter zunehmen/sich verändern.

+1

Es ist ein netter Vorschlag, aber es gibt _many_ Nicht-ASCII-Zeichen in meinem Vektor, die nicht Emoji sind. Ich habe meinen Beitrag aktualisiert, um dies zu berücksichtigen. – MichaelChirico

+0

@MichaelChirico Ja, ich weiß, dass beide der oben genannten Methoden einige Einschränkungen haben, ich versuche auch herauszufinden, ob es bessere Alternativen in R gibt. Seltsamerweise geben beide oben genannten Befehle auch nach den neuen Zeichen richtige Ergebnisse. Ich bin nicht sicher, warum – PKumar

+1

Die typo-korrigierte & erweiterte Version aus den Kommentaren scheint ziemlich gut zu sein: 'x [grepl ('[\ U {1F300} - \ u {1F6FF}]', x)]' – MichaelChirico

Verwandte Themen