같은 순서로 두 개의 목록을 한 번에 섞기
사용하고 있습니다.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 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]
목록의 임의 배열 번호를 동시에 섞습니다.
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)
쉽고 빠른 방법은 random.seed()를 random과 함께 사용하는 것입니다.shuffle() . 원하는 횟수만큼 동일한 랜덤 오더를 생성할 수 있습니다.다음과 같이 나타납니다.
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]
메모리 문제로 인해 두 목록을 동시에 사용할 수 없는 경우에도 사용할 수 있습니다.
값의 순서를 변수에 저장한 다음 배열을 동시에 정렬할 수 있습니다.
array1 = [1, 2, 3, 4, 5]
array2 = ["one", "two", "three", "four", "five"]
order = range(len(array1))
random.shuffle(order)
newarray1 = []
newarray2 = []
for x in range(len(order)):
newarray1.append(array1[order[x]])
newarray2.append(array2[order[x]])
print newarray1, newarray2
이 기능은 다음과 같이 작동합니다.
import numpy as np
a = ['a', 'b', 'c']
b = [1, 2, 3]
rng = np.random.default_rng()
state = rng.bit_generator.state
rng.shuffle(a)
# use same seeds for a & b!
rng.bit_generator.state = state # set state to same state as before
rng.shuffle(b)
print(a)
print(b)
출력:
['b', 'a', 'c']
[2, 1, 3]
셔플 함수의 두 번째 인수를 사용하여 셔플 순서를 고정할 수 있습니다.
구체적으로 셔플 함수의 두 번째 인수를 [0, 1]의 값을 반환하는 영 인수 함수로 통과시킬 수 있습니다.이 함수의 반환 값은 셔플링 순서를 고정합니다. (기본적으로 두 번째 인수로 어떤 함수도 전달하지 않으면 함수를 사용합니다.)random.random()
. 여기 277호선에서 보실 수 있습니다.)
이 예는 제가 설명한 내용을 보여줍니다.
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
출력:
['e', 'c', 'd', 'a', 'b']
[5, 3, 4, 1, 2]
언급URL : https://stackoverflow.com/questions/23289547/shuffle-two-list-at-once-with-same-order
'programing' 카테고리의 다른 글
구조 sockaddr_un vs sockaddr (0) | 2023.09.09 |
---|---|
UI 레이블에서 텍스트의 픽셀 너비 (0) | 2023.09.09 |
앵커 링크를 클릭 불가능 또는 비활성화하려면 어떻게 해야 합니까? (0) | 2023.09.09 |
XHR 업로드 진행률이 처음부터 100%입니다. (0) | 2023.09.09 |
기능: @RunWith(Spring)JUNIT4ClassRunner.class) (0) | 2023.09.09 |