1

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

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 中尝试一下。

任何意见或建议将不胜感激:在此先感谢!

4

3 回答 3

0

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

我想知道您的问题是否与算法有关——您编写的算法看起来不像您想要的那样。、和将等于每个文件中的最后一个匹配值,并且idPOS将等于最后一个标签。它只能改变一个词,最后一个。如果您要批量设置词性属性,也许您想要更像以下的东西(如果我对结构做出了一些错误的假设,您可能需要调整它):idxmlPOSvalw<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])
于 2013-06-01T01:51:49.743 回答
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 'tree' 模块自动生成的 'chink' 和 'chunk' 元素,但我无法以某种方式摆脱它们。

于 2013-06-04T16:26:25.777 回答
0

我已经执行了标记,但我需要将输出写入 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>

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

于 2013-06-03T14:33:57.553 回答