it-swarm.com.de

Wie kann man alle Emojis aus Text extrahieren?

Betrachten Sie die folgende Liste:

a_list = ['???? ???? me así, bla es se ???? ds ????????????']

Wie kann ich alle Emojis in a_list in einer neuen Liste extrahieren ?:

new_lis = ['???? ???? ???? ???? ???? ????']

Ich habe versucht, Regex zu verwenden, aber ich habe nicht alle möglichen Emojis-Kodierungen.

27
tumbleweed

Sie können die Bibliothek emoji verwenden. Sie können prüfen, ob ein einzelner Codepoint ein Emoji-Codepoint ist, indem Sie prüfen, ob er in emoji.UNICODE_EMOJI enthalten ist.

import emoji

def extract_emojis(str):
  return ''.join(c for c in str if c in emoji.UNICODE_EMOJI)
38
Pedro Castilho

Wenn Sie keine externe Bibliothek verwenden möchten, können Sie als Pythonic-Methode einfach reguläre Ausdrücke und re.findall() mit einer richtigen Regex verwenden, um die Emojies zu finden:

In [74]: import re
In [75]: re.findall(r'[^\w\s,]', a_list[0])
Out[75]: ['????', '????', '????', '????', '????', '????']

Der reguläre Ausdruck r'[^\w\s,]' ist eine negierte Zeichenklasse, die mit jedem Zeichen übereinstimmt, das kein Word-Zeichen, Leerzeichen oder Komma ist.

Wie ich bereits in einem Kommentar erwähnte, enthält ein Text im Allgemeinen Word-Zeichen und Interpunktionszeichen, mit denen sich dieser Ansatz leicht umgehen lässt. In anderen Fällen können Sie sie einfach manuell zur Zeichenklasse hinzufügen. Da Sie einen Zeichenbereich in der Zeichenklasse angeben können, können Sie ihn sogar kürzer und flexibler machen.

Eine andere Lösung ist anstelle einer negierten Zeichenklasse, die ausschließt, dass die Nicht-Emoji-Zeichen eine Zeichenklasse verwenden, die Emojies akzeptiert ([] ohne ^). Da es viele Emojis mit unterschiedlichen Unicode-Werten gibt, müssen Sie nur die Bereiche zur Zeichenklasse hinzufügen. Wenn Sie mehr Emojies abgleichen möchten, finden Sie hier eine gute Referenz. Sie enthält alle Standard-Emojies mit dem jeweiligen Bereich für verschiedene Emojies http://apps.timwhitlock.info/emoji/tables/unicode :

4
Kasrâmvd

Ich denke, es ist wichtig darauf hinzuweisen, dass die vorherigen Antworten nicht mit Emojis funktionieren, wie zB ???? ‍ ???? ‍ ???? ‍ ???? , weil es aus 4 Emojis besteht, und mit ... in emoji.UNICODE_EMOJI werden 4 verschiedene Emojis zurückgegeben. Gleiches gilt für Emojis mit Hautfarbe wie ????????.

Meine Lösung enthält die Module emoji und regex . Das Regex-Modul unterstützt das Erkennen von Graphem-Clustern (Sequenzen von Unicode-Codepunkten, die als einzelnes Zeichen dargestellt werden), sodass wir Emojis wie ???? ‍ ???? ‍ ???? ‍ ???? 

import emoji
import regex

def split_count(text):

    emoji_list = []
    data = regex.findall(r'\X', text)
    for Word in data:
        if any(char in emoji.UNICODE_EMOJI for char in Word):
            emoji_list.append(Word)

    return emoji_list

Testen (mit mehr Emojis mit Hautfarbe):

line = ["???? ???? me así, se ???? ds ???????????? hello ????????‍???? emoji hello ????‍????‍????‍???? how are ???? you today????????????????"]

counter = split_count(line[0])
print(' '.join(emoji for emoji in counter))

ausgabe:

???? ???? ???? ???? ???? ???? ????????‍???? ????‍????‍????‍???? ???? ???????? ????????

Bearbeiten: 

Wenn Sie Flags einfügen möchten, z. B. ???????? der Unicode-Bereich wäre von ???? bis ???? , so füge hinzu:

flags = regex.findall(u'[\U0001F1E6-\U0001F1FF]', text) 

auf die Funktion oben und return emoji_list + flags

In diesem Beitrag finden Sie weitere Informationen zu den Flaggen.

4
sheldonzy

Die am besten bewertete Antwort funktioniert nicht immer. Beispielsweise werden Flag-Emojis nicht gefunden. Betrachten Sie die Zeichenfolge:

