Сегментация текста в файле Xliff

Есть ли какие-либо предложения или какая-либо помощь, по которой я могу пойти, чтобы вы могли посоветовать мне сделать сегментацию простого текста в текстовом файле во время его преобразования в файл xml, например, как это было раньше в xml. Я имею в виду, что я конвертирую текстовый файл в xml с помощью jaxp+sax, например этот текст:

 Hello world. I am happy to see you today. 

в этот xml:

 <trans-unit id="1">
            <target> Hello world</target>
        </trans-unit>
        <trans-unit id="2">
            <target> I am happy to see you today</target>
        </trans-unit>

но если у меня, например, есть исходный XML-контент, который в id="1" имеет, например, 3 предложения:

<trans-unit id="1">
            <source> Hello world. Sunny smile. Wake up early.</source>
        </trans-unit>
        <trans-unit id="2">
            <source> I am happy to see you today</source>
        </trans-unit>

и если я разберу текст из этого xml, я стану простым текстом:

Hello world. Sunny smile. Wake up early.I am happy to see you today.

Как я могу сегментировать этот текст во время его преобразования в xml, чтобы целевой файл xml снова мог иметь 3 предложения? нравится:

<trans-unit id="1">
            <target> Hello world. Sunny smile. Wake up early.</target>
        </trans-unit>
        <trans-unit id="2">
            <target> I am happy to see you today</target>
        </trans-unit>

то есть преобразование txt->xml:

