// Copyright 2013 Thomas Müller // This file is part of MarMoT, which is licensed under GPLv3. package marmot.morph.mapper.spanish; import java.io.IOException; import java.io.Writer; import marmot.morph.mapper.Node; import marmot.morph.mapper.SyntaxTree; import marmot.morph.mapper.SyntaxTreeIterator; import marmot.morph.mapper.spanish.EaglesTag.Person; import marmot.util.FileUtils; public class IulaConverter { public static void main(String[] args) throws IOException { SyntaxTreeIterator iterator = new SyntaxTreeIterator(args[0], 1, 2, 4, 5, 6, 7, false); Writer writer = FileUtils.openFileWriter(args[1]); boolean normalize = true; if (args.length > 2) { normalize = Boolean.parseBoolean(args[2]); } IulaConverter c = new IulaConverter(); while (iterator.hasNext()) { SyntaxTree tree = iterator.next(); for (Node node : tree.getNodes()) { EaglesTag tag = c.convert(node.getPos()); node.setMorphTag(tag); } if (normalize) { for (Node node : tree.getNodes()) { ((EaglesTag) node.getMorphTag()).normalize(node, true); } } tree.write(writer); writer.write('\n'); // Skip some sentence if (iterator.hasNext()) iterator.next(); if (iterator.hasNext()) iterator.next(); if (iterator.hasNext()) iterator.next(); } writer.close(); } public EaglesTag convert(String freeling_pos) { freeling_pos = freeling_pos.toLowerCase(); EaglesTag tag = new EaglesTag(); setPos(freeling_pos, tag); switch (tag.pos_) { case a: setAdjectiveFeatures(freeling_pos, tag); break; case d: setDeterminerFeatures(freeling_pos, tag); break; case n: setNounFeatures(freeling_pos, tag); break; case v: setVerbFeatures(freeling_pos, tag); break; case p: setPronounFeatures(freeling_pos, tag); break; case r: case c: case i: case z: case w: setDefaultFeatures(freeling_pos, tag); break; case s: setPrepositionFeatures(freeling_pos, tag); break; case f: setPunctFeatures(freeling_pos, tag); break; case _: break; } return tag; } public void setNounFeatures(String freeling_pos, EaglesTag tag) { for (int pos = 1; pos <= freeling_pos.length(); pos++) { char c = freeling_pos.charAt(pos - 1); if (c == '0') continue; switch (pos) { case 1: break; case 2: setType(c, tag); break; case 3: setGender(c, tag); break; case 4: setNumber(c, tag); break; case 5: case 6: // ignore the entity type break; case 7: setNounDegree(c, tag); break; default: throw new RuntimeException("Invalid position : " + pos + " " + freeling_pos); } } } public void setNounDegree(char c, EaglesTag tag) { // IULA bug if (c == 'x') return; tag.noun_degree_ = EaglesTag.NounDegree.valueOf(Character.toString(c)); } public void setPunctFeatures(String freeling_pos, EaglesTag tag) { for (int pos = 1; pos <= freeling_pos.length(); pos++) { char c = freeling_pos.charAt(pos - 1); if (c == '0') continue; switch (pos) { case 1: break; case 2: setType(c, tag); break; case 3: setClosing(c, tag); break; default: throw new RuntimeException("Invalid position : " + pos + " " + freeling_pos); } } } public void setClosing(char c, EaglesTag tag) { // IULA bug if (c == 'c') c = 't'; tag.closing_ = EaglesTag.Closing.valueOf(Character.toString(c)); } public void setDeterminerFeatures(String freeling_pos, EaglesTag tag) { for (int pos = 1; pos <= freeling_pos.length(); pos++) { char c = freeling_pos.charAt(pos - 1); if (c == '0') continue; switch (pos) { case 1: break; case 2: setType(c, tag); break; case 3: setPerson(c, tag); break; case 4: setGender(c, tag); break; case 5: setNumber(c, tag); break; case 6: setOwnerNumber(c, tag); break; default: throw new RuntimeException("Invalid position : " + pos + " " + freeling_pos); } } } public void setPrepositionFeatures(String freeling_pos, EaglesTag tag) { for (int pos = 1; pos <= freeling_pos.length(); pos++) { char c = freeling_pos.charAt(pos - 1); if (c == '0') continue; switch (pos) { case 1: break; case 2: setType(c, tag); break; case 3: setForm(c, tag); break; case 4: setGender(c, tag); break; case 5: setNumber(c, tag); break; default: throw new RuntimeException("Invalid position : " + pos + " " + freeling_pos); } } } public void setForm(char c, EaglesTag tag) { tag.form_ = EaglesTag.Form.valueOf(Character.toString(c)); } public void setPronounFeatures(String freeling_pos, EaglesTag tag) { for (int pos = 1; pos <= freeling_pos.length(); pos++) { char c = freeling_pos.charAt(pos - 1); if (c == '0') continue; switch (pos) { case 1: break; case 2: setType(c, tag); break; case 3: setPerson(c, tag); break; case 4: setGender(c, tag); break; case 5: // IULA bug if (c == 'c') continue; setNumber(c, tag); break; case 6: setCase(c, tag); break; case 7: // IULA bug if (c == 'c') { continue; } setOwnerNumber(c, tag); break; case 8: setPoliteness(c, tag); break; default: throw new RuntimeException("Invalid position : " + pos + " " + freeling_pos); } } } public void setPoliteness(char c, EaglesTag tag) { tag.politeness_ = EaglesTag.Politeness.valueOf(Character.toString(c)); } public void setOwnerNumber(char c, EaglesTag tag) { tag.owner_ = EaglesTag.OwnerNumber.valueOf(Character.toString(c)); } public void setCase(char c, EaglesTag tag) { tag.case_ = EaglesTag.Case.valueOf(Character.toString(c)); } public void setVerbFeatures(String freeling_pos, EaglesTag tag) { for (int pos = 1; pos <= freeling_pos.length(); pos++) { char c = freeling_pos.charAt(pos - 1); if (c == '0') continue; switch (pos) { case 1: break; case 2: setType(c, tag); break; case 3: setMood(c, tag); break; case 4: setTense(c, tag); break; case 5: setPerson(c, tag); break; case 6: setNumber(c, tag); break; case 7: setGender(c, tag); break; default: throw new RuntimeException("Invalid position : " + pos + " " + freeling_pos); } } } public void setPerson(char c, EaglesTag tag) { switch (c) { case '1': tag.person_ = Person.first; break; case '2': tag.person_ = Person.second; break; case '3': tag.person_ = Person.third; break; } } public void setTense(char c, EaglesTag tag) { // Error in IULA if (c == 'b') { return; } tag.tense_ = EaglesTag.Tense.valueOf(Character.toString(c)); } public void setMood(char c, EaglesTag tag) { tag.mood_ = EaglesTag.Mood.valueOf(Character.toString(c)); } public void setDefaultFeatures(String freeling_pos, EaglesTag tag) { for (int pos = 1; pos <= freeling_pos.length(); pos++) { char c = freeling_pos.charAt(pos - 1); if (c == '0') continue; switch (pos) { case 1: break; case 2: setType(c, tag); break; default: throw new RuntimeException("Invalid position : " + pos + " " + freeling_pos); } } } public void setAdjectiveFeatures(String freeling_pos, EaglesTag tag) { for (int pos = 1; pos <= freeling_pos.length(); pos++) { char c = freeling_pos.charAt(pos - 1); if (c == '0') continue; switch (pos) { case 1: break; case 2: setType(c, tag); break; case 3: setDegree(c, tag); break; case 4: setGender(c, tag); break; case 5: setNumber(c, tag); break; case 6: setFunction(c, tag); break; default: throw new RuntimeException("Invalid position : " + pos + " " + freeling_pos); } } } public void setFunction(char c, EaglesTag tag) { tag.function_ = EaglesTag.Function.valueOf(Character.toString(c)); } public void setNumber(char c, EaglesTag tag) { tag.number_ = EaglesTag.Number.valueOf(Character.toString(c)); } public void setGender(char c, EaglesTag tag) { tag.gender_ = EaglesTag.Gender.valueOf(Character.toString(c)); } public void setDegree(char c, EaglesTag tag) { // Following the reference diminutive should be c but in IULA it is d if (c == 'd') { c = 'c'; } try { tag.degree_ = EaglesTag.Degree.valueOf(Character.toString(c)); } catch (IllegalArgumentException e) { throw new RuntimeException("Invalid degree: " + c); } } public void setType(char c, EaglesTag tag) { tag.type_ = EaglesTag.Type.valueOf(Character.toString(c)); } public void setPos(String freeling_pos, EaglesTag tag) { char c = freeling_pos.charAt(0); tag.pos_ = EaglesTag.Pos.valueOf(Character.toString(c)); } }