我有一组包含数千个文档的文档。我想把它分成3组,它们的数量不同但固定。我会怎么做?任何脚本 bash/python/java 或指向参考的链接都将受到高度赞赏。
问问题
121 次
4 回答
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'}
于 2012-08-17T14:22:55.053 回答
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]
于 2012-08-17T14:12:07.890 回答
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']]
于 2012-08-17T14:23:51.953 回答
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
于 2012-08-17T15:19:05.130 回答