public void doit() {
    try {

        in = new BufferedReader(new InputStreamReader(
                new FileInputStream(file), "UTF8"));
        out = new StreamResult(selectedDir);
        initXML();
        String str;
        while ((str = in.readLine()) != null) {

        elements = str.split("\n|((?<!\\d)\\.(?!\\d))");
        for (i = 0; i < elements.length; i++)
            process(str);

         }
        in.close();
        closeXML();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

public void initXML() throws ParserConfigurationException,SAXException, UnsupportedEncodingException, FileNotFoundException, TransformerException {
    // JAXP + SAX
    SAXTransformerFactory tf = (SAXTransformerFactory) SAXTransformerFactory.newInstance();
    th = tf.newTransformerHandler();
    Transformer serializer = th.getTransformer();
    serializer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
    // XML ausgabe
    serializer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
    serializer.setOutputProperty(OutputKeys.INDENT, "yes");
    th.setResult(out);
    th.startDocument();
    atts = new AttributesImpl();
    atts1 = new AttributesImpl();
    atts1.addAttribute("", "", "xlmns","CDATA", "urn:oasis:names:tc:xliff:document:1.2");    
    th.startElement("", "", "xliff", atts1);
    th.startElement("", "", "file",null);
    th.startElement("", "", "body", null);


}

public void process(String s) throws SAXException {
  try {

        atts.clear();
        k++;
        atts.addAttribute("", "", "id", "", "" + k);
        th.startElement("", "", "trans-unit", atts);
        th.startElement("", "", "target", null);
        th.characters(elements[i].toCharArray(), 0, elements[i].length());
        th.endElement("", "", "target");
        th.endElement("", "", "trans-unit");
     }
 catch (Exception e) {
        System.out.print("Out of bounds!");
    }
}
public void closeXML() throws SAXException {
    th.endElement("", "", "body");
    th.endElement("", "", "file");
    th.endElement("", "", "xliff");
    th.endDocument();
}

person user2994149    schedule 02.02.2014    source источник
comment
не могли бы вы опубликовать код, который вы пробовали и где у вас возникли трудности   -  person Romski    schedule 03.02.2014
comment
я делаю преобразование только из текста в xml, но я не знаю, что я могу сделать, чтобы решить эту проблему, что у меня есть, я могу просто опубликовать это преобразование   -  person user2994149    schedule 03.02.2014
comment
Пока вы не сможете показать, что вы пробовали и где застряли, трудно помочь, не сделав все за вас.   -  person Romski    schedule 03.02.2014
comment
конечно, вы не должны решать это за меня, я просто хочу несколько советов, в каком направлении мне идти, чтобы делать то, что я хочу   -  person user2994149    schedule 03.02.2014
comment
и я просто хочу посмотреть, что вы пробовали, чтобы я мог это предоставить - вы написали какой-нибудь код? Похоже, вы выполняете двустороннее преобразование text › xml › text – это правильно? вам нужно будет токенизировать текст и проанализировать ваш xml. Обе возможности есть в стандартном JDK.   -  person Romski    schedule 03.02.2014
comment
да, я конвертирую сначала из xml в txt, а затем из текста в xml   -  person user2994149    schedule 03.02.2014


Ответы (1)


Похоже, вы имеете в виду что-то вроде:

String[] segs = elements[i].trim().split("[.!?]\\s+");
for (String seg : segs) {
    atts.clear();
    k++;
    atts.addAttribute("", "", "id", "", "" + k);
    th.startElement("", "", "trans-unit", atts);
    th.startElement("", "", "target", null);
    th.characters(seg.toCharArray(), 0, seg.length());
    th.endElement("", "", "target");
    th.endElement("", "", "trans-unit");
}

Взять сегменты символа конца строки плюс, по крайней мере, некоторые пробелы.


После комментария новая атака: Каким-то образом вам нужно немедленно преобразовать исходный xml в целевой xml. Это можно сделать очень просто и грубо:

    boolean insideSource = false;
    StringBuilder source = null;
    String str;
    while ((str = in.readLine()) != null) {
        if (!inSource) {
            int pos = str.indexOf("<source>");
            if (pos != -1) {
                pos += "<source>".length();
                str = str.substring(0, pos);
                inSource = true;
                source = new StringBuilder();
            }
        }
        if (inSource) {
            int pos = str.indexOf("</source>");
            if (pos == -1) {
                pos = str.length();
            } else {
                inSource = false;
            }
            source.append(str.substring(0, pos));
            if (!inSource) {
                process(source.toString().trim());
                source = null;
            }
        }

Третья попытка: в Java 7.

List<String> readSourcesFormXML(Path sourceXML) throws IOException { }

String[] segments(String source) {
    return source.split("(?<[.!?])\\s+"); // Or so
}

List<String> readTranslatedSegments(Path txt) throws IOException {
    return Files.readAllLines(txt, StandardCharsets,UTF_8);
}

void writeTargetsToXML(Path targetXML, Path txt, Path sourceXML) {
    List<String> sources = readSourcesFromPath(sourceXML);
    List<String> translatedSegments = readTranslatedSegments(txt);

    List<String> targets = new ArrayList<>(sources.size());
    int segmentIndex = 0;
    for (String source : sources) {
        String target = "";
        int segmentsPerSource = segments(source).length;
        while (segmentsPerSource > 0) {
            --segmentsPerSource;
            if (!target.isEmpty()) {
                target += " ";
            }
            target += segments.get(segmentIndex];
            ++segmentIndex;
        }
        targets.add(target);
    }

    writeTargetsToXML(targetXML, targets);
}
person Joop Eggen    schedule 07.02.2014
comment
спасибо за ответ, но я не это имел в виду. Я имею в виду, что разбивка текстового содержимого на такое же количество предложений, как и в исходном xml-файле. Как я могу получить такое же количество предложений в целевом XML-файле при преобразовании простого текстового файла. - person user2994149; 07.02.2014
comment
Извините, непонимание проблемы. Поскольку другого ответа до сих пор нет, я, надеюсь, добавил что-то более полезное. Не было бы проще написать .txt, выполнив println (с новой строкой) для разделения единиц? - person Joop Eggen; 08.02.2014
comment
большое спасибо за ваши усилия, я пытаюсь еще раз объяснить, что я хочу сделать, напр. у меня есть файл xml (с атрибутами id, как вы можете видеть) на английском языке, у меня есть приложение с графическим интерфейсом, которое анализирует текст из элементов в этом xml и сохраняет файл как текстовый файл, чем я перевожу этот текстовый файл на испанский f.ex , а затем снова преобразуйте этот текстовый файл с помощью приложения gui в файл xml. Мне нужна корреляция между этими «исходными» элементами из первого XML-файла и целевого XML-файла. Так, например, в ‹trans-unit id=1› в элементе ‹source› было 4 предложения, и когда я разбираю его в текст, у меня есть только текст без тега источника - person user2994149; 08.02.2014
comment
и мне нужно снова перенести переведенный текстовый файл в xml, но как я могу сделать это в «целевом» элементе в xml-файле, например, с точными 4 предложениями, как я объяснил bevor. Это означает, что если я сравню эти два файла, исходный xml и целевой xml, я увижу, что в элементах «исходный» и «целевой» одинаковое количество предложений. Я не знаю, как сделать этот раздел и назначение текста. - person user2994149; 08.02.2014
comment
При создании цели снова прочитайте источник; для каждого исходного элемента elements.length (количество сегментов) — это количество испанских строк для чтения. - person Joop Eggen; 08.02.2014