Как извлечь все эмоции из текста?
Рассмотрим следующий список:
a_list = ['🤔 🙈 me así, bla es se 😌 ds 💕👭👙']
Как я могу извлечь в новом списке все emojis внутри a_list
?:
new_lis = ['🤔 🙈 😌 💕 👭 👙']
Я пытался использовать регулярное выражение, но у меня нет всех возможных кодировок emojis.
Ответы
Ответ 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, поэтому вы можете просто построить все из них с помощью итератора, подобного диапазону.