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 de a_list
?:
new_lis = ['???? ???? ???? ???? ???? ????']
J'ai essayé d'utiliser regex, mais je n'ai pas tous les encodages emojis possibles.
Vous pouvez utiliser la bibliothèque emoji
. 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)
Si vous ne souhaitez pas utiliser une bibliothèque externe, utilisez simplement Pythonic pour utiliser des expressions régulières et re.findall()
avec une expression rationnelle appropriée pour rechercher les émoticônes:
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 inversée qui correspond à tout caractère autre qu'un caractère Word, un espace ou une virgule.
Comme je l'ai mentionné dans un commentaire, un texte contient généralement des caractères Word et des signes de ponctuation qui seront facilement traités par cette approche. Dans d'autres cas, vous pouvez simplement les ajouter manuellement à la classe de caractères. 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 consiste à utiliser une classe de caractères qui accepte les émoticônes ([]
sans ^
) au lieu d’une classe de caractères inversée excluant les caractères non-emoji. Comme il y a beaucoup d'émojis avec différentes valeurs unicode , il vous 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 la gamme correspondante pour différents emojies http://apps.timwhitlock.info/emoji/tables/unicode :
Je pense qu'il est important de souligner que les réponses précédentes ne fonctionneront pas avec des émoticônes comme ?????? ?????? ???? , car il se compose de 4 émoticônes, et utiliser ... in emoji.UNICODE_EMOJI
renverra 4 émoticônes différents. Pareil pour les emojis avec une couleur de peau comme ????????.
Ma solution inclut les modules emoji
et regex
. Le module regex prend en charge la reconnaissance des grappes de graphèmes (séquences de points de code Unicode restituées sous forme de caractère unique), ce qui permet de compter les émojis du type ????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
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 ayant la couleur de 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 gamme Unicode serait de ???? à ???? , 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.
La réponse la mieux notée ne fonctionne pas toujours. Par exemple, les emojis de drapeau ne seront pas trouvés. Considérons 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)))
Étape 1: Assurez-vous que votre texte est décodé sous utf-8text.decode('utf-8')
Étape 2: Localisez tous les emoji de votre texte, vous devez séparer le texte caractère par caractère[str for str in decode]
Étape 3: Enregistre tous les émoticônes 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 voulez 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
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
C'est une meilleure solution lorsque vous travaillez avec de grands ensembles de données car vous n'avez pas à parcourir en boucle tous les émoticônes à chaque fois. Trouvé ceci pour me donner de meilleurs résultats :)
La solution pour obtenir exactement ce que demande tumbleweed 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 dans 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
['???? ???? ???? ???? ???? ????']
Ok - j'ai eu le même problème et j'ai mis au point une solution qui ne nécessite aucune importation de bibliothèques (comme emoji ou re) et qui consiste en une seule ligne de code. Il retournera tous les emojis de 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 émoticônes d'une chaîne - et c'est la même chose que le code ci-dessus mais avec une modification mineure:
def filter_emojis(sentence):
return [Word for Word in sentence.split() if str(Word.encode('unicode-escape'))[2] != '\\' ]
En voici un exemple en action: