nlp_models.py 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. from fastapi import APIRouter, Depends, HTTPException
  2. from sqlalchemy.orm import Session
  3. from sqlalchemy.sql import select, or_, and_, func,distinct
  4. from db.schemas import *
  5. from db.models import *
  6. from db.database import get_db
  7. from utils.response import resp_200
  8. from typing import List
  9. from math import ceil
  10. import json
  11. from datetime import datetime
  12. import jieba
  13. import jieba.posseg as pseg
  14. router = APIRouter()
  15. ################################### MOD ###############################################
  16. @router.get("/api/model-list/{page}/{page_size}")
  17. def model_list_page(page: int, page_size: int, db: Session = Depends(get_db)):
  18. count = db.query(DbKgModels).count()
  19. total_page = ceil(count / page_size)
  20. start = 1
  21. if page <= total_page:
  22. start = (page - 1) * page_size
  23. results = db.query(DbKgModels).limit(page_size).offset(start).all()
  24. codes = [KgModels.model_validate(node) for node in results]
  25. return resp_200(
  26. data={"total": count, "pages": page, "size": page_size, "records": [item.model_dump() for item in codes]})
  27. @router.post("/api/model-run")
  28. def model_run(req: NLPRequest, db: Session = Depends(get_db)):
  29. if req.category == "word_cut":
  30. if req.name == "jieba":
  31. result = []
  32. category_list = []
  33. words = pseg.cut(req.content)
  34. index = 0
  35. for w, flag in words:
  36. data = {'name': w, 'category': flag, 'category_name': flag, 'start': index, 'end': index + len(w)}
  37. node = db.query(DbKgNode).filter(DbKgNode.name == w).first()
  38. if node != None:
  39. data['category'] = node.category
  40. data['category_name'] = node.category
  41. if not (node.category in category_list):
  42. category_list.append(node.category)
  43. result.append(data)
  44. else:
  45. if data['category'] == 'n':
  46. result.append(data)
  47. index = index + len(w)
  48. return resp_200(data={"records": result})
  49. medical_re.load_schema("/home/kg-server/nlp/medical_re/predicate.json")
  50. model4s, model4po = medical_re.load_model()
  51. text = req.content
  52. # text = '据报道称,新冠肺炎患者经常会发热、咳嗽,少部分患者会胸闷、乏力,其病因包括: 1.自身免疫系统缺陷\n2.人传人。' # content是输入的一段文字
  53. # text = '''诊断: 烫伤程度,分三度。 一度伤、烫伤只损伤皮肤表层,局部轻度红肿、无水泡、疼痛明显,应立即脱去衣袜后,将创面放入冷水中浸洗半小时,再用麻油、菜油涂擦创面。 二度伤、烫伤是真皮损伤,局部红肿疼痛,有大小不等的水泡,大水泡可用消毒针刺破水泡边缘放水,涂上烫伤膏后包扎,松紧要适度。 三度伤、烫伤是皮下,脂肪、肌肉、骨骼都有损伤,并呈灰或红褐色,此时应用干净布包住创面及时送往医院。切不可在创面上涂紫药水或膏类药物,影响病情况观察与处理。 鉴别诊断:水火烫伤处理的原则是首先除去热源,迅速离开现场,用各种灭火方法,如水浸、水淋、就地卧倒翻滚、立即将湿衣服脱去或剪破、淋水,将肢体浸泡在冷水中,直到疼痛消失为止。还可用湿毛巾或床单盖在伤处,再往上喷洒冷水。不要弄破水泡。 水火烫伤可分为一度烫伤(红斑性,皮肤变红,并有火辣辣的刺痛感),二度烫伤(水泡性,患处产生水泡),三度烫伤(坏死性,皮肤剥落)。对局部较小面积轻度烫伤,可在家中施治,在清洁创面后,可外涂京万红、美宝润湿烧伤膏等。对大面积烫伤,宜尽早送医院治疗。'''
  54. res = medical_re.get_triples(text, model4s, model4po)
  55. # print(json.dumps(res, ensure_ascii=False, indent=True))
  56. return resp_200(data={"records": res})
  57. ################################### NLP ###############################################
  58. from nlp.medical_ner import medical_ner
  59. @router.get("/api/nlp-parse")
  60. def nlp_test():
  61. # with open("../nlp/medical_re/predicate.json", 'r', encoding='utf-8', errors='replace') as f:
  62. # data = json.load(f)
  63. # print(data.keys())
  64. #medical_re.load_schema("/home/kg-server/nlp/medical_re/predicate.json")
  65. #model4s, model4po = medical_re.load_model()
  66. #text = req.content
  67. #text = '据报道称,新冠肺炎患者经常会发热、咳嗽,少部分患者会胸闷、乏力,其病因包括: 1.自身免疫系统缺陷\n2.人传人。' # content是输入的一段文字
  68. #text = '''诊断: 烫伤程度,分三度。 一度伤、烫伤只损伤皮肤表层,局部轻度红肿、无水泡、疼痛明显,应立即脱去衣袜后,将创面放入冷水中浸洗半小时,再用麻油、菜油涂擦创面。 二度伤、烫伤是真皮损伤,局部红肿疼痛,有大小不等的水泡,大水泡可用消毒针刺破水泡边缘放水,涂上烫伤膏后包扎,松紧要适度。 三度伤、烫伤是皮下,脂肪、肌肉、骨骼都有损伤,并呈灰或红褐色,此时应用干净布包住创面及时送往医院。切不可在创面上涂紫药水或膏类药物,影响病情况观察与处理。 鉴别诊断:水火烫伤处理的原则是首先除去热源,迅速离开现场,用各种灭火方法,如水浸、水淋、就地卧倒翻滚、立即将湿衣服脱去或剪破、淋水,将肢体浸泡在冷水中,直到疼痛消失为止。还可用湿毛巾或床单盖在伤处,再往上喷洒冷水。不要弄破水泡。 水火烫伤可分为一度烫伤(红斑性,皮肤变红,并有火辣辣的刺痛感),二度烫伤(水泡性,患处产生水泡),三度烫伤(坏死性,皮肤剥落)。对局部较小面积轻度烫伤,可在家中施治,在清洁创面后,可外涂京万红、美宝润湿烧伤膏等。对大面积烫伤,宜尽早送医院治疗。'''
  69. sentence = '''诊断: 烫伤程度,分三度。 一度伤、烫伤只损伤皮肤表层,局部轻度红肿、无水泡、疼痛明显,应立即脱去衣袜后,将创面放入冷水中浸洗半小时,再用麻油、菜油涂擦创面。 二度伤、烫伤是真皮损伤,局部红肿疼痛,。'''
  70. my_pred = medical_ner()
  71. res = my_pred.predict_sentence(sentence)
  72. print("---")
  73. #res = medical_re.get_triples(text, model4s, model4po)
  74. #print(json.dumps(res, ensure_ascii=False, indent=True))
  75. return resp_200(data={"records":res})
  76. ################################### DATASET ############################################
  77. @router.get("/api/dataset-list/{page}/{page_size}")
  78. def model_list_page(page: int, page_size: int, db: Session = Depends(get_db)):
  79. count = db.query(DbKgDataset).count()
  80. total_page = ceil(count / page_size)
  81. start = 1
  82. if page <= total_page:
  83. start = (page - 1) * page_size
  84. results = db.query(DbKgDataset).limit(page_size).offset(start).all()
  85. print(results)
  86. codes = [KgDataset.model_validate(node) for node in results]
  87. return resp_200(
  88. data={"total": count, "pages": page, 'total_page':total_page, "size": page_size, "records": [item.model_dump() for item in codes]})
  89. nlp_router = router