比较两个文件并更新ID

时间:2017-11-09 09:17:52

标签: python xml

目前,我正在使用两个XML文件:一个文件带有文字,每个单词都有自己的ID,另一个文件包含“特殊”的ID。名字等词。以下是文件1的示例:

<?xml version="1.0" encoding="utf-8"?>
<book id="book.mul">
  <article author="Test" id="a1" lang="de" title="Example">
    <div>
      <s id="a1-s1" lang="en">
        <w head="ROOT" id="a1-s1-w1" lemma="Example" pos="NN">Example</w>
      </s>
    </div>
    <div>
      <s id="a1-s2" lang="en">
        <w deprel="DET" head="a1-s2-w2" id="a1-s2-w1" lemma="d" pos="ART">This</w>
        <w deprel="SUBJ" head="a1-s2-w4" id="a1-s2-w2" lemma="be" pos="VAFIN">is</w>
        <w deprel="APP" head="a1-s2-w2" id="a1-s2-w3" lemma="John" pos="NE">John</w>
        <w deprel="-PUNCT-" head="a1-s2-w3" id="a1-s2-w4" lemma=";" pos="$.">;</w>
      </s>
    </div>
  </article>
</book>

以下是文件2的示例:

<?xml version="1.0" encoding="utf-8"?>
<ner>
  <per>
    <g id="g_1" level="per" span="a1-s2-w3" stid="s23" type="person"/>
    <g id="g_2" level="per" span="a1-s2-w17" stid="g23" type="person"/>
  </per>
</ner>

现在我的想法是浏览文件2中的所有条目并检查&#34; span&#34;对应于文件1中的ID。如果是这种情况,则文件1中的POS标签必须是&#34; NE&#34;。在这种情况下,一切似乎都没问题。

如果POS标签不等于&#34; NE&#34;,我想检查文件1中的前一个单词是否具有POS标签&#34; NE&#34;。如果是这种情况,我想更改第二个文件中的span-ID。

如何以有效的方式完成?

(为什么要向后搜索?因为有一些操作可能会删除一个条目......事实上,每个句子最多可以删除3个条目。这可能以这种方式实现吗?)

当然,如果你看到解决问题的其他方法,我有兴趣听听它们。 ;)

非常感谢任何提议!

编辑:

我的实际功能如下:

def correct_tags(root):
    for sentence in root.findall('.//s'):
        words = sentence.findall('.//w')
        sent_lang = sentence.get('lang')
        if sent_lang == 'de':
            for index, word in enumerate(words):
                try:
                    # correct 's in German texts (attach to previous word if previous word = NE
                    if word.text == "'s" and words[index-1].get('pos') in ['NE', 'NN']:
                        print('word before', words[index-1].text)
                        text = words[index-1].text
                        words[index-1].text = text + "'s"
                        print('word after', words[index-1].text)
                        try:
                            sentence.remove(word)
                        except ValueError:
                            print('not working', word)

                except IndexError:
                    continue

您可以在代码中看到我删除了一个条目,这是导致不同ID的原因。直接检查两个XML中的差异是否可能/更好/更有效?

感谢您的任何建议!

1 个答案:

答案 0 :(得分:0)

这个对我有用,虽然它没有经过优化,但你可以尝试一下:

sessionInfo()    
R version 3.4.2 (2017-09-28)    
Platform: x86_64-w64-mingw32/x64 (64-bit)    
Running under: Windows 7 x64 (build 7601) Service Pack 1    

Matrix products: default

locale:
[1] LC_COLLATE=English_United Kingdom.1252  LC_CTYPE=English_United 
Kingdom.1252   
[3] LC_MONETARY=English_United Kingdom.1252 LC_NUMERIC=C                           

[5] LC_TIME=English_United Kingdom.1252    


dput(head(test))  
Date.Created = structure(c(1477919160, 1477915320, 1477936980, 
    1477919820, 1477917780, 1477909680), class = c("POSIXct", 
    "POSIXt"), tzone = "")