import numpy as np
from transformers import pipeline


# TODO 1.文本分类
def dm01():
    # 基于预训练模型构建模型对象
    model = pipeline(task='text-classification', model='../models/chinese_sentiment')
    # print("model-->", model)

    #  准备输入数据
    inputs = '我不太喜欢天安门'

    # 把数据送给模型，得到结果，model()->调用forward方法
    result = model(inputs)
    print("result-->", result)


# TODO 2. 特征提取任务
def dm02():
    # 得到模型对象
    model = pipeline(task='feature-extraction', model='../models/bert-base-chinese')
    # 把文本送给模型，得到结果
    result = model('人生该如何起头')
    print("result-->", result)
    # [1, 9, 768] -> 1句话，9个token，每个token使用一个768维度的向量表示
    # 1：一句话
    # 9:9个token，分别是：【CLS 人 生 该 如 何 起 头 SEP】
    # 768：维度数
    print('shape-->', np.array(result).shape)


# TODO 3.完形填空任务
def dm03():
    # 创建模型对象
    model = pipeline(task='fill-mask', model='../models/chinese-bert-wwm')
    # 把数据送给模型，得到结果
    # result = model("我明天想去[MASK]家吃饭")
    result = model("我想明天去[MASK]边钓鱼")
    print("result-->", result)


# TODO 4.阅读理解任务
def dm04():
    # 准备数据
    context = '我叫张三，我是一个程序员，我的喜好是打篮球。'
    questions = ['我是谁？', '我是做什么的？', '我的爱好是什么？']
    # 得到模型对象
    model = pipeline(task='question-answering', model='../models/chinese_pretrain_mrc_roberta_wwm_ext_large')
    # 把数据送给模型
    result = model(context=context, question=questions)
    print("result-->", result)


# TODO 5.文本摘要任务
def dm05():
    # 得到预训练模型对象
    model = pipeline(task='summarization', model='../models/distilbart-cnn-12-6')
    # 准备文本
    text = "BERT is a transformers model pretrained on a large corpus of English data " \
           "in a self-supervised fashion. This means it was pretrained on the raw texts " \
           "only, with no humans labelling them in any way (which is why it can use lots " \
           "of publicly available data) with an automatic process to generate inputs and " \
           "labels from those texts. More precisely, it was pretrained with two objectives:Masked " \
           "language modeling (MLM): taking a sentence, the model randomly masks 15% of the " \
           "words in the input then run the entire masked sentence through the model and has " \
           "to predict the masked words. This is different from traditional recurrent neural " \
           "networks (RNNs) that usually see the words one after the other, or from autoregressive " \
           "models like GPT which internally mask the future tokens. It allows the model to learn " \
           "a bidirectional representation of the sentence.Next sentence prediction (NSP): the models" \
           " concatenates two masked sentences as inputs during pretraining. Sometimes they correspond to " \
           "sentences that were next to each other in the original text, sometimes not. The model then " \
           "has to predict if the two sentences were following each other or not."
    xxx = """
    先帝创业未半而中道崩殂，今天下三分，益州疲弊，此诚危急存亡之秋也。然侍卫之臣不懈于内，忠志之士忘身于外者，盖追先帝之殊遇，欲报之于陛下也。
    诚宜开张圣听，以光先帝遗德，恢弘志士之气，不宜妄自菲薄，引喻失义，以塞忠谏之路也。
宫中府中，俱为一体，陟罚臧否，不宜异同。若有作奸犯科及为忠善者，宜付有司论其刑赏，以昭陛下平明之理，不宜偏私，使内外异法也。
侍中、侍郎郭攸之、费祎、董允等，此皆良实，志虑忠纯，是以先帝简拔以遗陛下。愚以为宫中之事，事无大小，悉以咨之，然后施行，必能裨补阙漏，有所广益。
将军向宠，性行淑均，晓畅军事，试用于昔日，先帝称之曰能，是以众议举宠为督。愚以为营中之事，悉以咨之，必能使行阵和睦，优劣得所。
亲贤臣，远小人，此先汉所以兴隆也；亲小人，远贤臣，此后汉所以倾颓也。
    """
    # 把文本送给模型，得到结果
    result = model(text)
    print("result-->", result)


def dm06():
    # 得到预训练模型对象
    model = pipeline(task='token-classification',
                     model='../models/roberta-base-finetuned-cluener2020-chinese')
    # 把数据送给模型
    result = model("我喜欢杭州西湖")
    print("result-->", result)


if __name__ == '__main__':
    # dm01()
    # dm02()
    # dm03()
    # dm04()
    # dm05()
    dm06()