import os
os.environ["TF_ENABLE_ONEDNN_OPTS"]="0"

# 下面两个等价
# from tensorflow.keras.preprocessing import sequence
from keras.preprocessing import sequence

"""
    句子长度规范的作用【掌握】：
        1- Dataloader(batch_size=1)，张量的形状不相同的时候只能设置为1。因为里面是使用stack对张量进行拼接
            stack的要求是张量形状完全相同
        2- 迁移学习中有现成的参数可以进行设置
"""

def demo01():
    # 1- 准备数据，两条句子
    sen_list = [
        [1, 23, 5, 32, 55, 63, 2, 21, 78, 32, 23, 1],
        [2, 32, 1, 23, 1]
    ]

    # 2- 句子长度处理
    """
        参数解释：
            sequences：要进行句子长度规范处理的句子列表
            maxlen：句子长度规范的上限。也就是句子中词个数的上限
            padding：对少于长度上限的进行填充。推荐用post
                pre：在句子的前面进行填充
                post：在句子的后面进行填充
            truncating：对大于长度上限的进行截断。推荐用post
                pre：在句子的前面进行截断
                post：在句子的后面进行截断
            value：padding的时候的填充值。推荐使用0，因为对句子的含义不会造成影响
    """
    # result = sequence.pad_sequences(sequences=sen_list,maxlen=10)
    result = sequence.pad_sequences(sequences=sen_list,maxlen=10,padding="post",truncating="post",value=6666)
    print(result)

def demo02():
    # 1- 准备数据
    sen_list = [
        [1, 23, 5, 32, 55, 63, 2, 21, 78, 32, 23, 1],
        [2, 32, 1, 23, 1]
    ]

    # 2- 分别对每条句子进行长度规范的处理
    result_list = []
    for sen in sen_list:
        if len(sen)>10:
            # 截断
            result_list.append(sen[:10])
        else:
            result_list.append(sen + [0] * (10 - len(sen)))

    print(result_list)

if __name__ == '__main__':
    demo01()

    demo02()