如何提取 TREC 文件?

Bel*_*iri 2 python parsing python-3.x

我一直在尝试使用上面的代码将 TREC 文档提取到单独的文本文件中,但出现了一些错误。这是我的 TREC 文件内容的示例,其中包含标记<DOC>和之间的 2 个文档</DOC>

<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>
Run Code Online (Sandbox Code Playgroud)

我想在一个单独的文本文件中提取每个文档。我必须获取带有文档编号“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")
Run Code Online (Sandbox Code Playgroud)

这是打印的结果:

Document :       WSJ910102-0145
          text1
Document :       WSJ910102-0145
          text1
Fin
Run Code Online (Sandbox Code Playgroud)

我想得到这个:

Document :       WSJ910102-0145
           text LP1
           text1 
Document :       WSJ910102-0144
           text LP2
           text2
Fin
Run Code Online (Sandbox Code Playgroud)

Ham*_*mZa 5

我会尝试使用 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(),
        )
    )
Run Code Online (Sandbox Code Playgroud)

添加根标记的解决方法是使 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
Run Code Online (Sandbox Code Playgroud)