2010-12-14 3 views
2

Je dois souvent rechercher beaucoup de mots (1000+) dans de nombreux documents (millions +). J'ai besoin de la position du mot correspondant (si apparié).Recherche de nombreuses expressions dans de nombreux documents en utilisant Python

version pseudo lent code Donc est

for text in documents: 
    for word in words: 
      position = search(word, text) 
      if position: 
        print word, position 

Yat-il un module Python rapide pour le faire? Ou devrais-je implémenter quelque chose moi-même?

+0

Des millions de documents pour des milliers de mots? Pourquoi pensez-vous que votre solution serait meilleure que les dizaines de solutions disponibles? Des millions de documents ne sont pas triviaux. – Falmarri

+0

@Falmarri: Je pense que le but de la question est de trouver une de ces dizaines de solutions sous forme de module Python. – nmichaels

+0

Donc, fondamentalement, vous voulez juste un index en texte intégral? –

Répondre

4

Pour rapide texte exact, recherche multi-mots, essayez acora - http://pypi.python.org/pypi/acora/1.4

Si vous voulez quelques extras - résultat pertinence, quasi-matches, mot-enracinant etc, Whoosh pourrait être mieux - http://pypi.python.org/pypi/Whoosh/1.4.1

Je ne sais pas comment bien échelles à des millions de docs, mais il ne faudrait pas longtemps pour le savoir!

+1

Les systèmes de recherche d'index en texte intégral existants sont définitivement la solution. –

+0

Merci pour les conseils, exactement ce que je voulais. –

1

Qu'est-ce qui ne va pas avec grep?

Vous devez donc utiliser python? Et environ:

import subprocess 

subprocess.Popen('grep <pattern> <file>') 

qui est fou. Mais salut! Vous utilisez python ;-)

+0

Grep va bien, mais je dois utiliser Python. Et je pense que cela ne devrait pas poser de problème pour Python. –

0

Supposant documents est une liste de chaînes, vous pouvez utiliser text.index(word) pour trouver la première occurrence et text.count(word) pour trouver le nombre total d'occurrences. Votre pseudocode semble supposer que les mots ne se produiront qu'une fois, donc text.count(word) peut être inutile.

Questions connexes