我有一个语料库,我需要计算整个语料库中的文档和标记的数量,以及它的子部分。
到目前为止我开发的代码如下所示:
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字
所以自然科学学院是Corpus的子语料库,物理研究所是自然科学学院的子语料库。希望这能让大家清楚。
最佳答案
当给定关键字参数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}
关于python - 计算文档数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28091099/