1

我有几百份 pdf 格式的报纸和一个关键字列表。我的最终目标是获取提及特定关键字的文章数量,记住一个 pdf 可能包含多个提及相同关键字的文章。

我的问题是,当我将 pdf 文件转换为纯文本时,我丢失了格式,这使得无法知道文章何时开始以及何时结束。

解决这个问题的最佳方法是什么,因为现在我认为这是不可能的。

我目前正在为这个项目使用 python 和 pdf 库 pdfminer。这是其中一个pdf。 http://www.gulf-times.com/PDFLinks/streams/2011/2/27/2_418617_1_255.02.11.pdf

4

1 回答 1

0

根据文本的格式,您可能会想出某种识别标题的启发式方法 - 比如说,它是一行少于 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将是一个潜在的关键字(包括诸如andand之类的东西the,因此您可能想要删除最常用的单词或类似的东西)。

基本上,这取决于您希望结果有多准确。我认为上面有一些机会给你一个公平的近似值,但它有我已经提到的所有假设和警告——例如,如果事实证明标题可以跨行,那么你需要修改上面的启发式. 希望它至少能给你一些基础。

于 2013-01-12T08:14:48.367 回答