将一组文档拆分为三个不相交的固定数字集

时间:2012-08-17 14:04:11

标签: java python bash sampling

我有一套包含数千份文件的文件。我想将它分成3组,其数量不同但是固定。我该怎么办?任何脚本bash / python / java或链接到引用都将受到高度赞赏。

4 个答案:

答案 0 :(得分:1)

如果您可以随机获取文档,那么在python中,我只需在“set”上使用列表切片:

 set_of_documents = ...  #somehow build the set
 list_of_documents = list(set_of_documents)
 training = list_of_documents[:ntraining] 
 development = list_of_documents[-ndev:]
 test = list_of_documents[ntraining:-ndev]

答案 1 :(得分:1)

docs={'doc1','doc2','doc3','doc4','doc5','doc6','doc7','doc8','doc9','doc10','doc11','doc12'}
training=set()
test=set()
dev=set()
lis=list(docs)
print(lis)
try:
    for i in range(0,len(lis),3):
        print(lis[i])
        training.add(lis[i])
        test.add(lis[i+1])
        dev.add(lis[i+2])
except IndexError:
    pass

print(training,test,dev)



**output:**

    {'doc10', 'doc3', 'doc8', 'doc7'} {'doc1', 'doc11', 'doc9', 'doc4'} {'doc2', 'doc12', 'doc6', 'doc5'}

答案 2 :(得分:1)

给定包含数据的数组documents和数组partitions指定要放入每个列表的文档数量:

import random
def partition_docs(documents, partitions):
        if len(documents) != sum(partitions):
                raise ValueError("Need exactly %d documents for these partitions, have %d" % (sum(partitions), len(documents)))
        random.shuffle(documents)
        results = []
        start = 0
        for num in partitions:
                results.append(documents[start:start+num])
                start += num
        return results

解释random.shuffle完全随机化文档列表。然后,您只需获得连续切片并将它们作为单独的列表返回。这很容易保证您拥有所需的文档数量,并确保分发尽可能随机。这也适用于任何数量的列表,以将文档拆分为。

示例用法

documents = [random.choice("abcdefghijklmn") for _ in xrange(100)]
partitions = [10, 50, 40]

print partition_docs(documents, partitions)
print partition_docs(documents, partitions)
print partition_docs(documents, partitions)
print partition_docs(documents, partitions)

输出:

[['b', 'n', 'm', 'l', 'c', 'j', 'l', 'e', 'i', 'f'], ['k', 'n', 'i', 'b', 'k', 'f', 'h', 'j', 'i', 'g', 'n', 'c', 'd', 'h', 'd', 'd', 'm', 'g', 'i', 'd', 'i', 'e', 'e', 'a', 'k', 'k', 'f', 'e', 'h', 'm', 'k', 'c', 'h', 'k', 'j', 'k', 'g', 'f', 'j', 'l', 'b', 'e', 'm', 'c', 'd', 'n', 'b', 'h', 'm', 'm'], ['a', 'g', 'f', 'f', 'm', 'k', 'n', 'a', 'n', 'f', 'd', 'j', 'h', 'h', 'k', 'g', 'h', 'k', 'i', 'l', 'm', 'h', 'm', 'i', 'c', 'i', 'c', 'g', 'm', 'l', 'a', 'j', 'g', 'd', 'd', 'n', 'b', 'b', 'n', 'k']]
[['m', 'n', 'e', 'a', 'k', 'b', 'm', 'd', 'k', 'f'], ['d', 'h', 'c', 'g', 'h', 'i', 'l', 'k', 'b', 'g', 'n', 'd', 'n', 'm', 'a', 'm', 'd', 'i', 'n', 'g', 'f', 'g', 'm', 'b', 'j', 'l', 'k', 'f', 'c', 'j', 'i', 'n', 'j', 'h', 'j', 'k', 'k', 'd', 'i', 'm', 'e', 'h', 'c', 'h', 'm', 'i', 'k', 'e', 'f', 'l'], ['m', 'i', 'h', 'j', 'l', 'b', 'e', 'k', 'k', 'h', 'd', 'h', 'm', 'n', 'k', 'f', 'c', 'l', 'g', 'm', 'f', 'n', 'c', 'i', 'd', 'a', 'e', 'f', 'b', 'a', 'd', 'g', 'k', 'n', 'j', 'b', 'i', 'c', 'h', 'g']]
[['f', 'f', 'l', 'g', 'c', 'k', 'i', 'k', 'm', 'h'], ['i', 'k', 'm', 'b', 'c', 'h', 'k', 'i', 'd', 'k', 'n', 'n', 'f', 'c', 'm', 'm', 'e', 'd', 'f', 'm', 'e', 'j', 'k', 'n', 'd', 'g', 'a', 'g', 'j', 'a', 'l', 'l', 'b', 'e', 'c', 'd', 'e', 'a', 'i', 'f', 'j', 'm', 'i', 'd', 'm', 'i', 'n', 'g', 'h', 'c'], ['g', 'h', 'h', 'k', 'k', 'i', 'n', 'n', 'i', 'd', 'l', 'b', 'l', 'f', 'a', 'j', 'b', 'g', 'm', 'n', 'k', 'm', 'g', 'j', 'j', 'm', 'h', 'h', 'c', 'k', 'b', 'd', 'e', 'b', 'n', 'k', 'f', 'h', 'h', 'd']]
[['h', 'k', 'b', 'l', 'h', 'g', 'g', 'n', 'm', 'c'], ['g', 'a', 'i', 'c', 'f', 'i', 'd', 'i', 'k', 'h', 'j', 'b', 'f', 'k', 'm', 'd', 'g', 'm', 'b', 'h', 'f', 'c', 'h', 'd', 'f', 'j', 'n', 'l', 'k', 'n', 'k', 'b', 'h', 'g', 'h', 'b', 'm', 'm', 'i', 'l', 'b', 'k', 'j', 'f', 'm', 'd', 'e', 'm', 'g', 'k'], ['d', 'e', 'm', 'f', 'a', 'l', 'n', 'd', 'j', 'i', 'd', 'n', 'g', 'n', 'k', 'c', 'a', 'c', 'j', 'e', 'f', 'h', 'c', 'i', 'j', 'k', 'm', 'd', 'h', 'e', 'm', 'e', 'a', 'i', 'i', 'l', 'k', 'k', 'n', 'n']]

