【问题标题】:Generate all possible substrings in sequence按顺序生成所有可能的子串
【发布时间】:2019-09-12 12:32:13
【问题描述】:

我正在寻找一个库或一种在 Python 中实现以下内容的有效方法

Input: 
"He was hungry"

Desired Output:
[["He","was","hungry"]
["He was","hungry"]
["He","was hungry"]
["He was hungry"]]

【问题讨论】:

    标签: python substring permutation n-gram


    【解决方案1】:

    这是一种递归方法:对于包含 N 个单词的输入,计算前 N-1 个单词的可能连接,然后选择是将最后一个单词作为自己的元素附加还是与最右边的元素连接。

    def iter_joinings(items):
        if len(items) == 0:
            return
        elif len(items) == 1:
            yield items
        else:
            right = items[-1]
            for left_a in iter_joinings(items[:-1]):
                left_b = left_a.copy()
                left_a.append(right)
                yield left_a
                left_b[-1] = left_b[-1] + " " + right
                yield left_b
    
    s = "He was hungry"
    for result in iter_joinings(s.split()):
        print(result)
    

    结果:

    ['He', 'was', 'hungry']
    ['He', 'was hungry']
    ['He was', 'hungry']
    ['He was hungry']
    

    这是一个迭代版本,以防万一您有 999 个元素的输入并且不想达到 Python 的最大递归深度:

    import itertools
    
    def iter_joinings(items):
        for decisions in itertools.product((False, True), repeat=len(items)-1):
            result = [items[0]]
            for idx, should_append in enumerate(decisions, 1):
                if should_append:
                    result.append(items[idx])
                else:
                    result[-1] = result[-1] + " " + items[idx]
            yield result
    
    s = "He was hungry"
    for result in iter_joinings(s.split()):
        print(result)
    

    ...尽管如此庞大的输入在任何一种情况下都需要大约 10^300 字节码指令来执行,所以这不太可能成为一个实际问题。

    【讨论】:

      【解决方案2】:
      def f(a):
          if(len(a) == 0):
              yield []
          for i in range(len(a)):
              for c in f(a[i+1:]):
                  yield [" ".join(a[:i+1]), *c]
      
      
      s = "He was hungry"
      print(list(f(s.split())))
      
      [['He', 'was', 'hungry'], ['He', 'was hungry'], ['He was', 'hungry'], ['He was hungry']]
      

      【讨论】:

        【解决方案3】:

        既然你提到了 n-gram,这可能就是你所追求的:

        s = "He was hungry"
        from sklearn.feature_extraction.text import CountVectorizer
        c = CountVectorizer(ngram_range=(1, len(s))).fit([s])
        c.vocabulary_
        
        {'he': 0,
         'was': 4,
         'hungry': 3,
         'he was': 1,
         'was hungry': 5,
         'he was hungry': 2}
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-01-03
          • 1970-01-01
          • 2017-09-09
          • 2011-02-22
          • 2019-07-18
          • 2013-04-22
          • 1970-01-01
          相关资源
          最近更新 更多