with statistical natural language jurafsky foundations and python string unicode special-characters emoji

python - statistical - speech and language processing 2017



eliminar emojis de una cadena en Python (12)

Acepté la respuesta, y otros trabajaron para mí por un tiempo, pero finalmente decidí quitar todos los caracteres fuera del plano multilingüe básico . Esto excluye futuras adiciones a otros planos Unicode (donde viven los emoji y demás), lo que significa que no tengo que actualizar mi código cada vez que se agregan nuevos caracteres Unicode :).

En Python 2.7, convierta a unicode si su texto aún no está, y luego use la expresión regular negativa a continuación (subscribe cualquier cosa que no esté en expresión regular, que son todos los caracteres de BMP excepto los sustitutos, que se utilizan para crear caracteres de plano multilingüe suplementario de 2 bytes).

NON_BMP_RE = re.compile(u"[^/U00000000-/U0000d7ff/U0000e000-/U0000ffff]", flags=re.UNICODE) NON_BMP_RE.sub(u'''', unicode(text, ''utf-8''))

Encontré este código en Python para eliminar emojis pero no funciona. ¿Puedes ayudar con otros códigos o solucionar esto?

He observado que todos mis emjois comienzan con /xf pero cuando trato de buscar str.startswith("/xf") obtengo un error de carácter no válido.

emoji_pattern = r''/[x{1F601}-x{1F64F}]/u'' re.sub(emoji_pattern, '''', word)

Aquí está el error:

Traceback (most recent call last): File "test.py", line 52, in <module> re.sub(emoji_pattern,'''',word) File "/usr/lib/python2.7/re.py", line 151, in sub return _compile(pattern, flags).sub(repl, string, count) File "/usr/lib/python2.7/re.py", line 244, in _compile raise error, v # invalid expression sre_constants.error: bad character range

Cada uno de los elementos de una lista puede ser una palabra [''This'', ''dog'', ''/xf0/x9f/x98/x82'', ''https://t.co/5N86jYipOI'']

ACTUALIZACIÓN: utilicé este otro código:

emoji_pattern=re.compile(ur" " " [/U0001F600-/U0001F64F] # emoticons / |/ [/U0001F300-/U0001F5FF] # symbols & pictographs/ |/ [/U0001F680-/U0001F6FF] # transport & map symbols/ |/ [/U0001F1E0-/U0001F1FF] # flags (iOS)/ " " ", re.VERBOSE) emoji_pattern.sub('''', word)

¡Pero esto todavía no elimina los emojis y los muestra! Alguna pista de por qué es eso?


Aquí hay un script de Python 3 que usa get_emoji_regexp() la biblioteca de get_emoji_regexp() , según lo sugerido por kingmakerking y Martijn Pieters en su respuesta / comentario.

Lee el texto de un archivo y escribe el texto sin emoji en otro archivo.

import emoji import re def strip_emoji(text): print(emoji.emoji_count(text)) new_text = re.sub(emoji.get_emoji_regexp(), r"", text) return new_text with open("my_file.md", "r") as file: old_text = file.read() no_emoji_text = strip_emoji(old_text) with open("file.md", "w+") as new_file: new_file.write(no_emoji_text)


Convertir la cadena en otro conjunto de caracteres como este podría ayudar:

text.encode(''latin-1'', ''ignore'').decode(''latin-1'')

Saludos cordiales.


En Python 2, debe usar u'''' literal para crear una cadena Unicode. Además, debe pasar el indicador re.UNICODE y convertir sus datos de entrada a Unicode (por ejemplo, text = data.decode(''utf-8'') ):

#!/usr/bin/env python import re text = u''This dog /U0001f602'' print(text) # with emoji emoji_pattern = re.compile("[" u"/U0001F600-/U0001F64F" # emoticons u"/U0001F300-/U0001F5FF" # symbols & pictographs u"/U0001F680-/U0001F6FF" # transport & map symbols u"/U0001F1E0-/U0001F1FF" # flags (iOS) "]+", flags=re.UNICODE) print(emoji_pattern.sub(r'''', text)) # no emoji

Salida

This dog 😂 This dog

Nota: emoji_pattern solo coincide con algunos emoji (no todos). Vea qué personajes son emoji .


Esta es mi solución. Esta solución elimina emojis adicionales de hombre y mujer que no pueden ser renegados por python re y 🤦‍♀

def give_emoji_free_text(text): return emoji.get_emoji_regexp().sub(r'''', text.decode(''utf8''))


Esto funciona para mi. Está motivado por https://.com/a/43813727/6579239

def deEmojify(inputString): return inputString.encode(''ascii'', ''ignore'').decode(''ascii'')


Intenté todas las respuestas, desafortunadamente, no eliminaron el nuevo emoji de la cara que se abrazaba 🤗 o los emojis de los vasos que tintineaban 🥂o 🤔, y mucho más.

Terminé con una lista de todos los emoji posibles, tomados del paquete de emojis de python en github, y tuve que crear una esencia porque hay un límite de 30k caracteres en las respuestas de y tiene más de 70k caracteres.


Porque [...] significa cualquiera de un conjunto de caracteres, y porque dos caracteres en un grupo separados por un guión significa un rango de caracteres (a menudo, "az" o "0-9"), su patrón dice "a barra inclinada, seguida de cualquier carácter en el grupo que contenga x, {, 1, F, 6, 0, 1, el rango} a x, {, 1, F, 6, 4, fo} "seguido de una barra diagonal y el letra u ". Ese rango en el medio es lo que re llama el rango de caracteres incorrectos.


Si está utilizando el ejemplo de la respuesta aceptada y sigue obteniendo errores de "rango de caracteres incorrecto", entonces probablemente esté utilizando una compilación limitada ( consulte esta respuesta para obtener más detalles). Una versión reformateada de la expresión regular que parece funcionar es:

emoji_pattern = re.compile( u"(/ud83d[/ude00-/ude4f])|" # emoticons u"(/ud83c[/udf00-/uffff])|" # symbols & pictographs (1 of 2) u"(/ud83d[/u0000-/uddff])|" # symbols & pictographs (2 of 2) u"(/ud83d[/ude80-/udeff])|" # transport & map symbols u"(/ud83c[/udde0-/uddff])" # flags (iOS) "+", flags=re.UNICODE)


Si no está interesado en usar expresiones regulares, la mejor solución podría ser usar el paquete emoji python .

Aquí hay una función simple para devolver texto libre de emoji (gracias a esta respuesta SO ):

# Emojis pattern emoji_pattern = re.compile("[" u"/U0001F600-/U0001F64F" # emoticons u"/U0001F300-/U0001F5FF" # symbols & pictographs u"/U0001F680-/U0001F6FF" # transport & map symbols u"/U0001F1E0-/U0001F1FF" # flags (iOS) u"/U00002702-/U000027B0" u"/U000024C2-/U0001F251" u"/U0001f926-/U0001f937" u''/U00010000-/U0010ffff'' u"/u200d" u"/u2640-/u2642" u"/u2600-/u2B55" u"/u23cf" u"/u23e9" u"/u231a" u"/u3030" u"/ufe0f" "]+", flags=re.UNICODE)

Si se trata de cadenas que contienen emojis, esto es sencillo

emoji_pattern = re.compile("[" u"/U0001F600-/U0001F64F" # emoticons u"/U0001F300-/U0001F5FF" # symbols & pictographs u"/U0001F680-/U0001F6FF" # transport & map symbols u"/U0001F1E0-/U0001F1FF" # flags (iOS) u"/U00002702-/U000027B0" u"/U000024C2-/U0001F251" u"/U0001f926-/U0001f937" u"/u200d" u"/u2640-/u2642" "]+", flags=re.UNICODE)

Si se trata de unicode (como en el ejemplo de @jfs), codifíquelo con utf-8.

import emoji def give_emoji_free_text(text): allchars = [str for str in text.decode(''utf-8'')] emoji_list = [c for c in allchars if c in emoji.UNICODE_EMOJI] clean_text = '' ''.join([str for str in text.decode(''utf-8'').split() if not any(i in str for i in emoji_list)]) return clean_text

Ediciones

Según el comentario, debería ser tan fácil como:

>> s1 = "Hi 🤔 How is your 🙈 and 😌. Have a nice weekend 💕👭👙" >> print s1 Hi 🤔 How is your 🙈 and 😌. Have a nice weekend 💕👭👙 >> print give_emoji_free_text(s1) Hi How is your and Have a nice weekend


Traté de recopilar la lista completa de Unicodes. Lo uso para extraer emojis de tweets y funciona muy bien para mí.

>> s2 = u''This dog /U0001f602'' >> print s2 This dog 😂 >> print give_emoji_free_text(s2.encode(''utf8'')) This dog


Vesrion completa de eliminar emojies:

def remove_emoji(string): emoji_pattern = re.compile("[" u"/U0001F600-/U0001F64F" # emoticons u"/U0001F300-/U0001F5FF" # symbols & pictographs u"/U0001F680-/U0001F6FF" # transport & map symbols u"/U0001F1E0-/U0001F1FF" # flags (iOS) u"/U00002702-/U000027B0" u"/U000024C2-/U0001F251" "]+", flags=re.UNICODE) return emoji_pattern.sub(r'''', string)