目前,我正在使用两个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中的差异是否可能/更好/更有效?
感谢您的任何建议!
答案 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 = "")