J'utilise nltk corpus movie_reviews où se trouvent beaucoup de documents. Ma tâche consiste à obtenir des performances prédictives de ces révisions avec un prétraitement des données et sans prétraitement. Mais il y a un problème, dans les listes documents
et documents2
J'ai les mêmes documents et j'ai besoin de les mélanger afin de conserver le même ordre dans les deux listes. Je ne peux pas les mélanger séparément parce que chaque fois que je mélange la liste, j'obtiens d'autres résultats. C'est pourquoi j'ai besoin de mélanger le tout à la fois avec le même ordre, car j'ai besoin de les comparer à la fin (cela dépend de l'ordre). J'utilise python 2.7
Exemple (en réalité, les chaînes sont marquées, mais ce n'est pas relatif):
documents = [(['plot : two teen couples go to a church party , '], 'neg'),
(['drink and then drive . '], 'pos'),
(['they get into an accident . '], 'neg'),
(['one of the guys dies'], 'neg')]
documents2 = [(['plot two teen couples church party'], 'neg'),
(['drink then drive . '], 'pos'),
(['they get accident . '], 'neg'),
(['one guys dies'], 'neg')]
Et je dois obtenir ce résultat après avoir mélangé les deux listes:
documents = [(['one of the guys dies'], 'neg'),
(['they get into an accident . '], 'neg'),
(['drink and then drive . '], 'pos'),
(['plot : two teen couples go to a church party , '], 'neg')]
documents2 = [(['one guys dies'], 'neg'),
(['they get accident . '], 'neg'),
(['drink then drive . '], 'pos'),
(['plot two teen couples church party'], 'neg')]
J'ai ce code:
def cleanDoc(doc):
stopset = set(stopwords.words('english'))
stemmer = nltk.PorterStemmer()
clean = [token.lower() for token in doc if token.lower() not in stopset and len(token) > 2]
final = [stemmer.stem(Word) for Word in clean]
return final
documents = [(list(movie_reviews.words(fileid)), category)
for category in movie_reviews.categories()
for fileid in movie_reviews.fileids(category)]
documents2 = [(list(cleanDoc(movie_reviews.words(fileid))), category)
for category in movie_reviews.categories()
for fileid in movie_reviews.fileids(category)]
random.shuffle( and here shuffle documents and documents2 with same order) # or somehow
Vous pouvez le faire comme:
import random
a = ['a', 'b', 'c']
b = [1, 2, 3]
c = list(Zip(a, b))
random.shuffle(c)
a, b = Zip(*c)
print a
print b
[OUTPUT]
['a', 'c', 'b']
[1, 3, 2]
Bien sûr, c’était un exemple avec des listes plus simples, mais l’adaptation sera la même pour votre cas.
J'espère que ça aide. Bonne chance.
J'ai un moyen facile de faire ça
import numpy as np
a = np.array([0,1,2,3,4])
b = np.array([5,6,7,8,9])
indices = np.arange(a.shape[0])
np.random.shuffle(indices)
a = a[indices]
b = b[indices]
# a, array([3, 4, 1, 2, 0])
# b, array([8, 9, 6, 7, 5])
Mélangez un nombre arbitray de listes simultanément.
from random import shuffle
def shuffle_list(*ls):
l =list(Zip(*ls))
shuffle(l)
return Zip(*l)
a = [0,1,2,3,4]
b = [5,6,7,8,9]
a1,b1 = shuffle_list(a,b)
print(a1,b1)
a = [0,1,2,3,4]
b = [5,6,7,8,9]
c = [10,11,12,13,14]
a1,b1,c1 = shuffle_list(a,b,c)
print(a1,b1,c1)
Sortie:
$ (0, 2, 4, 3, 1) (5, 7, 9, 8, 6)
$ (4, 3, 0, 2, 1) (9, 8, 5, 7, 6) (14, 13, 10, 12, 11)
Remarque:
Les objets retournés par shuffle_list()
sont tuples
.
P.S. shuffle_list()
peut également être appliqué à numpy.array()
a = np.array([1,2,3])
b = np.array([4,5,6])
a1,b1 = shuffle_list(a,b)
print(a1,b1)
Sortie:
$ (3, 1, 2) (6, 4, 5)
from sklearn.utils import shuffle
a = ['a', 'b', 'c','d','e']
b = [1, 2, 3, 4, 5]
a_shuffled, b_shuffled = shuffle(np.array(a), np.array(b))
print(a_shuffled, b_shuffled)
#['e' 'c' 'b' 'd' 'a'] [5 3 2 4 1]