2014-06-20 2 views
0

큰 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 

답변

0

하는 XML 파일은 데이터베이스 ... 등으로 사용은 필연적으로 학대의 종류 및 단지 일을 더 IMHO 만들 것의 상단에 "인덱스"와 같은 데이터베이스 기능을 추가하려고하지 않습니다. 게다가, bz2 파일의 내용은 찾을 수 없습니다. 데이터베이스가 필요한 경우 XML을 데이터베이스로 가져 오십시오.

XML 덤프와 관련된 대부분의 작업의 경우 mediawiki-utilities이 가장 빠릅니다. 그냥 설명을 목적으로, 텍스트를 얻기 위해 [[버락 오바마]] 당신은 당신이 현재 버전의 덤프를 다운로드 한 가정 설명서의 예와 비슷한 작업을 수행 할 수 있습니다

from mw.xml_dump import Iterator 

# Construct dump file iterator 
dump = Iterator.from_file(open("example/dump.xml")) 

# Iterate through pages 
for page in dump: 
    if page.title == "Barack Obama": continue 
    # Iterate through a page's revisions 
    for revision in page: 

     print(revision.text) 
+0

Eh? XQuery 데이터베이스는 매우 효율적인 검색을 위해 XML 파일을 데이터베이스로 색인화 할 수 있습니다. –

+0

@CharlesDuffy, 흥미 롭습니다. 대답으로 제안을 게시해야합니다. :) – Nemo

1

높은 작업을위한 올바른 도구 인덱싱 된 XML을 통한 효율적인 검색은 XQuery입니다.이 인덱싱 된 데이터베이스는 여러 가지 고속 인덱싱 된 데이터베이스를 사용할 수있는 언어입니다. Python 바인딩을 사용할 수 있으므로 Python 소프트웨어에서 XQuery 쿼리를 실행할 수 있지만 Python이 아닌 XQuery에 실제 쿼리 자체를 작성해야합니다.

SQL 데이터베이스처럼 XQuery 데이터베이스에도 쿼리 최적화 프로그램이 있지만 쿼리를 작성하는 방법은 인덱스가 얼마나 효율적으로 사용되는지와 관련이 있습니다 (인덱싱을 제어 할 수 있습니다. 형태소 분석이있는 텍스트 색인 및 그 사이의 많은 장소).

코드를 작성하고 디버깅하는 데 유용한 시각화 지원이 포함 된 오픈 소스 XQuery 데이터베이스를 원하면 BaseX을 시작하는 것이 좋습니다. 그것은 훌륭한 UI를 가지고 있으며 XQuery의 진화를 제어하는 ​​W3C 워킹 그룹에 의해 제안 된 새로운 스펙을 지속적으로 추가하면서 언어 스펙의 끝에 매우 가깝습니다. eXist은 잘 유지 관리되는 또 다른 오픈 소스 XQuery 데이터베이스 인 반면 MarkLogic은 더 우수한 상업용 XQuery 구현 중 하나 일 것입니다.

파이썬에서 쿼리를 실행할 수 있도록하려면 the list of available clients for BaseX을 참조하십시오.

the detailed documentation on indexes in BaseX도 참조하십시오. 쿼리를 작성하여 필요한 인덱스를 만들 수 있습니다.