我有一个语料库,我需要计算语料库中的文档和标记的数量,以及它的子部分。
到目前为止,我一直在开发的代码如下所示:
def gather_data(path):
words = 0
articles = 0
for root, dirs, files in os.walk(path):
for f in files:
if not f.endswith('_metadata.txt') and f.endswith('.txt'):
articles += 1
p = os.path.join(root, f)
with open(p) as duo_file:
for line in duo_file.readlines():
words += len(line.split())
write_to_data(words, articles, current_path)
我知道,计数非常粗糙,需要进一步发展。然而,我似乎无法弄清楚如何计算总数(整个语料库),并计算语料库的每个部分。所以结构是整个语料库 - (第1部分,第2部分,第3部分) - 然后每个部分也有子部分,所以我们有第1部分 - (第1部分,第2部分,第3部分)。
所以从本质上说它是一个列表清单:
[Corpus, [Part 1[part 1, part 2]], [Part 3 [...]]...]]
所以我希望计数(来自上面的例子)
Corpus -> counts
Part 1 -> counts
Part 1.part 1 -> counts
Part 1.part 2 -> counts
有人询问这些部件是什么。他们是文件夹。因此,主文件夹称为语料库,该文件夹由多个文件夹组成,每个文件夹都是语料库的一部分,这些文件夹由更多文件夹或文件组成。它是文件夹目录 - 文件夹 - (文件夹或文件)
所以基本上我想要计算每个文件夹下面的所有文件。所以我想要计算根文件夹,这意味着计算所有内容,然后计算根目录下每个文件夹的计数,然后对这些文件夹进行计数(如果有更多文件夹)。
我希望它打印出来像:
语料库:x篇文章,x个单词 自然科学学院:x文章,x字 物理研究所:x篇,x字
因此,自然科学学院是语料库的一个亚科,物理学院是自然科学系的一个亚科。希望这说清楚。
答案 0 :(得分:2)
当给定关键字参数topdown=False
时,os.walk
将在生成目录之前生成目录的子目录。换句话说,它就像一个后序树搜索。我们可以使用它来对语料库的每个部分中的条目数进行递归计数。
假设我们的目录结构如下:
./corpus
├── part_1
│ ├── sub_1
│ │ ├── 1
│ │ ├── 2
│ │ └── 3
│ └── sub_2
│ ├── 1
│ └── 2
└── part_2
└── part_1
├── 1
├── 2
└── 3
我们可以通过自下而上的步行和总结子目录的大小来计算每个子目录中的条目数:
counts = {}
for dirpath, dirnames, fnames in os.walk("./corpus", topdown=False):
counts[dirpath] = len(fnames)
for d in dirnames:
key = os.path.join(dirpath, d)
counts[dirpath] += counts[key]
测试:
>>> counts
{'./corpus': 8,
'./corpus/part_1': 5,
'./corpus/part_1/sub_1': 3,
'./corpus/part_1/sub_2': 2,
'./corpus/part_2': 3,
'./corpus/part_2/part_1': 3}