我有两个不同的文件,每个文件的内容来自不同的数据流。我从两个不同的文件中收集了这些流的一些数据。然后我想搜索文件以找到任何类型的模式,所以在稍后阶段,如果我从流中收集更多数据,我应该能够区分哪些数据属于哪个流(基于我找到的模式)更早)。
文件中包含的数据示例可以是:b0 82 91 a2 c3 89 b0 82 4a e3 ....(更多字节)...... 虽然我在这里占用了很少的字节,但我们可以找到两次以上的模式“b0 82”。所以输出应该显示模式和它来的次数。类似地,我们可以有3字节模式或更多字节模式。
还有一个例子可以是:aa 00 a7 2f 7b 4c ....(更多字节)..... aa 01 a7 .........(更多字节)...... aa 05 a7 ..... 我认为即使这可以被认为是一个3字节的模式,其中两个字节(aa和a7)是固定的,而中间的一个从00到05不等。
这是我能想到的两个例子,尽管可能有更多的模式。即使可能存在一些无法立即可视化的隐藏模式。整个想法是任何模式都可以做到,只要这有助于在稍后阶段区分两个流。我想我现在更明确地指出我的问题了。请让我知道以下事项:
我们如何进行此类模式发现?
是否有任何工具或库可以帮助实现此目的?
还使用哪种语言或工具进行有效和快速的开发?
数据挖掘领域可以帮助实现这一目的吗?如果是,如何继续?
答案 0 :(得分:1)
这似乎是一个非常典型的ngram发现问题。这是一些ngram解决方案的链接。
quicker way to detect n-grams in a string?
你应该像对待任何其他字符串那样对待你的十六进制。
答案 1 :(得分:0)
您可以在流上训练Markov Models甚至隐藏马尔可夫模型,并使用这些模型来确定最有可能属于哪些新数据流。据说有数十个库可以用您选择的编程语言来实现。
也许从读一本书开始。我建议C. Bishop Pattern Recognition。
答案 2 :(得分:-1)
这是另一个想法。它是否适合您取决于您正在处理的数据量,可以使用的内存量,以及它检测到的模式类型是否最终用于您的目的。
考虑到所有这些资格,您可能想尝试使用后缀树或后缀数组。特别是对于后缀树,有一些算法可以让您在向文本追加字符时不断更新树(所谓的在线后缀树构造),最着名的是Ukkonen算法。这可能对数据流的使用特别有效(与固定长度,完全定义的输入文本相反)。
后缀树(以及类似的方式,后缀数组)表示文本的所有后缀(在字符串结尾的意义上,而不是语言后缀)。因此,它特别适合于(a)检查任何给定的字符串是否是文本的子字符串,以及(b)用于检测文本中的重复的子字符串。通过对正确的位置进行一些修改,它可用于检测重复的子串,并进行轻微的更改(就像您在中间交换一个字符时重复的模式示例一样)。
要全面了解这些数据结构,如果您可以访问大学图书馆或有钱,Dan Gusfield's introduction to algorithms on strings, trees and sequences将非常有用。但是在SO上也有很多与此相关的问题和答案。
如果在进一步阅读后,您认为值得一试,我可以进一步详细说明我认为后缀树可以用于您的目的,以回答一个新问题,特别是关于这些算法的重复使用模式检测。
答案 3 :(得分:-2)
您的问题尚未完全定义,但我会尽量给您一些指示:
您的模式可能表达为正则表达式。如果您不知道这些是什么 - 我会尝试用您最喜欢的编程语言寻找一个具体的例子。 Python是一个很好的选择(re模块包含在核心语言中)。对于C ++,请使用boost :: regex,对于其他语言,请使用google:)
现在 - 要使用正则表达式来搜索二进制文件(十六进制)而不是文本,请尝试查看this之类的内容。