【问题标题】:XML element detection - NER in XMLXML 元素检测 - XML 中的 NER
【发布时间】:2019-09-10 15:05:36
【问题描述】:

我想检测 PDF 中的公司名称,我也有 XML 格式的所有 PDF。

手动检测它们相对容易,因为这些名称几乎总是出现在其地址、电话/传真、地址等旁边。它们可能位于 PDF 中的不同位置,它们可能包含略有不同的信息,但肯定有一个模式。

我无法将此逻辑转换为算法。这是 XML 的示例:

<?xml version="1.0" encoding="UTF-8"?>
<Document file="filename.pdf">
  <Page number="1" box="0, 0, 1653, 2338" rotated="false" resolution="200">
    <Block page="1" block_id="B_1">
    <!-- random text on the top part of the pdf -->
    <Environment>
        <Bottom>B_2</Bottom>
    </Environment>
    </Block>
    <Block page="1" block_id="B_2">
    <Properties  num_lines="1" box="268, 303, 529, 323">
    </Properties>
    <Line nr="0">
        <Word box="268, 303, 366, 323">company</Word>
        <Word box="373, 303, 451, 323">name</Word>
        <Word box="459, 303, 529, 323">SA</Word>
    </Line>
    <Plain_Text>Company Name SA
    </Plain_Text>
    <Environment>
    <Right>B_3</Right>
    <Bottom>B_5</Bottom>
    </Environment>
    </Block>
    <Block page="1" block_id="B_3">
    <!-- same structure as before but with the address -->
    </Block>
    <Block page="1" block_id="B_5">
    <!-- same structure as before but with the phone number -->
    </Block>
  </Page>
</Document>

我目前的想法是把算法拆分成2:

  1. 查找模式,Blocks 包含地址、电话号码、传真或它们的任意组合。检测电话/传真很容易,如何检测地址完全是另一个问题。
  2. 在这些块的顶部找到文本。

另一个复杂因素是这些模式差异很大,有时没有电话,或者地址分两行(和两个Blocks),有时还有更多不是公司名称的文本。

这就是为什么我喜欢使用 LSTM 架构(因为 XML 的顺序性)来检测Block,但我对实现不知所措。

我不知道如何输入数据,我是否将每个块分成一个新行?这不是分类问题,因为每个 XML 都有不同的#blocks,我也不认为这是回归,我不能使用嵌入,因为我丢失了 block_id 上的信息。我也不知道如何为架构提供有关地址、电话模式的信息/启发式方法。

我有编程和 NLP 方面的经验,但对 XML 和 XML 解析了解不多。我的两个想法都有我不知道如何解决的问题,我不知道我应该追求哪个(或如果有的话)想法,或者它们是否有充分的根据。感谢您的帮助,谢谢!

【问题讨论】:

    标签: xml xml-parsing named-entity-recognition


    【解决方案1】:

    首先,为了简化您的问题,您可以进行一些转换,将您的 xml 转换为某种编程语言原生的数据结构。

    我将举一个基于 Python 的示例,它可能是目前最适合 NLP 的编程语言。

    首先使用 xmltoDict (from this post) 将您的 XML 转换为 Dict

    pip 安装 xmltodict

    import xmltodict
    
    xmlDocAsDict = xmltodict.parse(your_xml_file_as_string)
    

    使用此数据结构,您将能够遍历块,如下所示:

    for block in xmlDocAsDict['Document']['Page']['Block']:
        #do Something!
    

    现在,您可以在块内的文本中应用 NER 来尝试查找 ORG。我测试了几个 NER,但唯一一个似乎运行良好的是 AllenNLP(参见示例 here) - 然而,AllenNLP 并不是太简单。

    所以:

    pip install allennlp

    然后:

    from allennlp import pretrained
    ner = pretrained.named_entity_recognition_with_elmo_peters_2018()
    

    (由于模型下载,首次运行可能需要一些时间)

    回到积木:

    for block in xmlDocAsDict['Document']['Page']['Block']:
        doc = ner.predict(block)
        for tag in doc['tags']:
             if tag in ('B-ORG', 'L-ORG'):
                print(doc['words'][doc['tags'].index(tag)])
    

    我用 Spacy 进行了测试,但没有得到很好的结果(甚至没有使用大型语料库)。但是您可以从数据中训练自己的 NER,使其更加精确。阅读更多:https://spacy.io/usage/training/#ner

    【讨论】:

    • 谢谢!横切xml没问题,我知道ET(xml.etree.ElementTree),但是谢谢你建议xmltodict。是的,我也尝试过 spacy,但效果不佳,感谢您提供 AllenNLP 链接!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-18
    • 2014-03-23
    相关资源
    最近更新 更多