计算文档数量
Counting number of documents
我有一个语料库,我需要统计整个语料库中文档和标记的数量,以及它的子部分。
到目前为止我开发的代码如下所示:
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字
所以自然科学学院是语料库的一个子库,物理研究所是自然科学学院的一个子库。希望这能说明问题。
当给定关键字参数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}
我有一个语料库,我需要统计整个语料库中文档和标记的数量,以及它的子部分。
到目前为止我开发的代码如下所示:
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字
所以自然科学学院是语料库的一个子库,物理研究所是自然科学学院的一个子库。希望这能说明问题。
当给定关键字参数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}