【问题标题】:Extracting all occurrences of repeated and unique patterns from text, along with context从文本中提取所有出现的重复和独特模式以及上下文
【发布时间】:2012-09-07 13:20:56
【问题描述】:

假设我有文本“abcabx”。我想知道有一个重复的模式“ab”,它出现的所有位置,以及这些重复的上下文如何与它的其他出现相关。我还希望数据结构具有区分和隔离的独特模式“c”和“x”。我已经设置了一个后缀树来尝试这样做,它看起来像这样(from this SO answer):

这确实告诉我模式“ab”出现了两次,一次带有后缀“cabx”,另一次带有“x”。但是,根处的“ab”仅指向模式的第一次出现。它的叶子“cabx”中还嵌入了另一个“ab”,当我希望那个“ab”(在“cabx”中)以某种方式被确认为数据结构中的重复时。我知道根“ab”的“x”叶代表它,但我需要知道,在“ab”的“cabx”叶中,那里有一个“ab”。另外,两个独特的图案“c”和“x”是该边缘的一部分。加上它们在那个边缘的位置,以及它们的“主要定义”(根边缘?)之间的交叉引用。似乎可以通过遍历树并将其放在一起来解决这些问题,但我需要一个数据结构来完全存储这些信息。

也许更简单地说,数据结构需要清楚地说“这里是所有独特的模式”,“这里是所有重复的模式以及它们发生的每个地方”,以及“这里是关联所有这些东西”。

所以我想我正在为后缀树寻找一个类似图形的元素,它可以划分出已知的模式并明确地将它们关联起来。在此过程中,将注意到独特的模式。但是我还是想要后缀树的上下文特征,比如说“c”(不是“cabx”,而是“c”)和“x”都在“ab”之后,“abx”在“abc”之后,什么在他们之后(在更大的情况下)等等。是否有后缀树的适应可以做到这一点,或者可能是另一种算法?

【问题讨论】:

  • 你看过增强后缀数组 (DOI 10.1016/S1570-8667(03)00065-0)吗?我不能 100% 确定它完全符合您的需求,但是:(a) 作为 suffix array,它可以很容易地访问子字符串的 all 上下文,(b)被增强,它包括模拟后缀树的数据结构,即您可以访问(模拟版本的)子节点等,(c)可以有效地搜索它,( d) 它可以以紧凑/简洁/压缩的形式存储,比树更有效。

标签: algorithm pattern-matching design-patterns suffix-tree


【解决方案1】:

后缀树基本上只是以一种便于搜索子字符串的方式存储字符串的所有后缀。每个重复多次的子串将对应一个非终端节点。找到模式出现的上下文相对容易 - 如果您计算每个分支中的符号数量,它将为您提供子字符串结尾与序列结尾的偏移量,例如ab 有两个分支,一个长度为 1,一个长度为 4,因此您知道该模式从字符串末尾开始出现 3 和 6 个符号,或者从开头出现 3 和 0。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-20
    • 2020-08-04
    • 2021-07-17
    • 1970-01-01
    • 2013-06-26
    • 1970-01-01
    • 2012-02-12
    相关资源
    最近更新 更多