Подтвердить что ты не робот

Как извлечь все эмоции из текста?

Рассмотрим следующий список:

a_list = ['🤔 🙈 me así, bla es se 😌 ds 💕👭👙']

Как я могу извлечь в новом списке все emojis внутри a_list?:

new_lis = ['🤔 🙈 😌 💕 👭 👙']

Я пытался использовать регулярное выражение, но у меня нет всех возможных кодировок emojis.

4b9b3361

Ответ 1

Вы можете использовать библиотеку emoji. Вы можете проверить, является ли один кодовый номер кодовым номером emoji, проверяя, содержится ли он в emoji.UNICODE_EMOJI.

import emoji

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

Ответ 2

Я думаю, важно отметить, что предыдущие ответы не будут работать с смайликами, такими как 👨‍👩‍👦‍👦, потому что они состоят из 4 смайликов, и использование ... in emoji.UNICODE_EMOJI вернет 4 разных смайлика. То же самое для смайликов с цветом кожи, как 🙅🏽.

Мое решение включает в себя модули emoji и regex. Модуль regex поддерживает распознавание кластеров графем (последовательности кодов Unicode, отображаемых как один символ), поэтому мы можем считать эмоджи как is

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

Тестирование (с большим количеством смайликов с цветом кожи):

line = ["🤔 🙈 me así, se 😌 ds 💕👭👙 hello 👩🏾‍🎓 emoji hello 👨‍👩‍👦‍👦 how are 😊 you today🙅🏽🙅🏽"]

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

выход:

🤔 🙈 😌 💕 👭 👙 👩🏾‍🎓 👨‍👩‍👦‍👦 😊 🙅🏽 🙅🏽

Редактировать:

Если вы хотите включить флаги, например, Un диапазон Юникода будет от 🇦 до 🇿, поэтому добавьте:

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

к функции выше, и return emoji_list + flags.

Смотрите этот пост для получения дополнительной информации о флагах.

Ответ 3

Если вы не хотите использовать внешнюю библиотеку, в качестве питонического метода вы можете просто использовать регулярные выражения и re.findall() с правильным регулярным выражением, чтобы найти emojies:

In [74]: import re
In [75]: re.findall(r'[^\w\s,]', a_list[0])
Out[75]: ['🤔', '🙈', '😌', '💕', '👭', '👙']

Регулярное выражение r'[^\w\s,]' является отрицательным символьным классом, который соответствует любому символу, который не является символом слова, пробелом или запятой.

Как я уже упоминал в комментарии, текст, как правило, содержит символы слова и пунктуацию, с которыми этот подход будет легко справляться, в других случаях вы можете просто добавить их в класс символов вручную. Обратите внимание: поскольку вы можете указать диапазон символов в классе символов, вы даже можете сделать его более коротким и более гибким.

Другое решение вместо отрицательного символьного класса, исключающего символы не-emoji, использует класс символов, который принимает emojies ([] без ^). Поскольку существует много emojis с разными значениями unicode, вам просто нужно добавить диапазоны в класс символов. Если вы хотите совместить больше emojies, здесь хорошая ссылка содержит все стандартные emojies с соответствующим диапазоном для разных emojies http://apps.timwhitlock.info/emoji/tables/unicode:

Ответ 4

Самый рейтинговый ответ не всегда работает. Например, флаг emojis не будет найден. Рассмотрим строку:

s = u'Hello \U0001f1f7\U0001f1fa hello'

Что лучше работает

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

Ответ 5

Решение, позволяющее получить именно то, о чем спрашивает шатун, - это сочетание ответа с самым высоким рейтингом и ответа пользователя 594836. Это код, который работает для меня в 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
['🤔 🙈 😌 💕 👭 👙']

Ответ 6

Шаг 1: Убедитесь, что ваш текст декодирован в utf-8 text.decode('utf-8')

Шаг 2: Найдите все смайлики из вашего текста, вы должны отделить текстовый символ за символом [str for str in decode]

Шаг 3: Сохранение всех смайликов в списке [c for c in allchars if c in emoji.UNICODE_EMOJI] полный пример ниже:

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

если вы хотите удалить из текста

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

Ответ 7

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

Это лучшее решение при работе с большими наборами данных, так как вам не нужно каждый раз проходить через все смайлики. Нашел это, чтобы дать мне лучшие результаты :)

Ответ 8

Хорошо, у меня была такая же проблема, и я разработал решение, которое не требует от вас импорта каких-либо библиотек (например, emoji или Re) и представляет собой одну строку кода. Он вернет все смайлики в строке:

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

Это позволило мне создать легкое решение, и я надеюсь, что оно поможет вам всем. На самом деле - мне нужен был тот, который отфильтровывал бы любые смайлики в строке - и это то же самое, что и код выше, но с одним небольшим изменением:

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

Вот пример этого в действии:

  • a = '🤔 🙈 me así, bla es se 😌 ds 💕👭👙'
  • b = extract_emojis (a)
  • b = ['🤔', '🙈', '😌', '💕👭👙']

Ответ 9

Эта функция ожидает строку, поэтому преобразует список входных данных в строку

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 :['🙈', '😌', '💕', '👭', '👙']

Ответ 10

Вы должны быть осторожны, откуда вы получаете смайлики. Например, если вы хотите извлечь их из Discord, они будут иметь другие имена, чем в пакете смайликов.

Ответ 11

Все юникод emojis с соответствующими кодовыми точками здесь. Они от 1F600 до 1F64F, поэтому вы можете просто построить все из них с помощью итератора, подобного диапазону.