J'ai le code suivant
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))])))])
J'ai testé les lignes 2 à 4 dans un fichier testing.py séparé lorsque j'ai écrit
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
et la commande Invite retourne ['le', 'le', 'le'], ce qui est ce que je voulais (supprimer la ponctuation).
Cependant, lorsque je mets exactement le même code dans un fichier différent, python renvoie une TypeError indiquant 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 est une liste de tous les chemins de fichiers (j’ai imprimé et vérifié que cette liste est valide). Je suis confus sur ce TypeError parce que tout fonctionne parfaitement bien lorsque je le teste dans un fichier différent.
Si tout ce que vous cherchez à accomplir est de faire la même chose que vous faisiez dans Python 2 dans Python 3, voici ce que je faisais dans Python 2.0 pour éliminer la ponctuation et les chiffres :
text = text.translate(None, string.punctuation)
text = text.translate(None, '1234567890')
Voici mon équivalent Python 3.0:
text = text.translate(str.maketrans('','',string.punctuation))
text = text.translate(str.maketrans('','','1234567890'))
Fondamentalement, il est écrit "ne rien traduire en rien" (les deux premiers paramètres) et traduit toute ponctuation ou tout chiffre en None
(c'est-à-dire les supprimer).
Je suppose que votre problème a à voir avec les différences entre str.translate
Et unicode.translate
(Ce sont aussi les différences entre str.translate
Sur Python 2 par rapport à Python 3). Je soupçonne que votre code original est en cours d'envoi d'instances unicode
alors que votre code de test utilise des instances régulières str
à 8 bits.
Je ne suggère pas de reconvertir les chaînes Unicode en instances normales str
, car unicode
est un type bien meilleur pour la gestion des données de texte (et c'est l'avenir!). Au lieu de cela, vous devriez simplement vous adapter à la nouvelle syntaxe unicode.translate
. Avec un str.translate
Normal (le Python 2), vous pouvez passer un argument facultatif deletechars
et les caractères qu'il contient seraient supprimés de la chaîne. Pour unicode.translate
(Et str.translate
On Python 3), l'argument supplémentaire n'est plus autorisé, mais les entrées de la table de traduction avec la valeur None
seront supprimé de la sortie.
Pour résoudre le problème, vous devez créer une table de traduction appropriée. Une table de traduction est un dictionnaire mappant des ordinaux Unicode (c'est-à-dire, int
s) vers des ordinaux, des chaînes ou None
. Une fonction d'assistance pour les créer existe dans Python 2 sous la forme string.maketrans
(Et Python 3 sous la forme d'une méthode de str
type), mais la version Python 2 ne traite pas le cas qui nous intéresse (insérer les valeurs None
dans la table). Vous pouvez créer vous-même un dictionnaire approprié avec quelque chose comme {ord(c): None for c in string.punctuation}
.
Voici comment traduire fonctionne:
yourstring.translate(str.maketrans(fromstr, tostr, deletestr))
Remplacez les caractères dans fromstr
par le caractère identique à tostr
et supprimez tous les caractères se trouvant dans deletestr
. Les fromstr
et tostr
peuvent être des chaînes vides et le paramètre deletestr
peut être omis.
exemple:
str="preetideepak12345aeiou"
>>> str.translate(str.maketrans('abcde','12345','p'))
sortie:
'r55ti4551k1234515iou'
ici:
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'))
statique str.maketrans (x [ y [ z]])
Cette méthode statique retourne une table de traduction utilisable pour
str.translate()
.
S'il n'y a qu'un seul argument, il doit s'agir d'un dictionnaire mappant des ordinaux Unicode (entiers) ou des caractères (chaînes de longueur 1) sur des ordinaux Unicode, des chaînes (de longueur arbitraire) ou None
. Les clés de personnage seront ensuite converties en ordinaux.
S'il y a deux arguments, il doit s'agir de chaînes de longueur égale et, dans le dictionnaire résultant, chaque caractère de x
sera associé au caractère situé à la même position dans y
. S'il existe un troisième argument, il doit s'agir d'une chaîne dont les caractères seront mappés à None
dans le résultat.
https://docs.python.org/3/library/stdtypes.html?highlight=maketrans#str.maketrans