2014-04-03 3 views
4

Я создаю текстовый экстрактор для XML с использованием UIMA. Поскольку я являюсь новичком в структуре UIMA, я хочу знать, как это сделать.Использование UIMA для извлечения текста из файла XML

Я понимаю, что UIMA может аннотировать конкретные части файла, но как я могу извлечь информацию эффективно? Любая помощь приветствуется.

Спасибо, Jatin

+1

Существуют различные компоненты, которые поддерживают такую ​​функциональность, но, возможно, более эффективно просто применить быстрый XML парсер, который обеспечил доступ к смещениям элементы и создавать аннотации для интересных частей. –

+0

Не могли бы вы рассказать о том, какие компоненты предоставляют эту функциональность в UIMA? Кто знает, я могу найти компонент, который более эффективен для моего использования, чем пользовательский синтаксический анализ XML. – jatinpreet

ответ

3

В ограниченной точки зрения разработчика UIMA Ruta, я использую HtmlAnnotator из UIMA Ruta для этих случаев использования. Это, безусловно, не самый эффективный подход. Механизм анализа не будет использовать отдельные типы для элементов, поскольку он знает только самые распространенные теги html, но при необходимости я выполняю преобразование в предопределенную систему типов в UIMA Ruta. На бэкэнд применяется htmlparser.

+1

Спасибо за ответ. Я также хотел знать, есть ли способ извлечь значения, предоставив regex и связать метаданные со значением, которое должно быть ближайшим текстовым элементом. Короче говоря, мы можем сопоставить ключевые пары значений с помощью uima? Напр. На контрольном листе курса я предоставляю регулярное выражение для определенного идентификатора регистрации ученика и могу извлечь соответствующие данные, связывая ключ, то есть идентификатор регистрации ученика. Пожалуйста, помогите. – jatinpreet

+1

Это не должно быть сложно. Вы можете определить новый тип с двумя функциями, ключом и значением. Тогда достаточно простого механизма анализа java с использованием regexp. Я лично снова использовал UIMA Ruta, который должен предоставить всю функциональность, необходимую для этой задачи. –

+1

Спасибо, Питер. Это помогло. Также мне было любопытно, что UIMA ruta ограничена вводом текста? Можем ли мы применять правила ввода на основе формы, такие как некоторые файлы сканированных изображений? – jatinpreet

1

Здесь читатель коллекции, чтобы вы начали:

import static com.google.common.base.Preconditions.checkArgument; 

import java.io.File; 
import java.io.FileInputStream; 
import java.io.IOException; 
import java.util.List; 

import org.apache.uima.UimaContext; 
import org.apache.uima.collection.CollectionException; 
import org.apache.uima.fit.descriptor.TypeCapability; 
import org.apache.uima.jcas.JCas; 
import org.apache.uima.resource.ResourceInitializationException; 
import org.jdom2.Document; 
import org.jdom2.Element; 
import org.jdom2.JDOMException; 
import org.jdom2.Text; 
import org.jdom2.input.SAXBuilder; 
import org.jdom2.output.Format; 
import org.jdom2.output.XMLOutputter; 
import org.jdom2.xpath.XPathExpression; 
import org.jdom2.xpath.XPathFactory; 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 



@TypeCapability(outputs = "xxx") 
public class XmlCollectionReader extends JCasCollectionReader_ImplBase { 
    private static Logger LOG = LoggerFactory.getLogger(XmlCollectionReader.class); 

    private SAXBuilder builder; 
    private XMLOutputter xo; 
    private XPathExpression<Object> sentenceXPath; 

    @Override 
    public void initialize(UimaContext context) throws ResourceInitializationException { 
     super.initialize(context); 
     try { 
      File corpusDir = new File(inputDir); 
      checkArgument(corpusDir.exists()); 
      fileIterator = DirectoryIterator.get(directoryIterator, corpusDir, "xml", false); 
      builder = new SAXBuilder(); 
      xo = new XMLOutputter(); 
      xo.setFormat(Format.getRawFormat()); 
      sentenceXPath = XPathFactory.instance().compile("//S"); 
     } catch (Exception e) { 
      throw new ResourceInitializationException(
        ResourceInitializationException.NO_RESOURCE_FOR_PARAMETERS, 
        new Object[] { inputDir }); 
     } 
    } 

    public void getNext(JCas jcas) throws IOException, CollectionException { 

     File file = fileIterator.next(); 
     try { 
      LOG.debug("reading {}", file.getName()); 
      Document doc = builder.build(new FileInputStream(file)); 
      Element rootNode = doc.getRootElement(); 

      String title = xo.outputString(rootNode.getChild("Title").getContent()); 

      for (Object sentence : sentenceXPath.evaluate(rootNode)) { 
       Element sentenceE = (Element) sentence; 
        ... 
       } 
      } 

      jcas.setDocumentText(...); 

     } catch (JDOMException e) { 
      throw new CollectionException(e); 
     } 
    } 
} 
+0

Спасибо за код Renaud! – jatinpreet