1. ホーム
  2. python

[解決済み] 2つのリストを同時に同じ順番でシャッフルする

2022-09-27 11:47:04

質問

私は nltk ライブラリの movie_reviews コーパスを利用した。私の仕事は、これらのレビューの予測性能を、データの前処理を行った場合と、前処理を行わなかった場合について得ることである。しかし、問題があります。 documentsdocuments2 同じ文書があり、両方のリストで同じ順序を保つために、それらをシャッフルする必要があります。リストをシャッフルするたびに別の結果が得られるので、別々にシャッフルすることはできません。そのため、同じ順番で一度にシャッフルして、最終的に比較する必要があります。私はpython 2.7を使用しています。

例(実際は文字列をトークン化していますが、相対的なものではありません)。

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')]

そして、両方のリストをシャッフルした結果、このようになります。

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')]

こんなコードがあります。

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

どのように解決するのですか?

次のようにすればよいでしょう。

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]

もちろん、これはより単純なリストの例ですが、あなたの場合にも同じように適応されます。

お役に立てれば幸いです。幸運を祈ります。