Para limpiar texto perteneciente a diferentes idiomas en Python

Tengo una colección de texto que tiene oraciones completamente en inglés o hindi o marathi con identificaciones adjuntas a cada una de estas oraciones como 0,1,2 respectivamente que representan el idioma del texto.

El texto, independientemente de cualquier idioma, puede tener tags HTML, puntuación, etc.

Podría limpiar las oraciones en inglés usando mi código a continuación:

import HTMLParser import re from nltk.corpus import stopwords from collections import Counter import pickle from string import punctuation #creating html_parser object html_parser = HTMLParser.HTMLParser() cachedStopWords = set(stopwords.words("english")) def cleanText(text,lang_id): if lang_id == 0: str1 = ''.join(text).decode('iso-8859-1') else: str1 = ''.join(text).encode('utf-8') str1 = html_parser.unescape(str1) cleanr = re.compile('') cleantext = re.sub(cleanr, '', str1) #print "cleantext before puncts removed : " + cleantext clean_puncts = re.compile(r'[\s{}]+'.format(re.escape(punctuation))) cleantext = re.sub(clean_puncts,' ',cleantext) #print " cleantext after puncts removed : " + cleantext cleanest = cleantext.lower() if lang_id == 0: cleanertext = ' '.join([word for word in cleanest.split() if word not in cachedStopWords]) words = re.findall(r"[\w']+", cleanertext) words_final = [x.encode('UTF8') for x in words] else: words_final = cleanest.split() return words_final 

pero me da el siguiente error para el texto en hindi y marathi como:

 UnicodeDecodeError: 'ascii' codec can't decode byte 0xeb in position 104: ordinal not in range(128) 

Además, elimina todas las palabras.

El texto hindi es como

 <p>भारत का इतिहास काफी समृद्ध एवं विस्तृत है। </p> 

¿Cómo puedo hacer lo mismo con el texto hindi o marathi?

Sin el archivo de texto completo, la solución que podemos proporcionar solo será una foto en la oscuridad.

En primer lugar , compruebe los tipos de cadenas que está leyendo en el texto cleanText() , ¿es realmente un cleanText() unicode o es una cadena de bytes? Ver cadena de bytes frente a cadena de Unicode. Pitón

Por lo tanto, si ha leído su archivo correctamente y se asegura de que todo sea Unicode, no debería haber ningún problema en la forma en que administra las cadenas (en Python2 o 3). El siguiente ejemplo confirma esto:

 >>> from HTMLParser import HTMLParser >>> hp = HTMLParser() >>> text = u"<p>भारत का इतिहास काफी समृद्ध एवं विस्तृत है। </p>" >>> hp.unescape(text) u'

\u092d\u093e\u0930\u0924 \u0915\u093e \u0907\u0924\u093f\u0939\u093e\u0938 \u0915\u093e\u092b\u0940 \u0938\u092e\u0943\u0926\u094d\u0927 \u090f\u0935\u0902 \u0935\u093f\u0938\u094d\u0924\u0943\u0924 \u0939\u0948\u0964

' >>> print hp.unescape(text)

भारत का इतिहास काफी समृद्ध एवं विस्तृत है।

>>> hp.unescape(text).split() [u'

\u092d\u093e\u0930\u0924', u'\u0915\u093e', u'\u0907\u0924\u093f\u0939\u093e\u0938', u'\u0915\u093e\u092b\u0940', u'\u0938\u092e\u0943\u0926\u094d\u0927', u'\u090f\u0935\u0902', u'\u0935\u093f\u0938\u094d\u0924\u0943\u0924', u'\u0939\u0948\u0964', u'

'] >>> print " ".join(hp.unescape(text).split())

भारत का इतिहास काफी समृद्ध एवं विस्तृत है।

Incluso con la manipulación de expresiones regulares, no hay problema:

 >>> import re >>> from string import punctuation >>> p = re.compile(r'[\s{}]+'.format(re.escape(punctuation))) >>> new_text = " ".join(hp.unescape(text).split()) >>> re.sub(p,' ', new_text) u' p \u092d\u093e\u0930\u0924 \u0915\u093e \u0907\u0924\u093f\u0939\u093e\u0938 \u0915\u093e\u092b\u0940 \u0938\u092e\u0943\u0926\u094d\u0927 \u090f\u0935\u0902 \u0935\u093f\u0938\u094d\u0924\u0943\u0924 \u0939\u0948\u0964 p ' >>> print re.sub(p,' ', new_text) p भारत का इतिहास काफी समृद्ध एवं विस्तृत है। p 

Eche un vistazo a “Cómo detener el dolor” y seguir las mejores prácticas en esta charla probablemente resolvería sus problemas de Unicode. Diapositivas en http://nedbatchelder.com/text/unipain.html .

También vea esto también: https://www.youtube.com/watch?v=Mx70n1dL534 en PyCon14 (pero solo aplicable para python2.x )

Abrir un archivo utf8 como este podría resolver su problema también:

 import io with io.open('myfile.txt', 'r', encoding='utf8') as fin: for line in fin: clean_text(line) 

Si STDIN y STDOUT le están dando un problema, consulte https://daveagp.wordpress.com/2010/10/26/what-a-character/

Ver también:

  • ¿Cuál es la diferencia entre io.open () y os.open () en Python?
  • ¿Por qué NO deberíamos utilizar sys.setdefaultencoding (“utf-8”) en un script py?
  • ¿Debo usar “funda de camello” o guiones bajos en python?
  • Configuración de la encoding correcta al canalizar la salida estándar en Python
  • https://stackoverflow.com/a/28381060/610569