从文本中提取所有重复和唯一模式,以及上下文

时间:2012-09-07 13:20:56

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

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

abcabx

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

也许更简单一点,数据结构需要清楚地说“这里是所有独特的模式”,“这里是所有重复的模式和它们发生的每个地方”,“这里是与所有相关的上下文这些东西“。

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

1 个答案:

答案 0 :(得分:1)

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