template str left python nltk typeerror

left - str.translate da TypeError-Translate toma un argumento(2 dado), trabajado en Python 2



str() python (4)

Tengo el siguiente código

import nltk, os, json, csv, string, cPickle from scipy.stats import scoreatpercentile lmtzr = nltk.stem.wordnet.WordNetLemmatizer() def sanitize(wordList): answer = [word.translate(None, string.punctuation) for word in wordList] answer = [lmtzr.lemmatize(word.lower()) for word in answer] return answer words = [] for filename in json_list: words.extend([sanitize(nltk.word_tokenize('' ''.join([tweet[''text''] for tweet in json.load(open(filename,READ))])))])

Probé las líneas 2-4 en un archivo separado testing.py cuando escribí

import nltk, os, json, csv, string, cPickle from scipy.stats import scoreatpercentile wordList= [''/'the'', ''the'', ''"the''] print wordList wordList2 = [word.translate(None, string.punctuation) for word in wordList] print wordList2 answer = [lmtzr.lemmatize(word.lower()) for word in wordList2] print answer freq = nltk.FreqDist(wordList2) print freq

y el símbolo del sistema devuelve [''the'', ''the'', ''the''], que es lo que quería (eliminando la puntuación).

Sin embargo, cuando pongo exactamente el mismo código en un archivo diferente, Python devuelve un TypeError que indica que

File "foo.py", line 8, in <module> for tweet in json.load(open(filename, READ))])))]) File "foo.py", line 2, in sanitize answer = [word.translate(None, string.punctuation) for word in wordList] TypeError: translate() takes exactly one argument (2 given)

json_list es una lista de todas las rutas de archivos (imprimí y compruebo que esta lista es válida). Estoy confundido con este TypeError porque todo funciona perfectamente bien cuando lo estoy probando en un archivo diferente.


Así es como funciona la traducción:

yourstring.translate(str.maketrans(fromstr, tostr, deletestr))

Reemplace los caracteres en fromstr con el carácter en la misma posición en tostr y elimine todos los caracteres que están en deletestr . El fromstr y tostr pueden ser cadenas vacías y el parámetro deletestr se puede omitir.

ejemplo:

str="preetideepak12345aeiou" >>> str.translate(str.maketrans(''abcde'',''12345'',''p''))

salida:

''r55ti4551k1234515iou''

aquí:

a is translated to 1 b is translated to 2 c is translated to 3 and so on and p is deleted from string.


Python 3.0:

text = text.translate(str.maketrans('''','''',''1234567890''))

str.maketrans estáticos (x [, y [, z]])

Este método estático devuelve una tabla de traducción utilizable para str.translate() .

Si solo hay un argumento, debe ser un diccionario que asigna los ordinales Unicode (enteros) o los caracteres (cadenas de longitud 1) a los ordinales de Unicode, cadenas (de longitudes arbitrarias) o None . Las teclas de caracteres se convertirán a ordinales.

Si hay dos argumentos, deben ser cadenas de igual longitud, y en el diccionario resultante, cada carácter en x se asignará al carácter en la misma posición en y . Si hay un tercer argumento, debe ser una cadena, cuyos caracteres se asignarán a None en el resultado.

https://docs.python.org/3/library/stdtypes.html?highlight=maketrans#str.maketrans


Si todo lo que busca lograr es hacer lo mismo que estaba haciendo en Python 2 en Python 3, esto es lo que estaba haciendo en Python 2.0 para descartar la puntuación y los números:

text = text.translate(None, string.punctuation) text = text.translate(None, ''1234567890'')

Aquí está mi equivalente de Python 3.0:

text = text.translate(str.maketrans('''','''',string.punctuation)) text = text.translate(str.maketrans('''','''',''1234567890''))

Básicamente dice "traducir nada a nada" (los dos primeros parámetros) y traducir cualquier puntuación o números a None (es decir, eliminarlos).


Sospecho que su problema tiene que ver con las diferencias entre str.translate y unicode.translate (estas son también las diferencias entre str.translate en Python 2 contra Python 3). Sospecho que su código original se está enviando instancias unicode mientras su código de prueba está usando instancias regulares de 8 bits.

No sugiero convertir cadenas Unicode a instancias str normales, ya que unicode es mucho mejor para manejar datos de texto (¡y es el futuro!). En su lugar, solo debe adaptarse a la nueva sintaxis unicode.translate . Con str.translate regular (en Python 2), puede pasar un argumento deletechars opcional y los caracteres en él se eliminarán de la cadena. Para unicode.translate (y str.translate en Python 3), el argumento extra ya no está permitido, pero las entradas de la tabla de traducción con None como valor se eliminarán de la salida.

Para resolver el problema, deberá crear una tabla de traducción adecuada. Una tabla de traducción es una asignación de diccionario de ordinales de Unicode (es decir, int s) a ordinales, cadenas o None . Una función auxiliar para hacerlas existe en Python 2 como string.maketrans (y Python 3 como un método del tipo str ), pero la versión de Python 2 no maneja el caso que nos importa (colocando None values ​​en la tabla ) Puede construir un diccionario apropiado con algo como {ord(c): None for c in string.punctuation} .