【问题标题】:Indexing and Searching Over Word Level Annotation Layers in Lucene在 Lucene 中对词级注释层进行索引和搜索
【发布时间】:2011-02-22 09:42:49
【问题描述】:

我有一个数据集,在底层文本上具有多层注释,例如part-of-tagschunks from a shallow parsername entities,以及来自各种natural language processing (NLP) 工具的其他数据集。对于像The man went to the store 这样的句子,注释可能如下所示:

词 POS 块 NER ==== === ===== ======== DT NP 人 人 NN NP 人 去了VBD副总裁 - 到 PP - DT NP 位置 商店 NN NP 位置

我想使用 Lucene 为一堆带有此类注释的文档编制索引,然后跨不同层执行搜索。一个简单查询的示例是检索所有将 Washington 标记为 person 的文档。虽然我并不绝对使用这种表示法,但从语法上讲,最终用户可能会按如下方式输入查询:

查询Word=Washington,NER=Person

我还想做更复杂的查询,涉及跨不同层的注释顺序,例如查找所有带有 person 字样、后跟 arrived at 字样以及带有 location 字样的字词的文档。这样的查询可能如下所示:

查询"NER=Person Word=arrived Word=at NER=Location"

用 Lucene 解决这个问题的好方法是什么?是否有索引和搜索包含结构化标记的文档字段?

有效载荷

一个建议是尝试使用 Lucene payloads。但是,我认为有效载荷只能用于调整文档的排名,而不是用于选择返回的文档。

后者很重要,因为对于某些用例,包含模式的文档数量正是我想要的。

此外,仅检查与查询匹配的术语的有效负载。这意味着 payloads 甚至只能帮助第一个示例查询的排名Word=Washington,NER=Person,因此我们只想确保术语 Washingonton 被标记为Person。但是,对于第二个示例查询"NER=Person Word=arrived Word=at NER=Location",我需要检查未指定且因此不匹配的术语上的标签。

【问题讨论】:

  • 您找到满意的解决方案了吗?

标签: java lucene nlp data-mining text-mining


【解决方案1】:

您正在寻找的是payloads。清醒的想象力有一个detailed blog entry关于这个主题。有效负载允许您存储有关单个术语的元数据字节数组。使用有效负载为您的数据建立索引后,您可以创建一个新的相似性机制,在评分时将您的有效负载考虑在内。

【讨论】:

  • 我认为有效载荷只能用于调整文档的排名。它们也可以用于实际选择返回的文档吗?
  • 当然,有效载荷与评分一起使用,但评分是检索文档的方式。可以根据术语排除文档——想想 NOT 查询。您可能必须编写自己的 QueryParser 才能执行第二项。
【解决方案2】:

您确实可以在 Lucene 中使用 SpanQuery 搜索文本模式,并调整倾斜距离以限制查询词之间可以出现的词条数量,甚至它们出现的顺序。

【讨论】:

    【解决方案3】:

    也许实现您所要求的一种方法是在同一位置(即 Word、POS、Chunk、NER)索引每类注释,并为每个注释添加一个唯一字符串的前缀。不要为单词的前缀而烦恼。您将需要一个自定义分析器来保留前缀,但是您应该能够使用您想要的查询语法。

    具体来说,我的建议是在指定位置索引以下标记:

    Position Word   POS      Chunk     NER
    ======== ====   ===      =====     ========
    1        The    POS=DT   CHUNK=NP  NER=Person     
    2        man    POS=NN   CHUNK=NP  NER=Person
    3        went   POS=VBD  CHUNK=VP       -
    4        to     POS=TO   CHUNK=PP       - 
    5        the    POS=DT   CHUNK=NP  NER=Location
    6        store  POS=NN   CHUNK=NP  NER=Location
    

    要获取语义,请使用SpanQuerySpanTermQuery 保留令牌序列。

    我还没有尝试过,但是在同一位置索引不同类别的术语应该允许位置敏感查询做正确的事情来评估表达式,例如

    NER=人员到达 NER=位置

    请注意与您的示例的区别:我删除了 Word= 前缀以将其视为默认值。此外,您选择的前缀语法(例如,“class=”)可能会限制您正在索引的文档的内容。确保文档不包含短语,或者在预处理中以某种方式对其进行转义。当然,这与您需要使用的分析器有关。

    更新:我使用这种技术来索引文本中的句子和段落边界(使用 break=senbreak=para 标记),以便我可以决定在哪里打破短语查询匹配。似乎工作得很好。

    【讨论】:

    • 我想我需要类似的东西,但我不明白如何实现这种技术。我正在尝试做this。你能帮忙吗?
    猜你喜欢
    • 2012-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-15
    • 2012-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多