Untitled
unknown
python
a year ago
15 kB
11
Indexable
from flask import Flask, render_template, request, jsonify, redirect
from clips import Environment
import os
import json
class DiseaseDiagnosis:
def prepare(self):
self.dataPath = os.path.abspath(os.path.join(os.getcwd(), 'data'))
diseasePath = os.path.join(self.dataPath, 'disease-symptoms.clp')
self.env = Environment()
self.env.load(diseasePath)
print("CLIPS environment loaded with rules from disease-symptoms.clp")
def reset(self):
self.env.reset()
def addSymptom(self, symptom):
text = f'(assert (has_symptom {symptom}))'
self.env.eval(text)
def run(self):
_ = self.env.run()
def getDiseases(self):
diseases = []
for fact in self.env.facts():
fact = str(fact)
if "disease_is" in fact:
disease = fact[1:-1].split(" ")[1]
disease = disease.replace("_", " ")
disease = disease.title()
diseases.append(disease)
return diseases
def getSymptoms(self):
symptoms = []
for fact in self.env.facts():
fact = str(fact)
if "has_symptom" in fact:
symptom = fact[1:-1].split(" ")[1]
symptom = symptom.replace("_", " ")
symptom = symptom.title()
symptoms.append(symptom)
return symptoms
def getSymptomList(self):
path = os.path.join(self.dataPath, 'symptoms.txt')
f = open(path, "r")
symptoms = []
for x in f:
x = x.replace(',', '')
x = x.replace('\r', '')
x = x.replace('\n', '')
x = x.replace('_', ' ')
x = x.title()
symptoms.append(x)
return symptoms
def add_new_symptom(self, rule_name, symptom):
# Adding to symptoms.txt
path = os.path.join(self.dataPath, 'symptoms.txt')
diseasePath = os.path.join(self.dataPath, 'disease-symptoms.clp')
with open(path, "r") as f:
lines = f.readlines()
lines[-1] = lines[-1].strip()+",\n"
lines.append(f"{symptom},\n")
lines.sort()
print(lines[-1])
lines[-1] = lines[-1][:-2]
with open(path, "w") as f:
f.writelines(lines)
# Adding to CLIP file
with open(diseasePath, "r") as f:
lines = f.readlines()
found_disease = False
new_lines = []
for line in lines:
if rule_name.lower() in line.lower():
found_disease = True
print(line)
new_line = line
if "=>" in line and found_disease:
new_line = line.replace("=>", f"(has_symptom {symptom})\n\t=>")
found_disease = False
new_lines.append(new_line)
# print(new_lines)
with open(diseasePath, "w") as f:
f.writelines(new_lines)
self.prepare()
class DiseaseInfo:
def __init__(self):
self.decsriptions = self.getDescriptions()
self.precautions = self.getPrecautions()
def detail(self, diseases):
data = []
for disease in diseases:
x = disease.lower().strip().replace(" ", "_")
oneData = {
'name': disease,
'description': self.decsriptions[x],
'precautions': self.precautions[x]
}
data.append(oneData)
return data
def getDescriptions(self):
data = {}
f = open("./data/disease-description.csv", "r")
counter = 0
for x in f:
counter += 1
if counter <= 1:
continue
x = x.strip().split(',')
x[0] = x[0].lower().strip().replace(" ", "_")
x[1] = ",".join(x[1:]).replace("\"", "")
data[x[0]] = x[1]
return data
def getPrecautions(self):
data = {}
f = open("./data/disease-precaution.csv", "r")
counter = 0
for x in f:
counter += 1
if counter <= 1:
continue
x = x.strip().split(',')
x[0] = x[0].lower().strip().replace(" ", "_")
precautions = []
for i in range(1, len(x)):
precaution = x[i].strip().capitalize()
if precaution != "":
precautions.append(precaution)
data[x[0]] = precautions
return data
app = Flask(__name__)
app.config['SECRET_KEY'] = os.urandom(24).hex()
engine = DiseaseDiagnosis()
engine.prepare()
info = DiseaseInfo()
@app.route('/', methods=['GET', 'POST'])
def home():
return render_template('index.html', symptomList=engine.getSymptomList())
@app.route('/addNewSymptom', methods=['POST'])
def addNewSym():
try:
new_symptom= request.form['new_symptom']
disease_name= request.form['diseaseName']
new_symptom = new_symptom.replace(' ', '_').lower()
disease_name= "is_it_" + disease_name.replace(' ', '_')
print(new_symptom, disease_name)
engine.add_new_symptom(disease_name, new_symptom)
return redirect('/')
except:
return jsonify({
'status': 'error'
})
@app.route('/addNewDisease', methods=['POST'])
def addNewDisease():
try:
disease_name = request.json['diseaseName'].strip().replace(' ', '_')
disease_description = request.json['diseaseDescription'].strip()
disease_precautions = request.json['diseasePrecautions'].split(',')
new_symptoms = request.json['newSymptoms'].split(',')
# Check if disease name already exists
disease_exists = False
with open(os.path.join(engine.dataPath, 'disease-symptoms.clp'), "r") as f:
for line in f:
if f"(defrule {disease_name}" in line:
disease_exists = True
break
if disease_exists:
return jsonify({
'status': 'error',
'message': f"Disease '{disease_name.replace('_', ' ')}' already exists."
})
# Check if any new symptom already exists in symptoms.txt
existing_symptoms = engine.getSymptoms() # Retrieve existing symptoms
for symptom in new_symptoms:
if symptom.strip().replace(' ', '_').lower() in existing_symptoms:
return jsonify({
'status': 'error',
'message': f"Symptom '{symptom.strip()}' already exists."
})
# # Update symptoms.txt
# with open(os.path.join(engine.dataPath, 'symptoms.txt'), "a") as f:
# for symptom in new_symptoms:
# normalized_symptom = symptom.strip().replace(' ', '_').lower()
# if normalized_symptom not in existing_symptoms:
# f.write(f"{normalized_symptom},\n")
# Update symptoms.txt
with open(os.path.join(engine.dataPath, 'symptoms.txt'), "a") as f:
for symptom in new_symptoms:
f.write(f"{symptom.strip()},\n")
# Update disease-description.csv
with open(os.path.join(engine.dataPath, 'disease-description.csv'), "a") as f:
f.write(f"{disease_name.replace('_', ' ')},{disease_description}\n")
# Update disease-precaution.csv
with open(os.path.join(engine.dataPath, 'disease-precaution.csv'), "a") as f:
f.write(f"{disease_name.replace('_', ' ')},{','.join(disease_precautions)}\n")
# Update disease-symptoms.clp
with open(os.path.join(engine.dataPath, 'disease-symptoms.clp'), "a") as f:
f.write(f"\n(defrule {disease_name}\n")
f.write(f" (disease_is {disease_name})\n")
f.write(f" =>\n")
f.write(f" (printout t \"{disease_name.replace('_', ' ')}\" crlf)\n")
f.write(f")\n")
f.write(f"\n(defrule is_it_{disease_name}\n")
# f.write(f" (and")
for symptom in new_symptoms:
f.write(f" (has_symptom {symptom.strip()})\n")
# f.write(f")\n")
f.write(f" =>\n")
f.write(f" (assert (disease_is {disease_name}))\n")
f.write(f")\n")
# Reload the CLIPS environment
engine.prepare()
return jsonify({
'status': 'success'
})
except Exception as e:
print(e)
return jsonify({
'status': 'error'
})
# NEW_SCRIPT-> 10PM
# @app.route('/addNewDisease', methods=['POST'])
# def addNewDisease():
# try:
# data = request.get_json()
# print(f"Received new disease data: {data}") # Log received data
# if data is None:
# raise ValueError("No data provided")
# disease_name = data['diseaseName'].strip().replace(' ', '_')
# disease_description = data['diseaseDescription'].strip()
# disease_precautions = [precaution.strip() for precaution in data['diseasePrecautions'].split(',')]
# new_symptoms = [symptom.strip() for symptom in data['newSymptoms'].split(',')]
# print(f"Parsed data for new disease: {disease_name}, {disease_description}, {disease_precautions}, {new_symptoms}")
# # Check if disease name already exists
# disease_exists = False
# with open(os.path.join(engine.dataPath, 'disease-symptoms.clp'), "r") as f:
# for line in f:
# if f"(defrule {disease_name}" in line:
# disease_exists = True
# break
# if disease_exists:
# return jsonify({
# 'status': 'error',
# 'message': f"Disease '{disease_name.replace('_', ' ')}' already exists."
# })
# # Check if any new symptom already exists in symptoms.txt
# existing_symptoms = engine.getSymptomList() # Retrieve existing symptoms
# for symptom in new_symptoms:
# if symptom.strip().replace(' ', '_').lower() in existing_symptoms:
# return jsonify({
# 'status': 'error',
# 'message': f"Symptom '{symptom.strip()}' already exists."
# })
# # Update symptoms.txt
# with open(os.path.join(engine.dataPath, 'symptoms.txt'), "a") as f:
# for symptom in new_symptoms:
# f.write(f"{symptom.strip()},\n")
# # Update disease-description.csv
# with open(os.path.join(engine.dataPath, 'disease-description.csv'), "a") as f:
# f.write(f"{disease_name.replace('_', ' ')},{disease_description}\n")
# # Update disease-precaution.csv
# with open(os.path.join(engine.dataPath, 'disease-precaution.csv'), "a") as f:
# f.write(f"{disease_name.replace('_', ' ')},{','.join(disease_precautions)}\n")
# # Update disease-symptoms.clp
# with open(os.path.join(engine.dataPath, 'disease-symptoms.clp'), "a") as f:
# f.write(f"\n(defrule {disease_name}\n")
# f.write(f" (disease_is {disease_name})\n")
# f.write(f" =>\n")
# f.write(f" (printout t \"{disease_name.replace('_', ' ')}\" crlf)\n")
# f.write(f")\n")
# f.write(f"\n(defrule is_it_{disease_name}\n")
# for symptom in new_symptoms:
# f.write(f" (has_symptom {symptom.strip().replace(' ', '_').lower()})\n")
# f.write(f" =>\n")
# f.write(f" (assert (disease_is {disease_name}))\n")
# f.write(f")\n")
# # Reload the CLIPS environment
# engine.prepare()
# return jsonify({
# 'status': 'success'
# })
# except ValueError as ve:
# print(f"ValueError: {str(ve)}")
# return jsonify({
# 'status': 'error',
# 'message': str(ve)
# }), 400
# except json.JSONDecodeError:
# return jsonify({
# 'status': 'error',
# 'message': 'Failed to decode JSON object'
# }), 400
# except Exception as e:
# print(f"Error adding disease: {str(e)}") # Log the error for debugging
# return jsonify({
# 'status': 'error',
# 'message': f"Error adding disease: {str(e)}"
# }), 500
# @app.route('/diagnose', methods=['POST'])
# def diagnose():
# engine.reset()
# data = request.get_data(as_text=True)
# try:
# data = json.loads(data)
# for symptom in data['symptoms']:
# symptom = symptom.replace(' ', '_').lower()
# engine.addSymptom(symptom)
# engine.run()
# diseases = engine.getDiseases()
# return jsonify({
# 'status': 'success',
# 'diseases': info.detail(diseases)
# })
# except:
# return jsonify({
# 'status': 'error'
# })
# Working:
# @app.route('/diagnose', methods=['POST'])
# def diagnose():
# engine.reset()
# data = request.get_data(as_text=True)
# print(f"Received diagnose data: {data}")
# try:
# data = json.loads(data)
# for symptom in data['symptoms']:
# symptom = symptom.replace(' ', '_').lower()
# engine.addSymptom(symptom)
# engine.run()
# diseases = engine.getDiseases()
# if not diseases:
# return jsonify({
# 'status': 'success',
# 'diseases': [],
# 'message': 'No diseases detected, please add more symptoms.'
# })
# return jsonify({
# 'status': 'success',
# 'diseases': info.detail(diseases)
# })
# except Exception as e:
# print(f"Error during diagnosis: {str(e)}") # Log the error for debugging
# return jsonify({
# 'status': 'error',
# 'message': f"Error during diagnosis: {str(e)}"
# })
# # newScript
@app.route('/diagnose', methods=['POST'])
def diagnose():
engine.reset()
try:
data = request.get_json() # Use get_json() to parse JSON data
symptoms = data['symptoms']
for symptom in symptoms:
symptom = symptom.replace(' ', '_').lower()
engine.addSymptom(symptom)
engine.run()
diseases = engine.getDiseases()
if not diseases:
return jsonify({
'status': 'success',
'diseases': [],
'message': 'No diseases detected, please add more symptoms.'
})
return jsonify({
'status': 'success',
'diseases': info.detail(diseases)
})
except Exception as e:
print(f"Error during diagnosis: {str(e)}")
return jsonify({
'status': 'error',
'message': f"Error during diagnosis: {str(e)}"
})
if __name__ == '__main__':
app.run(debug=True, host='0.0.0.0', port=5000)
Editor is loading...
Leave a Comment