def unlink_concept_name(self, cui, name, full_unlink=True): names = [name, name.lower()] # Unlink a concept from a name p_name, tokens, _, _ = get_all_from_name(name=name, source_value=name, nlp=self.nlp, version='clean') # Add the clean version of the name names.append(p_name) # Get the raw version p_name, tokens, _, _ = get_all_from_name(name=name, source_value=name, nlp=self.nlp, version='raw') # Append the raw evrsion names.append(p_name) if tokens[-1].lower() == "s": # Remove last 's' - a stupid bug names.append(p_name[0:-1]) for name in names: cuis = [cui] if full_unlink and name in self.cdb.name2cui: cuis = list(self.cdb.name2cui[name]) for cui in cuis: if cui in self.cdb.cui2names and name in self.cdb.cui2names[cui]: self.cdb.cui2names[cui].remove(name) if len(self.cdb.cui2names[cui]) == 0: del self.cdb.cui2names[cui] if name in self.cdb.name2cui: if cui in self.cdb.name2cui[name]: self.cdb.name2cui[name].remove(cui) if len(self.cdb.name2cui[name]) == 0: del self.cdb.name2cui[name]
def unlink_concept_name(self, cui, name, full_unlink=True): r''' Unlink a concept name from the CUI (or all CUIs if full_unlink), removes the link from the Concept Database (CDB). As a consequence medcat will never again link the `name` to this CUI - meaning the name will not be detected as a concept in the future. Args: cui (str): The CUI from which the `name` will be removed name (str): The span of text to be removed from the linking dictionary full_unlink (boolean): If True, the `name` will not only be removed from the given `cui` but from each concept in the database that is associated with this name. Examples: >>> # To never again link C0020538 to HTN >>> cat.unlink_concept_name('C0020538', 'htn', False) ''' names = [name, name.lower()] # Unlink a concept from a name p_name, tokens, _, _ = get_all_from_name(name=name, source_value=name, nlp=self.nlp, version='clean') # Add the clean version of the name names.append(p_name) # Get the raw version p_name, tokens, _, _ = get_all_from_name(name=name, source_value=name, nlp=self.nlp, version='raw') # Append the raw evrsion names.append(p_name) if tokens[-1].lower() == "s": # Remove last 's' - a stupid bug names.append(p_name[0:-1]) for name in names: cuis = [cui] if full_unlink and name in self.cdb.name2cui: cuis = list(self.cdb.name2cui[name]) for cui in cuis: if cui in self.cdb.cui2names and name in self.cdb.cui2names[ cui]: self.cdb.cui2names[cui].remove(name) if len(self.cdb.cui2names[cui]) == 0: del self.cdb.cui2names[cui] if name in self.cdb.name2cui: if cui in self.cdb.name2cui[name]: self.cdb.name2cui[name].remove(cui) if len(self.cdb.name2cui[name]) == 0: del self.cdb.name2cui[name]
def add_concept(self, concept, text=None, tkn_inds=None): cui = concept['cui'] onto = concept.get('onto', 'user') pretty_name = concept['name'] source_value = concept['source_value'] name, tokens, snames, tokens_vocab = get_all_from_name( name=pretty_name, source_value=source_value, nlp=self.nlp) tui = concept.get('tui', 'None') unique = True # Add the new concept self.cdb.add_concept(cui, name, onto, tokens, snames, tui=tui, pretty_name=pretty_name, is_pref_name=True, tokens_vocab=tokens_vocab, unique=unique, original_name=source_value) if tkn_inds and text: # Add the context self.add_concept_cntx(cui, text, tkn_inds)
def _add_name(self, cui, source_val, is_pref_name, only_new=False, desc=None, tui=None): onto = 'def' all_cuis = [] if cui in self.cdb.cui2ontos and self.cdb.cui2ontos[cui]: onto = list(self.cdb.cui2ontos[cui])[0] # Add the original version of the name just lowercased p_name, tokens, snames, tokens_vocab = get_all_from_name(name=source_val, source_value=source_val, nlp=self.nlp, version='none') if cui not in self.cdb.cui2names or p_name not in self.cdb.cui2names[cui]: if not only_new or p_name not in self.cdb.name2cui: self.cdb.add_concept(cui, p_name, onto, tokens, snames, tokens_vocab=tokens_vocab, original_name=source_val, is_pref_name=False, desc=desc, tui=tui) all_cuis.extend(self.cdb.name2cui[p_name]) p_name, tokens, snames, tokens_vocab = get_all_from_name(name=source_val, source_value=source_val, nlp=self.nlp, version='clean') # This will add a new concept if the cui doesn't exist # or link the name to an existing concept if it exists. if cui not in self.cdb.cui2names or p_name not in self.cdb.cui2names[cui]: if not only_new or p_name not in self.cdb.name2cui: self.cdb.add_concept(cui, p_name, onto, tokens, snames, tokens_vocab=tokens_vocab, original_name=source_val, is_pref_name=False, desc=desc, tui=tui) all_cuis.extend(self.cdb.name2cui[p_name]) # Add the raw also if needed p_name, tokens, snames, tokens_vocab = get_all_from_name(name=source_val, source_value=source_val, nlp=self.nlp, version='raw') if cui not in self.cdb.cui2names or p_name not in self.cdb.cui2names[cui] or is_pref_name: if not only_new or p_name not in self.cdb.name2cui: self.cdb.add_concept(cui, p_name, onto, tokens, snames, tokens_vocab=tokens_vocab, original_name=source_val, is_pref_name=is_pref_name, desc=desc, tui=tui) all_cuis.extend(self.cdb.name2cui[p_name]) # Fix for ntkns in cdb if p_name in self.cdb.name2ntkns: if len(tokens) not in self.cdb.name2ntkns[p_name]: self.cdb.name2ntkns[p_name].add(len(tokens)) return list(set(all_cuis))
def _add_name(self, cui, source_val, is_pref_name, only_new=False): onto = 'def' if cui in self.cdb.cui2ontos and self.cdb.cui2ontos[cui]: onto = list(self.cdb.cui2ontos[cui])[0] p_name, tokens, snames, tokens_vocab = get_all_from_name(name=source_val, source_value=source_val, nlp=self.nlp, version='clean') # This will add a new concept if the cui doesn't exist #or link the name to an existing concept if it exists. if cui not in self.cdb.cui2names or p_name not in self.cdb.cui2names[cui]: if not only_new or p_name not in self.cdb.name2cui: self.cdb.add_concept(cui, p_name, onto, tokens, snames, tokens_vocab=tokens_vocab, original_name=source_val, is_pref_name=False) # Add the raw also if needed p_name, tokens, snames, tokens_vocab = get_all_from_name(name=source_val, source_value=source_val, nlp=self.nlp, version='raw') if cui not in self.cdb.cui2names or p_name not in self.cdb.cui2names[cui] or is_pref_name: if not only_new or p_name not in self.cdb.name2cui: self.cdb.add_concept(cui, p_name, onto, tokens, snames, tokens_vocab=tokens_vocab, original_name=source_val, is_pref_name=is_pref_name)
def add_name(self, cui, name): onto = 'def' if cui in self.cdb.cui2onto: onto = self.cdb.cui2onto[cui][0] p_name, tokens, snames, tokens_vocab = get_all_from_name( name=name, source_value=name, nlp=self.nlp) # This will add a new concept if the cui doesn't exist #or link the name to an existing concept if it exists. self.cdb.add_concept(cui, p_name, onto, tokens, snames, tokens_vocab=tokens_vocab, original_name=name)
def unlink_concept_name(self, cui, name): # Unlink a concept from a name p_name, _, _, _ = get_all_from_name(name=name, source_value=name, nlp=self.nlp) # To be sure unlink the orignal and the processed name names = [name, p_name] for name in names: if name in self.cdb.cui2names[cui]: self.cdb.cui2names[cui].remove(name) if len(self.cdb.cui2names[cui]) == 0: del self.cdb.cui2names[cui] if name in self.cdb.name2cui: if cui in self.cdb.name2cui[name]: self.cdb.name2cui[name].remove(cui) if len(self.cdb.name2cui[name]) == 0: del self.cdb.name2cui[name]
def _add_name(self, cui, source_val, is_pref_name, only_new=False, desc=None, tui=None): r''' Please do not use directly. This function will add a name to a CUI (existing or new). Args: cui (str): The CUI to which to add the name source_val (str): The `name` or span or source_value that will be linked to the cui is_pref_name (boolean): Is this source_val the prefered `name` for this CUI (concept) only_new (bool): Only add the name if it does not exist in the current CDB and is not linked to any concept (CUI) in the current CDB. desc (str): Description for this concept tui (str): Semenantic Type identifer for this concept, should be a TUI that exisit in the current CDB. Have a look at cdb.tui2names - for a list of all existing TUIs in the current CDB. Examples: Do not use. ''' onto = 'def' all_cuis = [] if cui in self.cdb.cui2ontos and self.cdb.cui2ontos[cui]: onto = list(self.cdb.cui2ontos[cui])[0] # Add the original version of the name just lowercased p_name, tokens, snames, tokens_vocab = get_all_from_name( name=source_val, source_value=source_val, nlp=self.nlp, version='none') if cui not in self.cdb.cui2names or p_name not in self.cdb.cui2names[ cui]: if not only_new or p_name not in self.cdb.name2cui: self.cdb.add_concept(cui, p_name, onto, tokens, snames, tokens_vocab=tokens_vocab, original_name=source_val, is_pref_name=False, desc=desc, tui=tui) all_cuis.extend(self.cdb.name2cui[p_name]) p_name, tokens, snames, tokens_vocab = get_all_from_name( name=source_val, source_value=source_val, nlp=self.nlp, version='clean') # This will add a new concept if the cui doesn't exist # or link the name to an existing concept if it exists. if cui not in self.cdb.cui2names or p_name not in self.cdb.cui2names[ cui]: if not only_new or p_name not in self.cdb.name2cui: self.cdb.add_concept(cui, p_name, onto, tokens, snames, tokens_vocab=tokens_vocab, original_name=source_val, is_pref_name=False, desc=desc, tui=tui) all_cuis.extend(self.cdb.name2cui[p_name]) # Add the raw also if needed p_name, tokens, snames, tokens_vocab = get_all_from_name( name=source_val, source_value=source_val, nlp=self.nlp, version='raw') if cui not in self.cdb.cui2names or p_name not in self.cdb.cui2names[ cui] or is_pref_name: if not only_new or p_name not in self.cdb.name2cui: self.cdb.add_concept(cui, p_name, onto, tokens, snames, tokens_vocab=tokens_vocab, original_name=source_val, is_pref_name=is_pref_name, desc=desc, tui=tui) all_cuis.extend(self.cdb.name2cui[p_name]) # Fix for ntkns in cdb if p_name in self.cdb.name2ntkns: if len(tokens) not in self.cdb.name2ntkns[p_name]: self.cdb.name2ntkns[p_name].add(len(tokens)) return list(set(all_cuis))