根据文本的格式,您可能会想出某种识别标题的启发式方法 - 比如说,它是一行少于 15 个单词的行,并且不包含句号/句点字符。这会被报纸名称之类的东西弄糊涂,但希望他们后面不会有大量的“非标题”文本,以免把结果弄得一团糟。
这依赖于将每篇文章保持连续的文本转换(而不是仅仅撕掉原始列并将文章混合起来)。如果它们混淆了,我会说你几乎没有机会 - 即使你能找到一个保持格式的 PDF 库,也不一定容易分辨出文章的“边界框”是什么。例如,许多论文提出了标注和其他特征,即使是相当高级的启发式也可能会混淆。
实际上进行计数很简单。如果我提到的假设成立,你可能最终看起来像:
import re
import string
non_word_re = re.compile(r"[^-\w']+")
article = ""
for filename in list_of_text_files:
with open(filename, "r") as fd:
for line in fd:
# Split line on non-word characters and lowercase them for matching.
words = [i.lower() for i in non_word_re.split(line)
if i and i[0] in string.ascii_letters]
if not words:
continue
# Check for headline as the start of a new article.
if len(words) < 15 and "." not in line:
if article:
# Process previous article
handle_article_word_counts(article, counts)
article = line.strip()
counts = {}
continue
# Only process body text within an article.
if article:
for word in words:
count[word] = count.get(word, 0) + 1
if article:
handle_article_word_counts(article, counts)
article = ""
您需要定义handle_article_word_counts()
对您想要的数据进行任何索引,但每个键都counts
将是一个潜在的关键字(包括诸如and
and之类的东西the
,因此您可能想要删除最常用的单词或类似的东西)。
基本上,这取决于您希望结果有多准确。我认为上面有一些机会给你一个公平的近似值,但它有我已经提到的所有假设和警告——例如,如果事实证明标题可以跨行,那么你需要修改上面的启发式. 希望它至少能给你一些基础。