使用UIMA从XML文件中提取文本

4

我正在使用UIMA构建一个XML文本提取器。由于我对UIMA框架是一个完全的初学者,我想知道如何去做。

我了解到UIMA可以注释文件的特定部分,但是如何高效地提取信息呢?任何帮助都将不胜感激。

谢谢, Jatin


1
有不同的组件支持这样的功能,但也许更有效的方法是应用一个快速的XML解析器,提供元素偏移量的访问,并为感兴趣的部分创建注释。 - Peter Kluegl
请问您能详细说明一下UIMA中提供此功能的组件是什么吗?谁知道呢,也许我会发现一个比自定义XML解析更强大的组件来满足我的使用情况。 - jatinpreet
2个回答

3

作为UIMA Ruta的开发者,我在以下用例中使用HtmlAnnotator。在有限的视角下,这当然不是最高效的方法。分析引擎不会为元素使用单独的类型,因为它只知道最常见的html标签,但如果需要,我会将其转换为预定义的UIMA Ruta类型系统。在后端,应用了htmlparser


1
谢谢您的回答。我还想知道是否有一种方法可以通过提供正则表达式来提取值,并将元数据与该值相关联,这应该是最近的文本元素。简而言之,我们是否可以使用UIMA映射键值对?例如,在课程成绩单中,我为某些学生注册ID提供正则表达式,并能够提取相关数据同时将密钥即学生注册ID与其关联。请帮忙。 - jatinpreet
1
这并不复杂。您可以定义一个具有两个特征(键和值)的新类型。然后,使用正则表达式的简单Java分析引擎就足够了。我个人会再次使用UIMA Ruta,它应该提供此任务所需的所有功能。 - Peter Kluegl
1
谢谢Peter,这很有帮助。我还想知道UIMA ruta是否仅限于文本输入?我们能否对基于表单的输入(例如一些扫描图像文件)应用规则? - jatinpreet
1
是的,UIMA Ruta 仅限于文本文件。 - Peter Kluegl

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);
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接