アレイセグメンテーション(スプライス文)

タイトル:N文は、それぞれの文は、現在、再び一緒に短い文スプライシングに隣接する文のように最小数を必要とし、長さは、スプライシングが完了した後、文の長さ、まだmより大きくない、そして、Mに等しい未満の長さよりも、あります最小分散。スプライシングを探しています。

 問題解決のための(自分自身アウトの質問の要件に沿ってsent_comb3セグメンテーション):

- * -コーディング:UTF-8 - * - 

インポートNPとしてnumpyの


DEF sent_comb1(= 35 MAX_LEN sent_lens、 ):
     "" " 先求总长的平均长度、再切分""" 
    場合 <=(sent_lens)和MAX_LEN :
         リターン[リスト(sent_lens)] 
    avg_len = SUM(sent_lens)// np.ceil(和(sent_lens)/ MAX_LEN)
    RLTS = []
     のため sent_len sent_lens:
         もしない RLTS)又は RLTS(及び和(RLTS [ - 1])> = avg_len):
            rlts.append([sent_len])
        のelifSUM(RLTS [-1])+ sent_len <= MAX_LEN:
            RLTS [ -1 ] .append(sent_len)
         
            rlts.append([sent_len])
    戻りRLTS 


DEF sent_comb2(sent_lens、MAX_LEN = 35 ):
     "" " ファースト両者のそれぞれの平均長さを求め、次にスライス"" " 
    IF SUM(sent_lens)を<= MAX_LEN:
         リターン[リスト(sent_lens)] 
    small_sent_lens = []
     のため sent_len sent_lens:
         IF SUM(small_sent_lens)+ sent_len> 2 * MAX_LEN:
             BREAK
        small_sent_lens.append(sent_len)
    small_sent_lens_sum = SUM(small_sent_lens)
    avg_len = small_sent_lens_sum // np.ceil(small_sent_lens_sum / MAX_LEN)
    RLTS = [] 
    RLT = []
     ながらlenは(sent_lens):
        sent_len = sent_lens [0]
         であれば和(RLT) > = avg_len:
            rlts.append(RLT)
            rlts.extend(sent_comb2(sent_lens))
            ブレーク
        のelif和(RLT)+ sent_len <= MAX_LEN:
            rlt.append(sent_len)
            sent_lens = sent_lens [1:]
         
            rlts.append(RLT)
            rlts.extend(sent_comb2(sent_lens))
            BREAK 
    リターンRLTS 


DEF sent_comb3(= 35 MAX_LEN sent_lens、 :)
     "" " 次に、分割前、および2つのそれぞれの平均長さを決定し、そしてセグメンテーションは、2つの同じ停止動作の結果まで、上記の手順を繰り返し"" " 
    IF SUM(sent_lens)<= :MAX_LEN
         リターン[一覧(sent_lens)] 
    RLTS = []
     のために sent_len sent_lens:
         IF  ないRLTS:
            rlts.append ([sent_len])
        のelif SUM(RLTS [-1])+ sent_len <= -1 MAX_LEN。
            RLTS [] .append(sent_len)
         
            rlts.append([sent_len])
    一方TRUE:
        new_rlts = [RLTS [0] 
        、I = 1
         ながら、 iが< lenの(RLTS):
            small_sent_lens = new_rlts [-1] + RLTS [I] 
            avg_len = SUM(small_sent_lens)// 2 
            RLT = []
             ながらlenは(small_sent_lens):
                sent_len = small_sent_lens [0]
                 であれば和(RLT)> = avg_len:
                     ブレーク
                elifの合計(RLT)+ sent_len <= MAX_LEN:
                    rlt.append(sent_len)
                    small_sent_lens = small_sent_lens [1 :]
                 ブレーク
            new_rlts [ -1] = RLT 
            new_rlts.append(small_sent_lens)
            I + = 1
         の場合 new_rlts == RLTS:
             ブレーク
        RLTS = new_rlts
     戻りRLTS 


DEF ()主要:
    MAX_LEN = 35
     sent_lens = np.random.randint(1、MAX_LEN、サイズ= 20)
    sent_lens = [7、11、12、31、1、1、26、2、7、22、1、14、28、1、1、34、24、32、10、31 ]
     sent_lens = [34、1 、34、1、30、1] 
    印刷(sent_lens)

    インポートはtimeit 

    START_TIME = timeit.default_timer()
    comb_rlt1 = sent_comb1(sent_lens、MAX_LEN = MAX_LEN)
     プリント(timeit.default_timer() - START_TIME)
     プリント(comb_rlt1)
    プリント([ comb_rlt1])における櫛のための合計(櫛)

    START_TIME = timeit.default_timer()
    comb_rlt2 = sent_comb2(sent_lens、MAX_LEN = MAX_LEN)
     印刷(timeit.default_timer() - START_TIME)
     プリント(comb_rlt2)
     #1 ([comb_rlt2の櫛形ため和(櫛)])印刷

    START_TIME = timeit.default_timer()
    comb_rlt3 = sent_comb3(sent_lens、MAX_LEN = MAX_LEN)
     プリント(timeit.default_timer( ) - START_TIME)
     プリント(comb_rlt3)
     #1 [comb_rlt3における櫛のための合計(櫛)]プリント()


場合 __name__ == " __main__ " 
    main()の

 

おすすめ

転載: www.cnblogs.com/jacen789/p/12070493.html