如何在另一个字符串中找到可能出现的子串?

时间:2012-01-16 06:37:47

标签: algorithm language-agnostic

说我有一组字符串:

  • 构造
  • 胡言乱语
  • 冰箱
  • 计算器

我有一个“损坏”的句子,可以找到这些字符串的重要子字符串,没有特定的顺序或特定的计数。这些词也未必明确分开。

什么算法可以帮助我找到损坏句子中集合中最可能出现的字符串?

以下是输入示例:

  

xbracadabrqbonstitution ibracadabrefrigeratos obracadabri xtackoverflotefrigeratos

从那个输入中,我希望能够重建这个已知单词数组:

  

['abcracadabra','构成','abracadabra','冰箱','abracadabrea','stackoverflow','冰箱']

句子很短(通常是5-6个单词),所以我可以负担内存和耗电的算法。此外,损害总是局限于每个单词的少数第一个和最后一个字符;中间总是正确的(这就是为什么我在寻找大的子串)。

有什么想法吗?由于单词没有明确分开,因此普通编辑距离不会这样做。

3 个答案:

答案 0 :(得分:1)

由于你的词典中的单词很少,而且单词本身很小,我只想尝试查找字典中每个单词的所有可能的子串。当然,寻找大小为0或1的子串是没有意义的,你可能希望在单词大小上设置一个较低的阈值。

对于每个子字符串,您只需在句子中查找它,如果它出现,您可以将其标记为可能是句子的一部分。对于速度,您可能希望在O(n)中的句子内进行搜索(例如,使用KMPRabin Karp

这是Python中的一个简单的想法(使用强力字符串匹配):

d=["constitution","abracadabra","refrigerator","stackoverflow"]

def substring_match(word,sentence,min_length):
    for start in xrange(0,len(word)):
        for end in xrange(start+min_length,len(word)):
            substr=word[start:end+1]
            if substr in sentence:
                return True
    return False

def look_for_words(word_dict,sent_word):
    return [word for word in word_dict if substring_match(word,sent_word,5)]

def look(word_dict,sentence):
    ret=[]
    for word in sentence.split():
        ret.extend(look_for_words(word_dict,word))
    return ret

if __name__=='__main__':
    print "\n".join(look(d,"xbracadabrqbonstitution ibracadabrefrigeratos obracadabri xtackoverflotefrigeratos"))

答案 1 :(得分:1)

根据所述问题的大小,我根本不会担心优化此解决方案,因为任何短指数都会立即运行。我只会给你一个算法,我非常肯定能给出正确的答案,因为你可以期待像这样的半模糊问题。然后我们可以进行优化。

首先,你需要任何启发式函数f,它接受一个单词w并返回最接近的单词或不匹配。

然后你只需要生成字符串中所有可能的w的集合。在最坏的情况下,这意味着获取长度为1的所有字符串的集合,然后是长度为2的字符串,然后是长度为3的字符串,直到字符串的长度。以这种方式生成的w的总数将在(n * n-1)/ 2

附近

如果您担心速度,可以设置最大字长,生成ws的成本会下降到字符串长度的线性。

取出你的单词并将每个单词依次转换为f,你可以使用任何你想要的启发式单词来确定哪些单词被选为词典中的真实单词,或者当你选择的单词重叠时该怎么做。一个简单的实现可以通过开始字母索引对所有单词进行排序,并且任何时候f返回匹配,跳过字母直到所选单词的结尾。

答案 2 :(得分:0)

您可以尝试Levenshtein distance algorithm查找与词典中的字词距离最小的字词(定义容差)。

祝你好运!

相关问题