J'ai une grande forme de fichier bz2 wikipedia contiennent une image de leurs articles au format xml.Créer un index d'un fichier XML volumineux
Obtenir le texte à partir de la décharge n'est pas difficile. J'utilise le code suivant pour analyser le fichier XML. Je veux savoir s'il existe un moyen d'ouvrir le fichier orignal bz2 ou xml une fois qu'il a été lu, et l'indexer, de sorte que je puisse associer différentes lignes (par exemple, l'article pour un "Barack Obama") avec cet index, et alors quand cette ligne est nécessaire, je peux y aller directement.
Une possibilité consiste à diviser le fichier bz2 ou xml en fragments plus petits, puis à indexer ces fragments. Est-ce que quelqu'un a des idées sur la façon de trouver des lignes spécifiques le plus rapidement possible?
import bz2
try:
from lxml import etree
except ImportError:
import xml.etree.ElementTree as etree
import re
def _get_namespace(tag):
namespace = re.match("^{(.*?)}", tag).group(1)
if not namespace.startswith("http://www.mediawiki.org/xml/export-"):
raise ValueError("%s not recognized as MediaWiki database dump"
% namespace)
return namespace
def extract_pages(f):
elems = (elem for _, elem in etree.iterparse(f, events=["end"]))
elem = next(elems)
namespace = _get_namespace(elem.tag)
ns_mapping = {"ns": namespace}
page_tag = "{%(ns)s}page" % ns_mapping
text_path = "./{%(ns)s}revision/{%(ns)s}text" % ns_mapping
id_path = "./{%(ns)s}id" % ns_mapping
title_path = "./{%(ns)s}title" % ns_mapping
for elem in elems:
if elem.tag == page_tag:
text = elem.find(text_path).text
if text is None:
continue
yield (int(elem.find(id_path).text),
elem.find(title_path).text,
text)
elem.clear()
if hasattr(elem, "getprevious"):
while elem.getprevious() is not None:
del elem.getparent()[0]
if __name__ == "__main__":
dictionary={}
f = bz2.BZ2File("simplewiki.xml.bz2", 'rb')
for pageid, title, text in extract_pages(f):
print pageid
Eh? Une base de données XQuery peut absolument/va indexer un fichier XML en tant que base de données pour des recherches très efficaces. –
@CharlesDuffy, intéressant, semble que vous devriez poster votre suggestion comme réponse. :) – Nemo