static void UploadMedicalEntities(MedicalEntities medicaEntities, string id) { // Upload the specified entity to Azure Search // Note it is much more efficient to upload content in batches // Convert Concept ID's to actual Concept names var MedicationMentionNames = new List <string>(); var AnatomicalSiteNames = new List <string>(); var DiseaseDisorderNames = new List <string>(); var SignSymptomNames = new List <string>(); foreach (var concept in medicaEntities.MedicationMentionConceptList.Select(x => x.ontologyConcept).Distinct()) { MedicationMentionNames.Add(medicaEntities.ConceptNameDictionary.Where(x => x.Key == Convert.ToInt32(concept)).First().Value); } foreach (var concept in medicaEntities.AnatomicalSiteMentionConceptList.Select(x => x.ontologyConcept).Distinct()) { AnatomicalSiteNames.Add(medicaEntities.ConceptNameDictionary.Where(x => x.Key == Convert.ToInt32(concept)).First().Value); } foreach (var concept in medicaEntities.DiseaseDisorderConceptList.Select(x => x.ontologyConcept).Distinct()) { DiseaseDisorderNames.Add(medicaEntities.ConceptNameDictionary.Where(x => x.Key == Convert.ToInt32(concept)).First().Value); } foreach (var concept in medicaEntities.SignSymptomMentionConceptList.Select(x => x.ontologyConcept).Distinct()) { SignSymptomNames.Add(medicaEntities.ConceptNameDictionary.Where(x => x.Key == Convert.ToInt32(concept)).First().Value); } try { var uploadBatch = new List <IndexSchema>(); var indexDoc = new IndexSchema(); // Get the key value so that we can merge content with the existing content // The key is a url token encoding of the path (e.g. https://azsdemos.blob.core.windows.net/medical-tutorial/nihms637915.pdf) //file = MedicalStorage + file.Substring(file.LastIndexOf("\\") + 1); //indexDoc.metadata_storage_path = HttpServerUtility.UrlTokenEncode(Encoding.UTF8.GetBytes(file)); indexDoc.id = id; indexDoc.medical_mentions = medicaEntities.MedicationMentionList.Select(x => x.term).Distinct().ToArray(); indexDoc.medical_mention_concepts = MedicationMentionNames.Distinct().ToArray(); indexDoc.sign_symptoms = medicaEntities.SignSymptomMentionList.Select(x => x.term).Distinct().ToArray(); indexDoc.sign_symptom_concepts = SignSymptomNames.Distinct().ToArray(); indexDoc.anatomical_sites = medicaEntities.AnatomicalSiteMentionList.Select(x => x.term).Distinct().ToArray(); indexDoc.anatomical_site_concepts = AnatomicalSiteNames.Distinct().ToArray(); indexDoc.disease_disorders = medicaEntities.DiseaseDisorderList.Select(x => x.term).Distinct().ToArray(); indexDoc.disease_disorder_concepts = DiseaseDisorderNames.Distinct().ToArray(); indexDoc.nihii = "87051718996"; uploadBatch.Add(indexDoc); var batch = IndexBatch.MergeOrUpload(uploadBatch); indexClient.Documents.Index(batch); uploadBatch.Clear(); } catch (Exception ex) { Console.WriteLine(ex.Message); } }
static MedicalEntities ProcessDoc(string text) { var medicalEntities = new MedicalEntities(); medicalEntities.DiseaseDisorderList = new List <Term>(); medicalEntities.MedicationMentionList = new List <Term>(); medicalEntities.SignSymptomMentionList = new List <Term>(); medicalEntities.AnatomicalSiteMentionList = new List <Term>(); medicalEntities.DiseaseDisorderConceptList = new List <OntologyConcept>(); medicalEntities.MedicationMentionConceptList = new List <OntologyConcept>(); medicalEntities.SignSymptomMentionConceptList = new List <OntologyConcept>(); medicalEntities.AnatomicalSiteMentionConceptList = new List <OntologyConcept>(); medicalEntities.ConceptNameDictionary = new Dictionary <int, string>(); try { var request = (HttpWebRequest)WebRequest.Create(url); // Take a max of X KB of text var subText = text.Substring(0, Math.Min(20480, text.Length)); var postData = "q=" + subText; postData += "&format=" + format; postData += "¨suser="******"¨spw=" + umlspw; var data = Encoding.ASCII.GetBytes(postData); request.Method = "POST"; request.ContentType = "application/x-www-form-urlencoded"; request.ContentLength = data.Length; request.Timeout = 20 * 60 * 1000; // 20 min using (var stream = request.GetRequestStream()) { stream.Write(data, 0, data.Length); } var response = (HttpWebResponse)request.GetResponse(); var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd(); if (responseString != "") { XmlDocument xml = new XmlDocument(); xml.LoadXml(responseString); string parsedText = ""; int begin, end; Guid termId; foreach (var node in xml.ChildNodes[1]) { //Sofa if (((System.Xml.XmlElement)node).LocalName == "Sofa") { parsedText = ((XmlElement)node).GetAttribute("sofaString"); } else if (((System.Xml.XmlElement)node).LocalName == "UmlsConcept") { medicalEntities.ConceptNameDictionary[Convert.ToInt32(((XmlElement)node).GetAttribute("xmi:id"))] = ((XmlElement)node).GetAttribute("preferredText"); } else if (((System.Xml.XmlElement)node).LocalName == "DiseaseDisorderMention") { begin = Convert.ToInt32(((XmlElement)node).GetAttribute("begin")); end = Convert.ToInt32(((XmlElement)node).GetAttribute("end")); if (!(medicalEntities.DiseaseDisorderList.Any(t => t.term == parsedText.Substring(begin, end - begin).ToLower()))) { termId = Guid.NewGuid(); medicalEntities.DiseaseDisorderList.Add(new Term { termId = termId, term = parsedText.Substring(begin, end - begin).ToLower(), }); var ontologyConceptArray = ((XmlElement)node).GetAttribute("ontologyConceptArr").ToString(); if (ontologyConceptArray.Length > 0) { foreach (var c in ontologyConceptArray.Split(' ')) { medicalEntities.DiseaseDisorderConceptList.Add(new OntologyConcept { conceptId = Guid.NewGuid(), termId = termId, ontologyConcept = c }); } } } } else if (((System.Xml.XmlElement)node).LocalName == "MedicationMention") { begin = Convert.ToInt32(((XmlElement)node).GetAttribute("begin")); end = Convert.ToInt32(((XmlElement)node).GetAttribute("end")); if (!(medicalEntities.MedicationMentionList.Any(t => t.term == parsedText.Substring(begin, end - begin).ToLower()))) { termId = Guid.NewGuid(); medicalEntities.MedicationMentionList.Add(new Term { termId = termId, term = parsedText.Substring(begin, end - begin).ToLower() }); var ontologyConceptArray = ((XmlElement)node).GetAttribute("ontologyConceptArr").ToString(); if (ontologyConceptArray.Length > 0) { foreach (var c in ontologyConceptArray.Split(' ')) { medicalEntities.MedicationMentionConceptList.Add(new OntologyConcept { conceptId = Guid.NewGuid(), termId = termId, ontologyConcept = c }); } } } } else if (((System.Xml.XmlElement)node).LocalName == "SignSymptomMention") { begin = Convert.ToInt32(((XmlElement)node).GetAttribute("begin")); end = Convert.ToInt32(((XmlElement)node).GetAttribute("end")); if (!(medicalEntities.SignSymptomMentionList.Any(t => t.term == parsedText.Substring(begin, end - begin).ToLower()))) { termId = Guid.NewGuid(); medicalEntities.SignSymptomMentionList.Add(new Term { termId = termId, term = parsedText.Substring(begin, end - begin).ToLower() }); var ontologyConceptArray = ((XmlElement)node).GetAttribute("ontologyConceptArr").ToString(); if (ontologyConceptArray.Length > 0) { foreach (var c in ontologyConceptArray.Split(' ')) { medicalEntities.SignSymptomMentionConceptList.Add(new OntologyConcept { conceptId = Guid.NewGuid(), termId = termId, ontologyConcept = c }); } } } } else if (((System.Xml.XmlElement)node).LocalName == "AnatomicalSiteMention") { begin = Convert.ToInt32(((XmlElement)node).GetAttribute("begin")); end = Convert.ToInt32(((XmlElement)node).GetAttribute("end")); if (!(medicalEntities.AnatomicalSiteMentionList.Any(t => t.term == parsedText.Substring(begin, end - begin).ToLower()))) { termId = Guid.NewGuid(); medicalEntities.AnatomicalSiteMentionList.Add(new Term { termId = termId, term = parsedText.Substring(begin, end - begin).ToLower() }); var ontologyConceptArray = ((XmlElement)node).GetAttribute("ontologyConceptArr").ToString(); if (ontologyConceptArray.Length > 0) { foreach (var c in ontologyConceptArray.Split(' ')) { medicalEntities.AnatomicalSiteMentionConceptList.Add(new OntologyConcept { conceptId = Guid.NewGuid(), termId = termId, ontologyConcept = c }); } } } } } } } catch (Exception ex) { Console.WriteLine(ex.Message); } return(medicalEntities); }