큰 bz2 파일 양식이 있습니다. 위키 피 디아에는 XML 형식의 기사 덤프가 들어 있습니다.큰 XML 파일의 색인 만들기
덤프에서 텍스트를 가져 오는 것이 어렵지 않습니다. XML을 파싱하려면 다음 코드를 사용하고 있습니다. (예를 들어, "Barack Obama"에 대한 기사와 같이) 해당 색인으로 연결할 수 있도록 일단 bign2 또는 xml 파일을 열어 색인을 생성하는 방법이 있는지 알고 싶습니다. 그 선이 필요할 때 나는 그것에 직접 갈 수있다.
하나의 가능성은 bz2 또는 xml 파일을 더 작은 청크로 분할 한 다음 해당 청크를 인덱싱하는 것입니다. 가능한 한 빨리 특정 라인을 찾는 방법에 대한 생각을 가진 사람이 있습니까?
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? XQuery 데이터베이스는 매우 효율적인 검색을 위해 XML 파일을 데이터베이스로 색인화 할 수 있습니다. –
@CharlesDuffy, 흥미 롭습니다. 대답으로 제안을 게시해야합니다. :) – Nemo