s = u'Hello \U0001f1f7\U0001f1fa hello'

Was würde besser funktionieren

import emoji
emojis_list = map(lambda x: ''.join(x.split()), emoji.UNICODE_EMOJI.keys())
r = re.compile('|'.join(re.escape(p) for p in emojis_list))
print(' '.join(r.findall(s)))
3
user594836

Schritt 1: Stellen Sie sicher, dass Ihr Text auf utf-8 decodiert wird.text.decode('utf-8') 

Schritt 2: Suchen Sie alle Emoji aus Ihrem Text. Sie müssen den Text zeichenweise trennen.[str for str in decode]

Schritt 3: Speichert alle Emoji in einer Liste[c for c in allchars if c in emoji.UNICODE_EMOJI]Vollständiges Beispiel unten:

>>> import emoji
>>> text     = "???? ???? me así, bla es se ???? ds ????????????"
>>> decode   = text.decode('utf-8')
>>> allchars = [str for str in decode]
>>> list     = [c for c in allchars if c in emoji.UNICODE_EMOJI]
>>> print list
[u'\U0001f914', u'\U0001f648', u'\U0001f60c', u'\U0001f495', u'\U0001f46d', u'\U0001f459']

wenn Sie aus Text entfernen möchten

>>> filtred  = [str for str in decode.split() if not any(i in str for i in list)]
>>> clean_text = ' '.join(filtred)
>>> print clean_text
me así, bla es se ds
2
Cornea Valentin
from emoji import *

EMOJI_SET = set()

# populate EMOJI_DICT
def pop_emoji_dict():
    for emoji in UNICODE_EMOJI:
        EMOJI_SET.add(emoji)

# check if emoji
def is_emoji(s):
    for letter in s:
        if letter in EMOJI_SET:
            return True
    return False

Dies ist eine bessere Lösung, wenn Sie mit großen Datensätzen arbeiten, da Sie nicht jedes Mal alle Emojis durchlaufen müssen. Fand das, um bessere Ergebnisse zu erzielen :)

1
sushi_dev

Die Lösung, um genau das zu bekommen, was Tumbleweed verlangt, ist eine Mischung aus der Antwort mit der höchsten Bewertung und der Antwort des Benutzers594836. Dies ist der Code, der in Python 3.6 für mich funktioniert. 

import emoji
import re

test_list=['???? ???? me así,bla es,se ???? ds ????????????']

## Create the function to extract the emojis
def extract_emojis(a_list):
    emojis_list = map(lambda x: ''.join(x.split()), emoji.UNICODE_EMOJI.keys())
    r = re.compile('|'.join(re.escape(p) for p in emojis_list))
    aux=[' '.join(r.findall(s)) for s in a_list]
    return(aux)

## Execute the function
extract_emojis(test_list)

## the output
['???? ???? ???? ???? ???? ????']
1
iair linker

Ok - Ich hatte das gleiche Problem und ich habe eine Lösung gefunden, bei der Sie keine Bibliotheken (wie Emoji oder Re) importieren müssen, sondern nur eine einzige Codezeile. Es werden alle Emojis in der Zeichenfolge zurückgegeben:

def extract_emojis(sentence):
    return [Word for Word in sentence.split() if str(Word.encode('unicode-escape'))[2] == '\\' ]

Dies ermöglichte es mir, eine leichte Lösung zu schaffen, und ich hoffe, es hilft Ihnen allen. Eigentlich - ich brauchte einen, der alle Emojis in einer Zeichenfolge herausfiltern würde - und das ist derselbe wie der obige Code, aber mit einer kleinen Änderung:

def filter_emojis(sentence):
        return [Word for Word in sentence.split() if str(Word.encode('unicode-escape'))[2] != '\\' ]

Hier ist ein Beispiel davon in Aktion:

  • a = '???? ???? ich bin da, bla es se ???? ds ???????????? '
  • b = extract_emojis (a)
  • b = ["????", "????", "????", "?????????????"]
0

Diese Funktion erwartet eine Zeichenfolge, sodass die Liste der Eingaben in Zeichenfolge konvertiert wird

a_list = '???? ???? me así, bla es se ???? ds ????????????'

# Import the necessary modules
from nltk.tokenize import regexp_tokenize

# Tokenize and print only emoji
emoji = "['\U0001F300-\U0001F5FF'|'\U0001F600-\U0001F64F'|'\U0001F680- 
 \U0001F6FF'|'\u2600-\u26FF\u2700-\u27BF']"

print(regexp_tokenize(a_list, emoji)) 

output :['????', '????', '????', '????', '????']
0
Amar