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