我想将词性标注器的输出添加到现有的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尝试一下。
任何意见或建议都将不胜感激:提前感谢!
答案 0 :(得分:0)
set
方法是在ElementTree中设置属性的合适方法,我刚刚测试它在应用于从磁盘读取的XML文件时是否有效。
我想知道你的问题是否算法 - 你写的算法看起来不像你想要的那样。 idPOS
,idxml
和POSval
将等于每个文件中的 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'元素,我无法以某种方式摆脱它。