使用不同的分区:

partitions = [30, 30, 40]

print partition_docs(documents, partitions)
print partition_docs(documents, partitions)
print partition_docs(documents, partitions)
print partition_docs(documents, partitions)

输出:

[['g', 'h', 'n', 'i', 'j', 'l', 'a', 'm', 'g', 'h', 'd', 'l', 'g', 'e', 'b', 'i', 'e', 'l', 'i', 'f', 'j', 'a', 'l', 'j', 'e', 'h', 'h', 'j', 'm', 'n'], ['c', 'm', 'g', 'm', 'c', 'e', 'i', 'e', 'm', 'k', 'f', 'e', 'h', 'c', 'k', 'i', 'f', 'd', 'm', 'b', 'm', 'i', 'k', 'd', 'l', 'j', 'f', 'n', 'd', 'l'], ['k', 'j', 'n', 'h', 'b', 'h', 'm', 'j', 'i', 'f', 'e', 'n', 'k', 'n', 'b', 'h', 'm', 'b', 'n', 'j', 'l', 'a', 'e', 'i', 'a', 'h', 'k', 'k', 'h', 'a', 'i', 'k', 'c', 'b', 'c', 'a', 'l', 'm', 'c', 'e']]
[['l', 'l', 'i', 'd', 'm', 'n', 'c', 'm', 'a', 'h', 'g', 'l', 'k', 'f', 'b', 'n', 'i', 'a', 'e', 'j', 'm', 'h', 'h', 'g', 'e', 'm', 'g', 'i', 'f', 'b'], ['n', 'c', 'i', 'e', 'h', 'j', 'i', 'h', 'k', 'c', 'h', 'g', 'j', 'a', 'k', 'n', 'b', 'a', 'm', 'j', 'b', 'c', 'l', 'k', 'j', 'd', 'k', 'c', 'm', 'e'], ['e', 'm', 'b', 'j', 'e', 'c', 'j', 'f', 'h', 'd', 'e', 'j', 'i', 'h', 'h', 'i', 'n', 'k', 'n', 'd', 'i', 'l', 'a', 'a', 'k', 'f', 'l', 'i', 'l', 'b', 'm', 'h', 'e', 'm', 'l', 'm', 'f', 'n', 'e', 'k']]
[['h', 'e', 'c', 'n', 'm', 'l', 'i', 'k', 'a', 'm', 'k', 'i', 'k', 'g', 'f', 'b', 'j', 'l', 'j', 'm', 'i', 'h', 'g', 'h', 'h', 'k', 'l', 'n', 'f', 'j'], ['m', 'j', 'e', 'm', 'a', 'd', 'm', 'l', 'g', 'i', 'e', 'm', 'i', 'j', 'f', 'e', 'f', 'j', 'd', 'b', 'c', 'l', 'n', 'j', 'j', 'e', 'c', 'k', 'm', 'e'], ['i', 'n', 'b', 'i', 'a', 'c', 'a', 'd', 'k', 'h', 'h', 'n', 'h', 'e', 'e', 'h', 'l', 'm', 'h', 'b', 'c', 'f', 'd', 'e', 'm', 'n', 'g', 'i', 'a', 'b', 'c', 'b', 'a', 'i', 'n', 'k', 'h', 'l', 'l', 'k']]
[['l', 'e', 'k', 'k', 'm', 'l', 'g', 'c', 'j', 'd', 'a', 'l', 'k', 'k', 'f', 'l', 'h', 'e', 'g', 'm', 'k', 'm', 'j', 'i', 'b', 'l', 'c', 'b', 'h', 'g'], ['e', 'j', 'd', 'm', 'f', 'f', 'e', 'e', 'n', 'm', 'b', 'h', 'j', 'h', 'm', 'j', 'j', 'i', 'i', 'f', 'e', 'l', 'n', 'i', 'd', 'h', 'a', 'a', 'h', 'i'], ['i', 'n', 'n', 'n', 'b', 'c', 'm', 'j', 'e', 'a', 'h', 'h', 'b', 'h', 'l', 'a', 'i', 'm', 'i', 'a', 'e', 'c', 'i', 'm', 'k', 'n', 'g', 'l', 'd', 'e', 'm', 'j', 'h', 'n', 'k', 'k', 'c', 'c', 'f', 'b']]

答案 3 :(得分:0)

如果这是出于机器学习目的,我认为使用切片是明智的 ,因为您可能会引入一些偏见(文档可能已经按照某种逻辑进行了排序)。所以我会选择Claudiu shuffle解决方案。

请注意,如果您只是想要满足某些比例而不是精确的设置大小,则可以计算每个文档属于每个组的概率:

import random
def split(documents, prob_training=0.8, prob_test=0.1, prob_dev=0.1):
    #you may check some rules on input probabilities e.g. that they indeed *are* probabilities
    training = []
    test = []
    dev = []
    for document in documents:
        prob = random.random()
        if prob < prob_training:
            training.append(document)
        elif prob < prob_training + prob_test:
            test.append(document)
        elif prob < prob_training + prob_test + prob_dev:
            dev.append(document)
    return training, test, dev