代码之家  ›  专栏  ›  技术社区  ›  viraptor

最流行的子字符串

  •  2
  • viraptor  · 技术社区  · 14 年前

    我试图把大量的短字符串解析成一些逻辑部分。似乎有人已经解决了一个有趣的问题,但我找不到任何论文/解决方案(或者我尝试了错误的关键字)。

    弦有2-5个部分。如果我用每一个词代替一封信,上面写着它所属的“部分”/“部分”,下面是它们的一个例子:

    AAABB
    AABBBBCC
    AABBBBDD
    AAACCDD
    ...
    

    大多数“部分”只有2-3个字长,在~10 k字符串中有大约100-500个完全相同的部分。也就是说,在100个字符串中有aaa==“some text here”,在其他100个字符串中有aaa==“some other text”。在一个字符串中,每种类型只能有一个部分(它们通常按顺序排列)。任何部分都没有有限的值集,将来可能会出现新值。

    问题是:如果我有足够的样本,并且不想手动标记,如何检测这些部分?这可以被监视/确认,而不是完全自动的,所以概率列表是可以的。

    我只是想简单地列出2-5个长单词n-grams并找出概率,但这并没有考虑顺序(这可能会有所帮助)。它还可以检测到一些文本是常见的,但是如果我有一些特定的2个部分,并且经常使用相同的值,那么这个方法就不能很好地工作。假设我只有由ABCD组成的字符串,每行中的值相同:

    ABC
    ABD
    ACD
    

    只做ngram分析,我将很有可能成为一个部分,以及ab,c和d。我想在这种情况下从结果中消除ab,但以一种方式,不分配自己的部分到像“the”这样的词,并消除所有较大的部分恰好包含“the”。

    对于类似的问题有什么已知的解决方案吗?

    1 回复  |  直到 14 年前
        1
  •  1
  •   Mark Ransom    14 年前

    这个 Lempel-Ziv-Welch 该算法在识别常见子串时非常有效,但并不尝试对它们进行排序。它也不注意单词或线的边界。它仍然可以作为一个起点来获得你需要的东西。