2016-12-27 11 views
1

私は、上記のコードを使用してTREC文書を分離したテキストファイルに抽出しようとしていますが、いくつかのエラーがあります。ここでは、タグ<DOC></DOC>間の2つの文書が含まれている私のTRECファイルの内容の例である:TREC文書をどのように抽出できますか?

<DOC> 
    <DOCNO> 
     WSJ910102-0145 
    </DOCNO> 
    <DOCID> 
     910102-0145. 
    </DOCID> 
    <HL> 
     xxxx 
    </HL> 
    <DATE> 
     01/02/91 
    </DATE> 
    <LP> 
     text LP1 
    </LP> 
    <TEXT> 
     text1 
    </TEXT> 
</DOC> 
<DOC> 
    <DOCNO> 
     WSJ910102-0144 
    </DOCNO> 
    <DOCID> 
     910102-0144. 
    </DOCID> 
    <HL> 
     .... 
    </HL> 
    <DATE> 
     01/02/91 
    </DATE> 
    <LP> 
     text LP2 
    </LP> 
    <TEXT> 
     text2 
    </TEXT> 
</DOC> 

私は区切りのテキストファイル内の各文書を抽出したいです。文書番号 "DOCNO"のタグ "LP"と "TEXT"の内容を取得する必要があります。ここに私のコードは次のとおりです。

text=text.replace('\n',' ').replace('\t', ' ') 
i=0 
txtDoc='' 
regexTxt='(<LP>(.*?)</LP>)? <TEXT>(.*?)</TEXT>' 
regexDoc='<DOC>(.*?)</DOC>' 
regexDocNo='<DOCNO>(.*?)</DOCNO>' 
pattern = compile(r'<DOC>(.*?)</DOC>') 
iterator = finditer(pattern, text) 
count = 0 
for match in iterator: 
    count +=1 
res=re.search(regexDoc,text) 
while (i<count): 
    txtDoc=res.group(i) 
    resNo=re.search(regexDocNo,txtDoc) 
    docNo=resNo.group() 
    docNo=docNo.replace('<DOCNO>', ' ').replace('</DOCNO>', ' ') 
    res2=re.search(regexTxt,txtDoc) 
    txt=res2.group() 
    txt=txt.replace('<TEXT>', ' ').replace('</TEXT>', ' ').replace('<LP>',' ').replace('</LP>',' ') 
    print("Document : %s \n %s" %(docNo,txt)) 
    i+=1 

print ("Fin") 

ここで印刷された結果である:

Document :  WSJ910102-0145 
      text1 
Document :  WSJ910102-0145 
      text1 
Fin 

そして、私はこの1つを取得したい:

Document :  WSJ910102-0145 
      text LP1 
      text1 
Document :  WSJ910102-0144 
      text LP2 
      text2 
Fin 

答えて

2

私は、XMLパーサーを使用しようとするだろうが。ここではサンプルコードでは、このような構造を解析する方法は次のとおりです。

import xml.etree.ElementTree as ElementTree 

with open('test.trec', 'r') as f: # Reading file 
    xml = f.read() 

xml = '<ROOT>' + xml + '</ROOT>' # Let's add a root tag 

root = ElementTree.fromstring(xml) 

# Simple loop through each document 
for doc in root: 
    print(
     'DOC NO: {}, DOC ID: {}, HL: {}, LP: {}, DATE: {}, TEXT: {}'.format(# Nice formatting py 3 \o/ 
      doc.find('DOCID').text.strip(), 
      doc.find('HL').text.strip(), 
      doc.find('DOCNO').text.strip(), 
      doc.find('LP').text.strip(), 
      doc.find('DATE').text.strip(), 
      doc.find('TEXT').text.strip(), 
     ) 
    ) 

ルートタグを追加する回避策は、ちょっとのXML解析可能なを作るために必要とされました。

出力例:

DOC NO: 910102-0145., DOC ID: xxxx, HL: WSJ910102-0145, LP: text LP1, DATE: 01/02/91, TEXT: text1 
DOC NO: 910102-0144., DOC ID: blabla, HL: WSJ910102-0144, LP: text LP2, DATE: 01/02/91, TEXT: text2 
+1

どうもありがとう!それはうまく動いている!今私はすべてのコレクションでそれを使うことができます!良い一日を ;) –