2013-01-12 1 views
1

J'ai quelques centaines de journaux en format pdf et une liste de mots-clés. Mon but ultime est d'obtenir le nombre d'articles mentionnant un mot-clé spécifique en gardant à l'esprit qu'un pdf pourrait contenir plusieurs articles mentionnant le même mot-clé. Mon problème est que lorsque j'ai converti les fichiers pdf en texte brut j'ai perdu la mise en forme qui rend impossible de savoir quand un article commence et quand il se termine.Graver un journal pdf pour des mots-clés

Quelle est la meilleure façon d'aborder ce problème parce que maintenant je pense que c'est impossible. J'utilise actuellement python pour ce projet et la pdfpdf pdfer de la bibliothèque pdf. Voici l'un des fichiers PDF. http://www.gulf-times.com/PDFLinks/streams/2011/2/27/2_418617_1_255.02.11.pdf

+0

Il n'y a pas d'outil raisonnable dans le monde Python pour faire ce que vous voulez. La plupart des outils suppriment les informations de mise en page et en plus: les boîtes de textes ne sont pas nécessairement liées entre elles pour avoir une idée de ce qui appartient à quoi. Il est possible que certains outils commerciaux coûteux, mais aucun outil approprié disponible en open-source. –

Répondre

0

Selon le format du texte que vous pourriez être en mesure de trouver une sorte d'heuristique qui identifie un titre - par exemple, il y a une ligne sur sa propre avec moins de 15 mots et il n'a pas contenir un caractère d'arrêt/période complet. Cela deviendra confus par des choses comme le nom du journal, mais j'espère qu'ils ne disposeront pas d'une quantité significative de texte "non-headline" après eux pour gâcher les résultats trop mal.

Cela dépend de la conversion en texte ayant laissé chaque article contigu (par opposition à simplement ripper des colonnes brutes et mélanger l'article). Si elles sont mélangées, je dirais que vous avez très peu de chance - même si vous pouvez trouver une bibliothèque PDF qui conserve la mise en forme, il n'est pas toujours facile de dire ce qui constitue la «boîte englobante» d'un article. Par exemple, de nombreux articles mettent des légendes et d'autres fonctionnalités qui peuvent perturber même une heuristique avancée.

En fait, le comptage est assez simple. Si les hypothèses que je l'ai mentionné la main, votre pourraient se retrouveront sans doute ressembler à:

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 = "" 

Vous devrez définir handle_article_word_counts() pour faire tout l'indexation des données que vous voulez, mais chaque clé counts sera un mot-clé potentiel (y compris des choses comme and et the, de sorte que vous voudrez peut-être laisser tomber les mots les plus fréquents ou quelque chose comme ça).

Fondamentalement, cela dépend de la précision à laquelle vous voulez que les résultats soient. Je pense que le ci-dessus a une chance de vous donner une approximation juste, mais il a toutes les hypothèses et les réserves que j'ai déjà mentionné - par exemple, s'il s'avère que les titres peuvent couvrir des lignes, alors vous devrez modifier les heuristiques ci-dessus. J'espère que ça vous donnera quelque chose à construire, au moins.

Questions connexes