Comment extraire tous les émoticônes de texte?

Considérons la liste suivante:

a_list = ['
25
demandé sur tumbleweed 2017-03-31 20:30:57

8 réponses

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

import emoji

def extract_emojis(str):
  return ''.join(c for c in str if c in emoji.UNICODE_EMOJI)
34
répondu Pedro Castilho 2017-04-01 04:19:17

Si vous ne voulez pas utiliser une bibliothèque externe, en pythonique, vous pouvez simplement utiliser des expressions régulières et re.findall() avec une expression rationnelle 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 niés qui correspond à n'importe quel 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 mots et de la ponctuation qui seront facilement traités par cette approche, pour d'autres cas, vous pouvez simplement ajouter à la classe de caractères manuellement. Notez que puisque vous pouvez spécifier une plage de caractères dans la classe de caractères, vous pouvez même la rendre plus courte et plus flexible.

Une autre solution est au lieu d'une classe de caractères niés qui exclut les caractères non-emoji utiliser une classe de caractères qui accepte emojies ([] Sans ^). Comme il y a beaucoup d'emojis avec différentes valeurs unicode, il vous suffit d'ajouter les plages à la classe de caractères. Si vous voulez faire correspondre plus emojies voici une bonne référence contient tous les emojies standard avec la gamme respective pour différents emojies http://apps.timwhitlock.info/emoji/tables/unicode :

4
répondu Kasrâmvd 2017-04-01 05:47:47

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

s = u'Hello \U0001f1f7\U0001f1fa hello'

Ce qui fonctionnerait mieux 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)))
3
répondu user594836 2017-11-01 21:43:14

Je pense qu'il est important de souligner que les réponses précédentes ne fonctionneront pas avec des emojis comme , car il se compose de 4 emojis, et en utilisant ... in emoji.UNICODE_EMOJI retournera 4 emojis différents. Même pour emojis avec la couleur de la peau comme .

Ma solution comprend l'emoji et regex les modules. Le module regex prend en charge la reconnaissance des clusters de graphèmes (séquences de points de code Unicode rendus en un seul caractère), de sorte que nous pouvons 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 for char in word):
            emoji_list.append(word)

    return emoji_list

Test (avec plus d'émoticônes 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:

      ‍ ‍‍‍   

Modifier:

Si vous voulez inclure des drapeaux, comme la plage Unicode serait de pour , alors ajoutez:

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

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

Voir cet article pour plus d'informations sur les drapeaux.

2
répondu sheldonzy 2018-03-23 12:44:05

Étape 1: assurez-vous que votre texte, il est décodé en utf-8 text.decode('utf-8')

Étape 2: Localiser tous les emoji à partir de votre texte, vous devez séparer le texte caractère par caractère [str for str in decode]

Étape 3: Enregistre toutes les emoji dans une liste [c for c in allchars if c in emoji.UNICODE_EMOJI] exemple complet ci-dessous:

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

Si vous souhaitez supprimer du texte

>>> 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
répondu Cornea Valentin 2018-05-25 13:17:33

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. C'est 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
['     ']
1
répondu iair linker 2018-05-24 21:13:57

Ok-j'ai eu le même problème et j'ai trouvé une solution qui ne nécessite pas d'importer des bibliothèques (comme emoji ou re) et qui est une seule ligne de code. Il retournera tous les emojis dans la chaîne:

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

Cela m'a permis de créer une solution légère et j'espère que cela vous aidera tous. En fait-j'en avais besoin d'un qui filtrerait tous les emojis dans une chaîne-et c'est le même que le code ci-dessus mais avec un changement mineur:

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

En voici un exemple dans action:

  • a = ' moi así, bla es se ds '
  • b = extract_emojis (a)
  • b = [", ", ", "]
0
répondu Mohammed Terry Jack 2018-08-29 13:00:19

Tous Les emojis Unicode avec leurs points de code respectifs sont ici . Ils sont 1F600 à 1F64F, donc vous pouvez simplement les construire tous avec un itérateur de type range.

-3
répondu patrick 2017-03-31 17:37:53