大量のドキュメントがあるnltkコーパスmovie_reviewsを使用しています。私の仕事は、データの前処理を行い、前処理を行わずにこれらのレビューの予測パフォーマンスを取得することです。しかし、問題があります。リストdocuments
とdocuments2
には同じドキュメントがあり、両方のリストで同じ順序を維持するためにそれらをシャッフルする必要があります。リストをシャッフルするたびに他の結果が得られるため、個別にシャッフルすることはできません。そのため、最後に比較する必要があるため、同じ順序で一度にシャッフルする必要があります(順序に依存します)。私は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]
もちろん、これはより単純なリストの例ですが、適応はあなたの場合と同じです。
それが役に立てば幸い。幸運を。
これを行う簡単な方法があります
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])
任意の数のリストを同時にシャッフルします。
_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)
_
出力:
_$ (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)
_
注意:shuffle_list()
によって返されるオブジェクトはtuples
です。
追伸shuffle_list()
はnumpy.array()
にも適用できます
_a = np.array([1,2,3])
b = np.array([4,5,6])
a1,b1 = shuffle_list(a,b)
print(a1,b1)
_
出力:
_$ (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]