Pokrivam uporabo meta-taggerja in conllu formata.
This commit is contained in:
parent
da6747e1c4
commit
51c3899ca3
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
**.pyc
|
||||||
|
**.xml
|
|
@ -12,6 +12,12 @@ Loci velik xml v skupek ucenec in skupek ucitelj xml-ov, vsak predstavlja \<text
|
||||||
|
|
||||||
```python3 separate.py SOLAR_ID.xml```
|
```python3 separate.py SOLAR_ID.xml```
|
||||||
|
|
||||||
|
## Uporaba metataggerja
|
||||||
|
|
||||||
|
Izhod metataggerja je v txt obliki. Za to je potrebno pretvoriti xml v conllu in nazaj. Za pretvorbo xml->conllu obstajajo Python scripte nekje (TODO), za pretvorbo nazaj pa je scripta prilozena tu. pozeni (pazi: Python 2.7):
|
||||||
|
|
||||||
|
```python2 multiple_conllu_to_xml.py teacher-out-txt teacher-out-xml```
|
||||||
|
|
||||||
## Uporabi izhod tagger-ja
|
## Uporabi izhod tagger-ja
|
||||||
|
|
||||||
Denimo da damo mapo `student` skozi taggerja in dobimo izhod v mapi `student-out`. Vsaka mapa ima polno datotek: `0.xml, 1.xml,...`. Zdruzimo ozbo_id informacijo z informacijo taggerja:
|
Denimo da damo mapo `student` skozi taggerja in dobimo izhod v mapi `student-out`. Vsaka mapa ima polno datotek: `0.xml, 1.xml,...`. Zdruzimo ozbo_id informacijo z informacijo taggerja:
|
||||||
|
|
139
conllu_to_xml.py
Normal file
139
conllu_to_xml.py
Normal file
|
@ -0,0 +1,139 @@
|
||||||
|
#!/use/bin/python2
|
||||||
|
# encoding: utf-8
|
||||||
|
# convert conllu to xml tui
|
||||||
|
|
||||||
|
from __future__ import print_function, unicode_literals, division
|
||||||
|
import re
|
||||||
|
import sys
|
||||||
|
|
||||||
|
import xml.dom.minidom as minidom
|
||||||
|
from lxml import etree
|
||||||
|
import lxml.builder as builder
|
||||||
|
|
||||||
|
|
||||||
|
# regexs
|
||||||
|
re_item = re.compile(r"(\S+)\t(\S+)\t(\S+)")
|
||||||
|
|
||||||
|
|
||||||
|
# cannot do node.set('xml:id', 1), this stuff is needed...
|
||||||
|
def set_xml_attr(node, attribute, value):
|
||||||
|
node.attrib['{http://www.w3.org/XML/1998/namespace}' + attribute] = value
|
||||||
|
|
||||||
|
|
||||||
|
# actually output readable xml
|
||||||
|
def pretty_xml(base):
|
||||||
|
rough_xml = etree.tostring(base)
|
||||||
|
reparsed = minidom.parseString(rough_xml)
|
||||||
|
return reparsed.toprettyxml(indent='\t')
|
||||||
|
|
||||||
|
|
||||||
|
class Sentence:
|
||||||
|
def __init__(self, _id):
|
||||||
|
self.id = _id
|
||||||
|
self.items = []
|
||||||
|
|
||||||
|
def add_item(self, token, lemma, xpos):
|
||||||
|
"""
|
||||||
|
Collect token, lemma, xpos in misc of a gram;
|
||||||
|
ADded to sentence items
|
||||||
|
"""
|
||||||
|
self.items.append([token, lemma, xpos])
|
||||||
|
|
||||||
|
def as_xml(self):
|
||||||
|
"""
|
||||||
|
Create whole <s> xml element for this sentence
|
||||||
|
from the id and items
|
||||||
|
"""
|
||||||
|
base = etree.Element('s')
|
||||||
|
set_xml_attr(base, 'id', str(self.id))
|
||||||
|
id_counter = 1
|
||||||
|
|
||||||
|
for item in self.items:
|
||||||
|
token, lemma, xpos = item
|
||||||
|
# TODO: support slo/en xpos...
|
||||||
|
if xpos == "Z" and token not in ["€", "à", "⅛"] and len(token) == 1:
|
||||||
|
to_add = etree.Element('c')
|
||||||
|
else:
|
||||||
|
to_add = etree.Element('w')
|
||||||
|
to_add.set('lemma', lemma)
|
||||||
|
|
||||||
|
to_add.set('msd', xpos)
|
||||||
|
set_xml_attr(to_add, 'id', "{}.{}".format(self.id, id_counter))
|
||||||
|
to_add.text = token
|
||||||
|
|
||||||
|
id_counter += 1
|
||||||
|
base.append(to_add)
|
||||||
|
|
||||||
|
return base
|
||||||
|
|
||||||
|
|
||||||
|
def build_xml(sentences):
|
||||||
|
"""
|
||||||
|
builds xml from a list of sentences
|
||||||
|
TODO: different langs, div ids, multiple divs,...
|
||||||
|
"""
|
||||||
|
|
||||||
|
body_build = builder.ElementMaker(
|
||||||
|
namespace="http://www.tei-c.org/ns/1.0",
|
||||||
|
nsmap={
|
||||||
|
None: "http://www.tei-c.org/ns/1.0",
|
||||||
|
'xi': "http://www.w3.org/2001/XInclude"})
|
||||||
|
|
||||||
|
# body
|
||||||
|
body = body_build.body()
|
||||||
|
set_xml_attr(body, 'lang', 'si')
|
||||||
|
|
||||||
|
# only one div in body
|
||||||
|
total_div = etree.Element('div')
|
||||||
|
set_xml_attr(total_div, 'id', 'div.1')
|
||||||
|
body.append(total_div)
|
||||||
|
|
||||||
|
# only one p in div
|
||||||
|
total_p = etree.Element('p')
|
||||||
|
set_xml_attr(total_p, 'id', 'p.1')
|
||||||
|
total_div.append(total_p)
|
||||||
|
|
||||||
|
# put all senteces in div
|
||||||
|
for sentence in sentences:
|
||||||
|
total_p.append(sentence.as_xml())
|
||||||
|
|
||||||
|
return body
|
||||||
|
|
||||||
|
|
||||||
|
def main(filein, fileout):
|
||||||
|
sentences = []
|
||||||
|
with open(filein, 'r') as fp:
|
||||||
|
sentence = Sentence(0)
|
||||||
|
for line in fp:
|
||||||
|
# this can be optimized for speed, but for me this
|
||||||
|
# is fast enough and much more readable
|
||||||
|
m = re_item.match(line)
|
||||||
|
|
||||||
|
if not m:
|
||||||
|
sentences.append(sentence)
|
||||||
|
sentence = Sentence(len(sentences))
|
||||||
|
|
||||||
|
else:
|
||||||
|
token = m.group(1)
|
||||||
|
xpos = m.group(2)
|
||||||
|
lemma = m.group(3)
|
||||||
|
|
||||||
|
# using stupid Py2 :(
|
||||||
|
sentence.add_item(
|
||||||
|
token.decode('utf-8'),
|
||||||
|
lemma.decode('utf-8'),
|
||||||
|
xpos.decode('utf-8'))
|
||||||
|
|
||||||
|
# generate xml, pretty print it to an output file
|
||||||
|
xml_tree = build_xml(sentences)
|
||||||
|
xml_str = pretty_xml(xml_tree)
|
||||||
|
with open(fileout, 'w') as fp:
|
||||||
|
print(xml_str.encode('utf-8'), file=fp)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
if len(sys.argv) != 3:
|
||||||
|
print("Uporaba: {} vhodna_datoteka izhodna_datoteks"
|
||||||
|
.format(sys.argv[0]), file=sys.stderr)
|
||||||
|
exit(1)
|
||||||
|
main(sys.argv[1], sys.argv[2])
|
19
multiple_conllu_to_xml.py
Normal file
19
multiple_conllu_to_xml.py
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
from os import sys, path, listdir
|
||||||
|
sys.path.append(path.dirname(path.dirname(path.abspath(__file__))))
|
||||||
|
|
||||||
|
from conllu_to_xml import main as convert_one
|
||||||
|
import sys
|
||||||
|
|
||||||
|
folderin = sys.argv[1]
|
||||||
|
folderout = sys.argv[2]
|
||||||
|
|
||||||
|
for filename in sorted(list(listdir(folderin))):
|
||||||
|
if not filename.endswith('.txt'):
|
||||||
|
continue
|
||||||
|
convert_one(
|
||||||
|
"{}/{}".format(folderin, filename),
|
||||||
|
"{}/{}.xml".format(folderout, filename.split('.')[0]))
|
||||||
|
|
||||||
|
print "\r{}".format(filename),
|
||||||
|
sys.stdout.flush()
|
||||||
|
|
Loading…
Reference in New Issue
Block a user