Comment extraire tous les émoticônes de texte?
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)
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 :
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)))
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.
É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
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
[' ']
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 = [", ", ", "]