将POS标记作为属性添加到xml元素

时间:2013-05-30 14:11:39

标签: python xml pos-tagger

我想将词性标注器的输出添加到现有的xml文件中,并将POS标记作为现有单词元素的属性值对:

house/N + <w>house</w> --> <w pos="N">house</w>

我以为我可以为这些单词提供唯一的ID,匹配它们然后将POS-tag添加到现有的xml文件中,所以我在Python中设计了以下函数:

import xml.etree.ElementTree as ET

def add_postags(POSfile, xmlfile):
    """
    Function that takes two arguments (POSfile, xmlfile).
    If the value of the word <w>'s attribute 'id' in the POSfile matches
    the value of 'id' in the existing xml file,
    it adds the pos tags that are stored as attribute-value pairs in (POSfile)
    to the xml file and writes this to a new document 'xmlPOS'.
    """

    treePOS = ET.parse(POSfile)
    rootPOS = treePOS.getroot()
    tree = ET.parse(xmlfile)
    root = tree.getroot()


    for w in rootPOS.iter('w'):
        idPOS = w.get('id')

    for w in root.iter('w'):
        idxml = w.get('id')

    for w in rootPOS.iter('w'):
        POSval = w.get('pos')

    if idPOS == idxml:        
        w.set('pos', POSval)

    tree.write('xmlPOS.xml')

    return xmlPOS

为此,我必须将标记器输出'house / N'转换为xml格式:

<w id="1" pos="N">house</w>

但是即使我这样做然后在Python中导入上面的模块,我似乎无法将POS标签添加到现有的xml文件中(当然包含比上面的例子更多的编辑标记)。也许我应该使用XSLT代替这个Python xml解析器?我对XSLT还不是很熟悉,所以我想我先用Python尝试一下。

任何意见或建议都将不胜感激:提前感谢!

3 个答案:

答案 0 :(得分:0)

set方法是在ElementTree中设置属性的合适方法,我刚刚测试它在应用于从磁盘读取的XML文件时是否有效。

我想知道你的问题是否算法 - 你写的算法看起来不像你想要的那样。 idPOSidxmlPOSval将等于每个文件中的 last 匹配值,w将相等到最后一个<w>标记。它只能改变一个单词,即最后一个单词。如果您要批量设置词性属性,也许您想要更像下面的内容(如果我对POSfile的结构做了一些错误的假设,您可能需要调整它):

# load all "pos" attributes into a dictionary for fast lookup
posDict = {}
for w in rootPOS.iter("w"):
    if w.get("pos") is not None:
        posDict[w.text] = w.get("pos")

# if we see any matching words in the xmlfile, set their "pos" attrbute
for w in root.iter("w"):
    if w.text in posDict:
        w.set("pos", posDict[w.text])

答案 1 :(得分:0)

我已经执行了标记,但我需要将te输出写入xml文件。标记器输出如下所示:

The/DET house/N is/V big/ADJ ./PUNC

文本来自的xml文件如下所示:

<s>
 <w>The</w>
 <w>house</w>
 <w>is</w>
 <w>big</w>
 <w>.</w>
</s>

现在我想将pos-tags作为属性 - 值对添加到xml元素:

<s>
 <w pos="DET">The</w>
 <w pos="N">house</w>
 <w pos="V">is</w>
 <w pos="ADJ">big</w>
 <w pos="PUNC">.</w>
</s>

我希望这个英文样本能说清楚(我实际上是在研究历史悠久的威尔士语)。

答案 2 :(得分:0)

我现在已经设法用ElementTree做了类似的事情:

import sys
import os
import re
import tree

def xmldump(file_name, xmldump):

    """
    Function takes one argument (file_name), and returns a list
    containing (for every sentence) a list of word-pos pairs
    It then converts this output to xml.
    """

text = ' '.join(open(file_name).readlines())

#split the text into sentences
sentences = re.split("\.\/PUNC", text)

xmlcorpus = []

#convert sentences to xml    
for s in sentences:
    t = tree.xml(s)
    xmlcorpus.append(t)

#write xmlcorpus to new file
with open(xmldump, 'w') as f:
    for sent in xmlcorpus:
        f.write(sent)

return xmldump

这种工作,虽然现在有一些由ElementTree'树'模块自动生成的'chink'和'chunk'元素,我无法以某种方式摆脱它。