Korzystam z korpusu nltk
biblioteki, movie_reviews
który zawiera dużą liczbę dokumentów. Moim zadaniem jest uzyskanie predykcyjnej wydajności tych przeglądów z wstępnym przetwarzaniem danych i bez wstępnego przetwarzania. Ale nie ma problemu, w listach documents
i documents2
mam te same dokumenty i muszę przetasować je w celu utrzymania tej samej kolejności w obu listach. Nie mogę tasować ich osobno, ponieważ za każdym razem, gdy tasuję listę, otrzymuję inne wyniki. Dlatego muszę od razu przetasować je w tej samej kolejności, ponieważ na koniec muszę je porównać (zależy to od kolejności). Używam Pythona 2.7
Przykład (w rzeczywistości łańcuchy są tokenizowane, ale nie są względne):
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')]
Potrzebuję tego wyniku po przetasowaniu obu list:
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')]
Mam ten kod:
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
Odpowiedzi:
Możesz to zrobić jako:
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]
Oczywiście był to przykład z prostszymi listami, ale dostosowanie będzie takie samo dla twojego przypadku.
Mam nadzieję, że to pomoże. Powodzenia.
źródło
zip(1,2,3)
zamiastzip([1,2,3])
a
ib
były listy na końcu. W Pythonie 3.6.8 na końcu tego samego przykładu otrzymujęa
ib
jako krotki.Mam na to łatwy sposób
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])
źródło
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) #random output #['e' 'c' 'b' 'd' 'a'] [5 3 2 4 1]
źródło
Tasuj dowolną liczbę list jednocześnie.
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)
Wynik:
$ (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)
Uwaga:
obiekty zwrócone przez
shuffle_list()
sątuples
.PS
shuffle_list()
można również zastosować donumpy.array()
a = np.array([1,2,3]) b = np.array([4,5,6]) a1,b1 = shuffle_list(a,b) print(a1,b1)
Wynik:
$ (3, 1, 2) (6, 4, 5)
źródło
Prostym i szybkim sposobem jest użycie random.seed () z random.shuffle (). Pozwala generować tę samą losową kolejność wiele razy. Będzie to wyglądać tak:
a = [1, 2, 3, 4, 5] b = [6, 7, 8, 9, 10] seed = random.random() random.seed(seed) a.shuffle() random.seed(seed) b.shuffle() print(a) print(b) >>[3, 1, 4, 2, 5] >>[8, 6, 9, 7, 10]
Działa to również wtedy, gdy nie możesz pracować jednocześnie z obiema listami z powodu problemów z pamięcią.
źródło
Możesz użyć drugiego argumentu funkcji shuffle, aby ustalić kolejność tasowania.
W szczególności można przekazać drugi argument funkcji shuffle jako funkcję o zerowym argumencie, która zwraca wartość w [0, 1). Wartość zwracana przez tę funkcję ustala kolejność tasowania. (Domyślnie, tj. Jeśli nie przekażesz żadnej funkcji jako drugi argument, użyje funkcji
random.random()
. Możesz to zobaczyć w linii 277 tutaj ).Ten przykład ilustruje to, co opisałem:
import random a = ['a', 'b', 'c', 'd', 'e'] b = [1, 2, 3, 4, 5] r = random.random() # randomly generating a real in [0,1) random.shuffle(a, lambda : r) # lambda : r is an unary function which returns r random.shuffle(b, lambda : r) # using the same function as used in prev line so that shuffling order is same print a print b
Wynik:
['e', 'c', 'd', 'a', 'b'] [5, 3, 4, 1, 2]
źródło
random.shuffle
Funkcja wywołujerandom
funkcję więcej niż jeden raz, więc stosująclambda
że zawsze zwraca tę samą wartość, może mieć niezamierzone skutki w celu wyjścia.