2017-07-19 3 views
4

Je dois effectuer des retouches sur des chaînes portugaises. Pour ce faire, je symbolise la chaîne à l'aide de la fonction nltk.word_tokenize() puis j'enchaîne chaque mot individuellement. Après cela, je reconstruis la chaîne. Cela fonctionne, mais ne fonctionne pas bien. Comment puis-je le faire plus vite? La longueur de la chaîne est d'environ 2 millions de mots.Libérer des chaînes complètes sur Python

tokenAux="" 
    tokens = nltk.word_tokenize(portugueseString) 
     for token in tokens: 
      tokenAux = token 
      tokenAux = stemmer.stem(token)  
      textAux = textAux + " "+ tokenAux 
    print(textAux) 

Désolé pour le mauvais anglais et merci!

Répondre

3

string est immuable donc, ce n'est pas une bonne pratique de mettre à jour la chaîne tous les temps si la chaîne est longue. Le link here explique les différentes façons de concaténer les chaînes et montre l'analyse des performances. Et puisque, l'itération est faite seulement une fois, il est bon de choisir generator expression sur list comprehension. Pour plus de détails, vous pouvez regarder dans discussion here. Au lieu de cela, dans ce cas, en utilisant generator expression avec join peut être utile:

En utilisant my_text pour une longue chaîne: len(my_text) -> 444399

En utilisant timeit pour comparer:

%%timeit 
tokenAux="" 
textAux="" 
tokens = nltk.word_tokenize(my_text) 
for token in tokens: 
    tokenAux = token 
    tokenAux = stemmer.stem(token)  
    textAux = textAux + " "+ tokenAux 

Résultat:

1 loop, best of 3: 6.23 s per loop 

aide avec join:

%%timeit 
' '.join(stemmer.stem(token) for token in nltk.word_tokenize(my_text)) 

Résultat:

1 loop, best of 3: 2.93 s per loop 
+1

Cela a fonctionné parfaitement! Merci tout le monde. – yuridamata

+0

@yuridamata Super! 'Codage heureux .' – 0p3n5ourcE

0

Vous pouvez lire la chaîne sous forme de fichier texte, puis effectuer les opérations nécessaires pour arrêter chaque mot à l'aide de PySpark. Cela vous permettra d'effectuer vos opérations en parallèle.

Vous pouvez également utiliser le multiprocessing module.

+0

Est-ce que PySpark ont ​​vraiment intégré égrappoir portugais? – lenz

+0

Je ne suis pas sûr. Il n'y a aucune raison pour que PySpark ne puisse pas être utilisé avec NLTK. @lenz – rayrase

1

Les objets de chaîne sont immuables en Python. Regardez dans votre code:

textAux = "" 
for token in tokens: 
    # something important ... 
    textAux = textAux + " "+ tokenAux 

Chaque fois que vous créez une nouvelle chaîne dans une boucle et l'assigner à une variable textAux. Ce n'est pas efficace.

Je voudrais stocker tokenAux éléments dans une liste et les rejoignent à la toute fin. Voir l'exemple:

tokenAux = [] # we declare list for storing tokens 
tokens = nltk.word_tokenize(portugueseString) 
for token in tokens: 
    tokenAux = token 
    tokenAux = stemmer.stem(token)  
    textAux.append(tokenAux) # we add new token into the resulting list 

result = " ".join(textAux) # join list using space as separator 
print(result) 

Comparer les performances et la partager avec nous :)

Liens utiles: