# -*- coding: utf-8 -*- import re import spacy import textacy import xml.etree.ElementTree as ET DATAPATH_thesaurus = "openthesaurus.csv" def generateFromXML(path2xml, clean=True, textfield='Beschreibung'): import xml.etree.ElementTree as ET tree = ET.parse(path2xml, ET.XMLParser(encoding="utf-8")) root = tree.getroot() for ticket in root: metadata = {} text = "ERROR" for field in ticket: if field.tag == textfield: if clean: text = (field.text) else: text = field.text else: metadata[field.tag] = field.text yield text, metadata def getFirstSynonym(word, thesaurus_gen): word = word.lower() # TODO word cleaning https://stackoverflow.com/questions/3939361/remove-specific-characters-from-a-string-in-python # durch den thesaurrus iterieren for syn_block in thesaurus_gen: # syn_block ist eine liste mit Synonymen # durch den synonymblock iterieren for syn in syn_block: syn = syn.lower().split(" ") if not re.match(r'\A[\w-]+\Z', syn) else syn # aus synonym mach liste (um evtl. sätze zu identifieziren) # falls das wort in dem synonym enthalten ist (also == einem Wort in der liste ist) if word in syn: # Hauptform suchen if "Hauptform" in syn: # nicht ausgeben, falls es in Klammern steht for w in syn: if not re.match(r'\([^)]+\)', w) and w is not None: return w # falls keine hauptform enthalten ist, das erste Synonym zurückgeben, was kein satz ist und nicht in klammern steht if len(syn) == 1: w = syn[0] if not re.match(r'\([^)]+\)', w) and w is not None: return w return word # zur Not die eingabe ausgeben def getFirstSynonym(word, thesaurus_gen): word = word.lower() # TODO word cleaning https://stackoverflow.com/questions/3939361/remove-specific-characters-from-a-string-in-python # durch den thesaurrus iterieren for syn_block in thesaurus_gen: # syn_block ist eine liste mit Synonymen for syn in syn_block: if re.match(r'\A[\w-]+\Z', syn): #falls syn einzelwort ist if word == syn: getHauptform(syn_block) def getHauptform(syn_block): for s in syn_block: if "Hauptform" in s: # nicht ausgeben, falls es in Klammern steht for w in s: if not re.match(r'\([^)]+\)', w) and w is not None: return w # falls keine hauptform enthalten ist, das erste Synonym zurückgeben, was kein satz ist und nicht in klammern steht if len(s) == 1: w = s[0] if not re.match(r'\([^)]+\)', w) and w is not None: return w strings = ["passwort",""] THESAURUS_gen = textacy.fileio.read_csv(DATAPATH_thesaurus, delimiter=";") # generator [[a,b,c,..],[a,b,c,..],...] for s in strings: print(getFirstSynonym(s,THESAURUS_gen))