63 votes

Comment extraire tous les emojis d'un texte ?

Considérez la liste suivante :

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

Comment puis-je extraire dans une nouvelle liste tous les emojis à l'intérieur a_list ? :

new_lis = ['     ']

J'ai essayé d'utiliser le regex, mais je n'ai pas tous les encodages possibles des emojis.

0 votes

81voto

Pedro Castilho Points 5570

Vous pouvez utiliser le emoji bibliothèque. Vous pouvez vérifier si un point de code unique est un point de code emoji en vérifiant s'il est contenu dans le fichier emoji.UNICODE_EMOJI .

import emoji

def extract_emojis(s):
  return ''.join(c for c in s if c in emoji.UNICODE_EMOJI['en'])

0 votes

Vous pouvez télécharger la liste des emoji en format string/int présente dans #EmojiCodeSheet aquí pour un comparateur personnalisé.

1 votes

Votre code ne peut pas détecter les drapeaux dans le texte : extract_emojis(" ")

0 votes

@NomanDilawar c'est parce que mon code itère sur chaque caractère. Les drapeaux Unicode sont une combinaison de deux caractères "indicateurs régionaux" qui ne sont pas, individuellement, des emoji. Si vous voulez détecter les drapeaux Unicode, vous devrez vérifier des paires de caractères.

35voto

sheldonzy Points 1707

Je pense qu'il est important de souligner que les réponses précédentes ne fonctionneront pas avec des emojis comme , car ils sont composés de 4 emojis, et en utilisant ... in emoji.UNICODE_EMOJI renverra 4 émojis différents. Même chose pour les emojis avec une couleur de peau comme .

Ma solution

Inclure le emoji et regex modules. Le module regex permet de reconnaître grappes de graphèmes (séquences de points de code Unicode rendues comme un seul caractère), nous pouvons donc compter les emojis comme

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['en'] for char in word):
            emoji_list.append(word)

    return emoji_list

Pruebas

avec plus d'emojis avec la couleur de la peau :

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

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

sortie :

Inclure les drapeaux

Si vous voulez inclure des drapeaux, comme la gamme Unicode serait de a alors ajoutez :

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

à la fonction ci-dessus, et return emoji_list + flags .

Véase cette réponse à "Une regex en python qui correspond à la classe de caractères de l'indicateur régional". pour plus d'informations sur les drapeaux.

Pour les plus récents emoji versions

pour fonctionner avec les emoji >= v1.2.0, vous devez ajouter un spécificateur de langue (par ex. en comme dans le code ci-dessus) :

emoji.UNICODE_EMOJI['en']

0 votes

Votre code fonctionne bien, mais comment pouvons-nous gérer les drapeaux ? " "

0 votes

@NomanDilawar Bonjour, désolé pour le retard. J'ai édité ma réponse. J'ai effectué quelques tests et cela semble fonctionner correctement maintenant.

0 votes

UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal if any(char in emoji.UNICODE_EMOJI for char in word): c'est ce que je reçois.

11voto

Kasramvd Points 32864

Si vous ne souhaitez pas utiliser une bibliothèque externe, vous pouvez, de manière pythique, utiliser simplement des expressions régulières et re.findall() avec une regex appropriée pour trouver les emojies :

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

L'expression régulière r'[^\w\s,]' est une classe de caractères négationnistes qui correspond à tout caractère qui n'est pas un caractère de mot, un espace ou une virgule.

Comme je l'ai mentionné dans le commentaire, un texte contient généralement des caractères de mot et de ponctuation qui seront facilement traités par cette approche, pour les autres cas, vous pouvez simplement les ajouter à la classe de caractères manuellement. Notez que puisque vous pouvez spécifier une gamme de caractères dans la classe de caractères, vous pouvez même la rendre plus courte et plus flexible.

Une autre solution consiste à utiliser, au lieu d'une classe de caractères négatifs qui exclut les caractères non emoji, une classe de caractères qui accepte les emojies ( [] sans ^ ). Puisqu'il y a beaucoup d'emojis avec des valeurs unicode différentes il suffit d'ajouter les plages à la classe de caractères. Si vous voulez faire correspondre plus d'emojies, voici une bonne référence contenant tous les emojies standard avec les plages respectives pour les différents emojies. http://apps.timwhitlock.info/emoji/tables/unicode :

1 votes

Cela fonctionne pour cette entrée particulière, mais il y a beaucoup d'autres caractères non emoji qui n'entrent pas dans les catégories suivantes \w , \s ou une virgule.

0 votes

@user2357112 Un texte contient généralement des caractères de mot et de ponctuation qui seront facilement traités par cette approche, pour d'autres cas, vous pouvez simplement les ajouter à la classe de caractères manuellement Notez que puisque vous pouvez spécifier une gamme de caractères dans la classe de caractères, vous pouvez même la rendre plus courte et plus flexible.

1 votes

Votre regex échoue sur toute ponctuation sans virgule, entre autres choses.

6voto

user594836 Points 41

La réponse la mieux notée ne fonctionne pas toujours. Par exemple, les emojis de drapeaux ne seront pas trouvés. Considérez la chaîne :

s = u'Hello \U0001f1f7\U0001f1fa hello'

Ce qui fonctionnerait mieux, c'est

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)))

3voto

iair linker Points 31

La solution pour obtenir exactement ce que tumbleweed demande, est un mélange entre la réponse la mieux notée et la réponse de user594836. Voici le code qui fonctionne pour moi en Python 3.6.

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
['     ']

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X