| | --- |
| | license: openrail |
| | --- |
| | from transformers import pipeline, AutoTokenizer, AutoModelForSeq2SeqLM |
| | from healthcare_nlp import Diseases, SNOMEDCT |
| | from healthcare_nlp.preprocessing import de_identify_text |
| |
|
| | # Disease selection and model configuration |
| | disease_name = input("Enter a disease name (e.g., 'diabetes'): ").lower() |
| | disease_concept = SNOMEDCT.query_concept(disease_name) |
| | model_name = "allenai/biobert-base-cased" # Clinically-tuned BioBERT model |
| | |
| | # Prepare user profile and tokenizer |
| | user_profile = {"age": int(input("Enter your age: "))} |
| | tokenizer = AutoTokenizer.from_pretrained(model_name) |
| |
|
| | # Access and process user message |
| | user_message = input("Ask your question about " + disease_concept.preferred_term + ": ") |
| | deidentified_message = de_identify_text(user_message) # Protect sensitive information |
| | |
| | # Generate response with model and personalization |
| | model = AutoModelForSeq2SeqLM.from_pretrained(model_name) |
| | inputs = tokenizer(deidentified_message, truncation=True, padding="max_length", return_tensors="pt") |
| | generated_ids = model.generate(**inputs, max_length=256) |
| | response = tokenizer.decode(generated_ids.squeeze(), clean_up_tokenization=True) |
| | |
| | # Enhance response with knowledge base and context |
| | knowledge_base = Diseases.load_disease_info(disease_concept.concept_id) |
| | response = personalize_response(response, disease_concept, user_message, user_profile, knowledge_base) |
| | |
| | # Conclude with informative disclaimer |
| | response += ( |
| | "\nFeel free to ask any further questions you might have. I am still under development, but I leverage " |
| | "clinical knowledge and continuous learning to provide accurate and evidence-based information. " |
| | "Remember, I am not a substitute for professional healthcare advice. Please consult your doctor " |
| | "for diagnosis and treatment decisions." |
| | ) |
| | |
| | print(response) |
| | |
| | def personalize_response(response, disease_concept, user_message, user_profile, knowledge_base): |
| | # Highlight relevant knowledge base sections |
| | for key, value in knowledge_base.items(): |
| | if key.lower() in user_message.lower(): |
| | response += f"\nRegarding your query about {key}, here's some relevant information: {value}" |
| | |
| | # Adapt response based on disease complexity and user age |
| | response = personalize_with_disease_complexity(response, disease_concept) |
| | response = personalize_with_user_age(response, user_profile) |
| | |
| | # Add medical references and adjust communication style based on user preferences |
| | if user_profile["age"] >= 18 and user_profile["preferred_communication_style"] == "informative": |
| | response = add_informative_details(response, knowledge_base) |
| | elif user_profile["age"] >= 18 and user_profile["preferred_communication_style"] == "empathetic": |
| | # Implement empathetic communication style here (e.g., acknowledge feelings, offer support) |
| | pass |
| | else: |
| | # Use simpler language and avoid overwhelming details for younger users or non-informative preferences |
| | pass |
| | |
| | # Re-identify anonymized terms for clinical context (optional) |
| | # response = re_identify_text(response, knowledge_base) |
| | |
| | return response |
| | |
| | # Personalize response with disease complexity |
| | def personalize_with_disease_complexity(response, disease_concept): |
| | if "complex" in disease_concept.description.lower(): |
| | response += f"\nPlease note that {disease_concept.preferred_term} is a complex condition. My information offers a starting point, not a definitive explanation. Consult your doctor for a comprehensive understanding." |
| | return response |
| | |
| | # Personalize response with user age |
| | def personalize_with_user_age(response, user_profile): |
| | if user_profile["age"] < 18: |
| | response += f"\nAs you're under 18, it's crucial to involve your parents or guardians in managing your health and seeking professional guidance." |
| | return response |
| | |
| | # Add medical references or implement different communication styles here based on user preferences |
| | |
| | # Re-identify anonymized terms with caution, considering ethical implications and potential bias. |
| | |
| | This version enhances professionalism with: |
| | |
| | * **De-identification of user message:** Protects sensitive information while processing. |
| | * **Clinically-informed responses:** Tailored to disease complexity and user age. |
| | * ** |
| | |