• 模型预测的实现过程:
      1. import os
      2. import torch
      3. import torch.nn as nn
      4. # 导入RNN模型结构
      5. from RNN_MODEL import RNN
      6. # 导入bert预训练模型编码函数
      7. from bert_chinese_encode import get_bert_encode_for_single
      8. # 预加载的模型参数路径
      9. MODEL_PATH = './BERT_RNN.pth'
      10. # 隐层节点数, 输入层尺寸, 类别数都和训练时相同即可
      11. n_hidden = 128
      12. input_size = 768
      13. n_categories = 2
      14. # 实例化RNN模型, 并加载保存模型参数
      15. rnn = RNN(input_size, n_hidden, n_categories)
      16. rnn.load_state_dict(torch.load(MODEL_PATH))
      17. def _test(line_tensor):
      18. """模型测试函数, 它将用在模型预测函数中, 用于调用RNN模型并返回结果.它的参数line_tensor代表输入文本的张量表示"""
      19. # 初始化隐层张量
      20. hidden = rnn.initHidden()
      21. # 与训练时相同, 遍历输入文本的每一个字符
      22. for i in range(line_tensor.size()[0]):
      23. # 将其逐次输送给rnn模型
      24. output, hidden = rnn(line_tensor[i].unsqueeze(0), hidden)
      25. # 获得rnn模型最终的输出
      26. return output
      27. def predict(input_line):
      28. """模型预测函数, 输入参数input_line代表需要预测的文本"""
      29. # 不自动求解梯度
      30. with torch.no_grad():
      31. # 将input_line使用bert模型进行编码
      32. output = _test(get_bert_encode_for_single(input_line))
      33. # 从output中取出最大值对应的索引, 比较的维度是1
      34. _, topi = output.topk(1, 1)
      35. # 返回结果数值
      36. return topi.item()

    tensor.topk演示:

    1. >>> tr = torch.randn(1, 2)
    2. >>> tr
    3. tensor([[-0.1808, -1.4170]])
    4. >>> tr.topk(1, 1)
    5. torch.return_types.topk(values=tensor([[-0.1808]]), indices=tensor([[0]]))

    • 代码位置: /data/doctor_offline/review_model/predict.py

    • 输入参数:
      1. input_line = "点瘀样尖针性发多"

    • 调用:
      1. result = predict(input_line)
      2. print("result:", result)

    • 输出效果:
      1. result: 0

    • 模型批量预测的实现过程:
      1. def batch_predict(input_path, output_path):
      2. """批量预测函数, 以原始文本(待识别的命名实体组成的文件)输入路径
      3. 和预测过滤后(去除掉非命名实体的文件)的输出路径为参数"""
      4. # 待识别的命名实体组成的文件是以疾病名称为csv文件名,
      5. # 文件中的每一行是该疾病对应的症状命名实体
      6. # 读取路径下的每一个csv文件名, 装入csv列表之中
      7. csv_list = os.listdir(input_path)
      8. # 遍历每一个csv文件
      9. for csv in csv_list:
      10. # 以读的方式打开每一个csv文件
      11. with open(os.path.join(input_path, csv), "r") as fr:
      12. # 再以写的方式打开输出路径的同名csv文件
      13. with open(os.path.join(output_path, csv), "w") as fw:
      14. # 读取csv文件的每一行
      15. input_line = fr.readline()
      16. # 使用模型进行预测
      17. res = predict(input_line)
      18. # 如果结果为1
      19. if res:
      20. # 说明审核成功, 写入到输出csv中
      21. fw.write(input_line + "\n")
      22. else:
      23. pass

    • 代码位置: /data/doctor_offline/review_model/predict.py

    • 输入参数:
      1. input_path = "/data/doctor_offline/structured/noreview/"
      2. output_path = "/data/doctor_offline/structured/reviewed/"

    • 调用:
      1. batch_predict(input_path, output_path)

    • 输出效果:
      • 在输出路径下生成与输入路径等数量的同名csv文件, 内部的症状实体是被审核的可用实体.

    • 小节总结:
      • 学习并实现了模型预测的函数: predict(input_line).
      • 学习并实现了模型批量预测的函数: batch_predict(input_path, output_path)