Ich benutze den Korpus der nltk
Bibliothek, movie_reviews
der eine große Anzahl von Dokumenten enthält. Meine Aufgabe ist es, eine vorausschauende Leistung dieser Überprüfungen mit Vorverarbeitung der Daten und ohne Vorverarbeitung zu erzielen. Aber es gibt ein Problem in Listen documents
und documents2
ich habe die gleichen Dokumente und ich muss sie mischen, um die gleiche Reihenfolge in beiden Listen beizubehalten. Ich kann sie nicht separat mischen, da ich jedes Mal, wenn ich die Liste mische, andere Ergebnisse erhalte. Deshalb muss ich die auf einmal mit derselben Reihenfolge mischen, weil ich sie am Ende vergleichen muss (es hängt von der Reihenfolge ab). Ich benutze Python 2.7
Beispiel (in Wirklichkeit sind Zeichenfolgen mit Token versehen, aber nicht relativ):
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')]
Und ich muss dieses Ergebnis erhalten, nachdem ich beide Listen gemischt habe:
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')]
Ich habe diesen 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
Antworten:
Sie können es tun als:
Dies war natürlich ein Beispiel mit einfacheren Listen, aber die Anpassung ist für Ihren Fall dieselbe.
Ich hoffe es hilft. Viel Glück.
quelle
zip(1,2,3)
anstelle vonzip([1,2,3])
a
undb
war am Ende eine Liste. Mit Python 3.6.8 bekomme ich am Ende desselben Beispielsa
undb
als Tupel.Ich bekomme einen einfachen Weg, dies zu tun
quelle
quelle
Mische eine beliebige Anzahl von Listen gleichzeitig.
Ausgabe:
Hinweis: Von zurückgegebene
Objekte
shuffle_list()
sindtuples
.PS
shuffle_list()
kann auch angewendet werdennumpy.array()
Ausgabe:
quelle
Eine einfache und schnelle Möglichkeit, dies zu tun, besteht darin, random.seed () mit random.shuffle () zu verwenden. Sie können dieselbe zufällige Reihenfolge so oft generieren, wie Sie möchten. Es wird so aussehen:
Dies funktioniert auch, wenn Sie aufgrund von Speicherproblemen nicht mit beiden Listen gleichzeitig arbeiten können.
quelle
Sie können das zweite Argument der Shuffle-Funktion verwenden, um die Reihenfolge des Shufflings festzulegen.
Insbesondere können Sie dem zweiten Argument der Shuffle-Funktion eine Null-Argument-Funktion übergeben, die einen Wert in [0, 1) zurückgibt. Der Rückgabewert dieser Funktion legt die Reihenfolge des Mischens fest. (Standardmäßig wird die Funktion verwendet, wenn Sie keine Funktion als zweites Argument übergeben
random.random()
. Sie können sie in Zeile 277 hier sehen .)Dieses Beispiel zeigt, was ich beschrieben habe:
Ausgabe:
quelle
random.shuffle
Funktion ruft dierandom
Funktion mehrmals auf, sodass die Verwendung von alambda
, die immer denselben Wert zurückgibt, unbeabsichtigte Auswirkungen auf die Ausgabereihenfolge haben kann.