topicModelingTickets/test.py

1436 lines
70 KiB
Python
Raw Normal View History

2017-12-08 11:06:07 +01:00
"""
2017-11-17 11:46:57 +01:00
import matplotlib
matplotlib.use('Agg')
2017-11-17 11:46:57 +01:00
import textacy
2017-11-17 11:46:57 +01:00
import numpy as np
import json
import os.path
import subprocess
from textacy import Vectorizer, viz
2017-11-17 11:46:57 +01:00
from scipy import *
2017-11-06 12:54:59 +01:00
import json
2017-11-17 11:46:57 +01:00
import draw
2017-12-08 11:06:07 +01:00
"""
import os
import time
start = time.time()
from gensim.models import Doc2Vec
import textacy
FILEPATH = os.path.dirname(os.path.realpath(__file__)) + "/"
from miscellaneous import *
import re
dict = {"benutzer zum redmine hinzufuegen": 0, "sd_outlook anmeldung gestoert": 131, "sap portal \"im anderen modus geoeffnet\"": 1, "uni card": 79, "sd_verlust/antrag unicard": 2, "sd_citavi bestellung": 3, "fehlender eintrag im elektronischen telefonbuch": 4, "sd_origin_workaround": 80, "sd_kurs-angebote anmeldung": 141, "ub_drucker kopierer": 82, "sd_itmc kurse anmeldebestaetigung": 66, "sd_unicard_gesperrte unicard entsperre": 6, "ub_unicard_abholungszeiten": 7, "bd_unicard_nicht_eingeschrieben": 8, "ub_prod_namenskorrektur_student": 149, "sd_outlook_in_exchange_einbinden": 84, "sd_tu-app feedback standard": 10, "sd_account_abmelden": 77, "sd_gmx_web.de": 87, "bd_unicard_chip_defekt": 11, "sd_antrag funktionale mailadresse": 88, "sd_login tu portals english": 142, "sd_falsche_personendaten": 90, "sd_vpn_aktualisierung": 12, "ub_namensaenderung": 111, "studierendenausweis": 13, "re: elektroarbeiten fuer leitsystem 2. und 3. obergeschoss": 14, "sd_vpn_webvpn": 15, "spam ohne tu bezug": 92, "ungueltiges ticket siehe journal": 123, "sd_heirat_namensaenderung_student": 122, "sd_telefonbuch, neues system": 16, "sd_diensthandy beschaffung": 94, "sd_telefonantrag_aenderung_neuantrag": 95, "sd_uniaccount_ehemalige_passwortaenderung": 17, "sd_plotauftrag_zv": 18, "ohne betreff": 19, "wlan": 97, "sd-e-mail_adresse_funktional_beantragen": 98, "sd_unimail zu exchange": 21, "sd_citavi": 99, "transportdurchfuehung": 100, "ub_prod_neue unicard bei beschaedigung": 101, "sd_wlan passwort englisch": 22, "sd_semesterticket": 103, "sd_pruefungsamt": 104, "sd_uniaccount freischaltung verzoegert englisch": 23, "sd_uniaccount_passwortaenderung": 140, "sd_telefon (antrag: neuanschluss, umzug, aenderung erledigt)": 105, "sd_tu-app feedback_englisch": 24, "sd_uniaccount_ehemalige_studierende": 107, "ub_prod_abholung_ abholfristen_benachrichtigungen": 25, "sd_stellenausschreibung schwarzes brett": 26, "sd_tu_app_keine internetverbindung": 27, "sd_uniaccount activation englisch": 28, "sd_aktivierung uniaccount": 108, "ub_unicard_zusendung der karte moeglich?": 132, "einrichtung des eduroam netzwerks": 29, "unicard nochmal beantragen": 30, "sd_webmailer_thread-anzeige": 5, "sd_mail_als_anhang": 31, "m42_dokumentationen_zu_neuen_ous": 32, "vpn verbindung fuer unitymedia kunden": 33, "sd_beantragung_unicard": 20, "sd_unicard_defekt": 83, "sd_asknet_mitarbeiter_softwarebestellung": 34, "sd_spss_online_bestellung": 109, "sd_webmailer einrichtung weiterleitung": 9, "sd_unicard_max_laufzeit": 35, "sd_office 356 plus bestellung": 81, "vpn_ipsec_stoerung": 36, "sd_telefonbuch-eintrag_aenderung": 37, "sd_geraeteausleihe": 125, "bd_unicard_geldkarte_laden": 112, "unicard_restbetrag_auszahlung": 113, "apps_redmine_repository": 114, "windows 10": 78, "sd_antwort_phishingmail": 110, "sd_gastaufenthalter": 38, "sd_matlab lizenzdatei pc-pools": 39, "sd_wlan passwort setzen": 40, "sd_sap_initialkennwort": 41, "sd_sap_konteneinsicht_ workaround": 119, "sd_office365_asknet": 118, "bd_unicard_freigabe_beantragung": 42, "sd_internationaloffice": 43, "sd_kurs-angebote itmc": 153, "sd_asknet_und_dreamspark": 102, "cm_lsf-boss_freischaltung": 116, "sd_unicard fehlerhafte geldbuchung": 44, "sd_office 365 plus support": 45, "citavi_lizenzschluessel_nicht bekommen": 86, "sd_webmailer_threadanzeige und weiterleitung": 121, "sd_boss_notenverbuchung": 47, "sd_namensaenderung_englisch": 48, "sd_sap_freischaltung ohne passwortaenderung": 49, "sd_outlook kontakte automatische aktualisierung": 124, "sd_fk9 test": 50, "sd_sophos download": 51, "apps_dms_d.3 client installation/login d.3 funktioniert nicht": 52, "sd_sap_firefox_esr": 127, "sd_unicard_workaround_bestellung": 128, "sd_vpn anleitungen": 53, "probleme mit unicard": 89, "sd_wlan_beratung": 129, "sd_login_tu_portale": 130, "problem mit der beantragung von der unicard": 150, "sd_unicard_abholung": 54, "ub_beschaedigte unicard": 120, "sd_uniaccount_dauer freischaltung": 96, "sd_freischaltung uniaccount verzoegert": 133, "sd_unimail imap_pop3": 134, "change produktiv nehmen chn00146 - transport e01k909284": 135, "sd_bo
print(str(dict.keys()))
model = Doc2Vec.load("item_document_vectors")
nost_sim = model.most_similar("pregnant")
parser = spacy.load("de")
wtf = parser("Hallo Stefan,\r\neinmal zur Kenntnisnahme\r\nGruß Enrico\r\n \r\n \r\nSehr geehrter Herr Engelmann,\r\nes kann keine Lösung sein, auf das alte Passwort zurückzugreifen, wenn wir\r\ndienstlich aufgefordert waren es zu ändern.\r\nEben habe ich mit dem ITMC-Servive telefoniert. Mir wurde erklärt, dass\r\ndas Passwort in den Thunderbird-Kontoeinstellungen geändert werden muss\r\nund kann. Wenn ich wieder im Büro bin (leider in der vorlesungsfreien Zeit\r\nnie am Di oder Do), probiere ich aus, ob ich das selber hinbekomme.\r\nAllerdings verstehe ich nicht, warum vor dem großen Server-Absturz von\r\nneulich alles problemlos mit meinem neuen Passwort funktioniert hatte.\r\nDas Problem mit dem Einloggen in SAP war unabhängig davon und ist dank des\r\nTelefonats mit dem ITMC-Service gelöst.\r\nMit besten Grüßen, Brigitte Falkenburg\r\n \r\n \r\n> Sehr geehrte Frau Falkenburd,\r\n> ich freue mich, dass es jetzt erstmal wieder bei Ihnen funktioniert und\r\nbedanke mich für die Rückmeldung.\r\n> Ich hoffe durch Ihre Vorgehensweise kann das Problem nun auch bei\r\nanderen Kollegen gelöst werden.\r\n> mit freundlichen Grüßen\r\n> Björn Engelmann\r\n> Am 12.08.2015 um 14:47 schrieb Prof. Dr. Dr. Brigitte Falkenburg:\r\n>> Lieber Herr Engelmann, liebes ITMC Service Team,\r\n>> nachdem ich mich auch in SAP für einen Antrag auf eine Dienstreise\r\nnicht einloggen konnte, habe ich mein Passwort auf das alte Passwort\r\nzurückgesetzt und die Thunderbird-Mail funktioniert wieder! Ob das\r\nSAP-Einloggen für den Dienstreisen-Antrag nun auch funktioniert, weiß\r\nich aber erst, wenn das Passwort im System für alle Dienste geändert\r\nwurde.\r\n>> Es ist allerdings ein Unding, dass nun offenbar keine Änderung des\r\nPassworts mehr möglich ist, ohne dass diverse IT-Dienste unzugänglich\r\nwerden. Bitte überprüfen Sie im ITMC diesen Sachverhalt. Das Problem\r\nwurde erst durch den großen Systemausfall vor einigen Wochen erzeugt,\r\nvorher hatte alles reibungslos funktioniert.\r\n>> Mit freundlichem Gruß, Brigitte Falkenburg")
content ="kenntnisnahme"
ressources_path = FILEPATH + "ressources/"
path2lemmadict = ressources_path + config.get("lemmatization","pickle_file")
LEMMAS = load_obj(path2lemmadict)
path2thesaurus_dict = ressources_path + config.get("thesaurus","pickle_file")
THESAURUS = load_obj(path2thesaurus_dict)
def getFirstSynonym(word, thesaurus=THESAURUS,n=3):
for i in range(n):
try:
word = thesaurus[word.lower()] if word.lower() in thesaurus.keys() else word.lower()
except:
print(word)
return word
def lemmatizeWord(word,lemma_dict=LEMMAS,n=3):
for i in range(n):
try:
word = lemma_dict[word.lower()] if word.lower() in lemma_dict.keys() else word.lower()
except:
print(word)
return word
parser = spacy.load("de")
obj1 = parser("passwort")
obj2 = parser("kennwort")
obj3 = parser("stuhl")
obj4 = parser("BOSS")
known_acro_defs = {"BOSS" : "bla bla bla", "SAP" : "lalal"}
print(textacy.extract.acronyms_and_definitions(obj4,known_acro_defs))
print(textacy.similarity.word2vec(obj1, obj2))
print(textacy.similarity.word2vec(obj1, obj3))
#todo ner von boss sap testen
test = "boss"
print(getFirstSynonym(test))
intab = "aeiou"
outtab = "12345"
trantab = str.maketrans(intab, outtab)
str = "this is string example....wow!!!"
print( str.translate(trantab))
import nltk, re
def truecase(text):
truecased_sents = [] # list of truecased sentences
# apply POS-tagging
tagged_sent = nltk.pos_tag([word.lower() for word in nltk.word_tokenize(text)])
# infer capitalization from POS-tags
normalized_sent = [w.capitalize() if t in ["NN","NNS"] else w for (w,t) in tagged_sent]
# capitalize first word in sentence
normalized_sent[0] = normalized_sent[0].capitalize()
# use regular expression to get punctuation right
pretty_string = re.sub(" (?=[\.,'!?:;])", "", ' '.join(normalized_sent))
return pretty_string
to_corr = "Sehr geehrtes ITMC Service Team, seit ein einiger Zeit scheint der Netzwerkanschluss eines Kollegen " \
"An das Intranet der BMP Mit der Dosennummer G1 303 04 12.05 G1 4 26-1 in Raum G1-426 nicht Mehr Zu funktionieren. " \
"Ich Wuerde Sie daher bitten diese Mail An den zustaendigen Kollegen weiterzuleiten," \
" Um Die Leitung Vielleicht Einmal Zu Pruefen. Des Weiteren haette Ich noch Eine Frage " \
"bezueglich der Moeglichkeit zur Nutzung Einer VPN Verbindung Aus unserem Intranet" \
" heraus Zu einem fremden Netzwerk. Dies ist zwar Ueber das WLAN-Netz moeglich, jedoch nicht Aus unserem Netzwerk heraus."
print(truecase(to_corr))
print("test".title())
noun_gen = textacy.fileio.read_file_lines("/home/jannis.grundmann/PycharmProjects/topicModelingTickets/ressources/nomen.txt")
noun2_gen = textacy.fileio.read_file_lines("/home/jannis.grundmann/PycharmProjects/topicModelingTickets/ressources/nomen2.txt")
nouns = []
for noun in noun_gen:
nouns.append(noun.title())
for noun in noun2_gen:
nouns.append(noun.title())
#textacy.fileio.write_file_lines((n.strip() for n in nouns),"/home/jannis.grundmann/PycharmProjects/topicModelingTickets/ressources/de_nouns.txt")
# load corpus
corpus_de_path = FILEPATH + config.get("de_corpus", "path")
2017-12-08 11:06:07 +01:00
rawCorpus_name = "de" + "_raw_ticket"
cleanCorpus_name = "de" + "_clean_ticket"
#rawCorpus, parser = load_corpus(corpus_name=rawCorpus_name, corpus_path=corpus_de_path)
#cleanCorpus, parser_ = load_corpus(corpus_name=cleanCorpus_name, corpus_path=corpus_de_path)
#for doc in rawCorpus:
# print(doc.text.split()[0:7])
2017-11-29 16:31:30 +01:00
#todo randomize corpus
2017-11-27 12:49:05 +01:00
2017-12-08 11:06:07 +01:00
# idee test von tagging zwischen cleaned und raw
parser = spacy.load("de")
corpus = textacy.Corpus(parser)
#rawdoc = rawCorpus.get(lambda x : x.metadata["TicketNumber"] == "INC40495")
#cleandoc = cleanCorpus.get(lambda x : x.metadata["TicketNumber"] == "INC40495")
clean = "sehr geehrte damen und herren, ich bitte um pruefung, ob und wie eine tu-email-adresse fuer einen honorarprofessor eingerichtet werden kann. herr prof. dr.-ing. klaus-guenter meng haelt seit etwa 1995 an der tu dortmund vorlesungen im bereich der satellitenkommunikation und satellitennavigation fakultaet elektrotechnik und informationstechnik . von etwa 1984 bis etwa 1988 war er auch wissenschaftlicher mitarbeiter am lehrstuhl hochfrequenztechnik der tu dortmund. seine vorlesungsthemen sind diesem lehrstuhl zugeordnet. eine eigenstaendige tu-email-adresse waere aeusserst hilfreich, um eine sinnvolle kommunikation mit studenten zu ermoeglichen und um auch andere hilfsmittel ews nutzen zu koennen. im sinne der corporate identity der tu waere das sicherlich sehr sinnvoll. die nutzung einer privaten oder geschaeftlichen email-adresse ist nicht nur aus diesen gruenden nicht gluecklich. mit freundlichen gruessen dirk schulz ------------------------------------------------------------------ pd dr.-ing. dirk schulz technische universitaet dortmund lehrstuhl fuer hochfrequenztechnik friedrich-woehler-weg 4 d-44227 dortmund tel.: 0231 755-3909 fax: 0231 755-4631 e-mail: dirk2.schulz@tu-dortmund.de mailto:dirk2.schulz@tu-dortmund.de ------------------------------------------------------------------"
raw = "Sehr geehrte Damen und Herren,\r\nich bitte um Prüfung, ob und wie eine TU-Email-Adresse für einen Honorarprofessor eingerichtet werden kann.\r\nHerr Prof. Dr.-Ing. Klaus-Günter Meng hält seit etwa 1995 an der TU Dortmund Vorlesungen im Bereich der Satellitenkommunikation und Satellitennavigation (Fakultät Elektrotechnik und Informationstechnik). Von etwa 1984 bis etwa 1988 war er auch wissenschaftlicher Mitarbeiter am Lehrstuhl Hochfrequenztechnik der TU Dortmund. Seine Vorlesungsthemen sind diesem Lehrstuhl zugeordnet.\r\nEine eigenständige TU-Email-Adresse wäre äußerst hilfreich, um eine sinnvolle Kommunikation mit Studenten zu ermöglichen und um auch andere Hilfsmittel (EWS) nutzen zu können. Im Sinne der \"Corporate Identity\" der TU wäre das sicherlich sehr sinnvoll. Die Nutzung einer privaten oder geschäftlichen Email-Adresse ist nicht nur aus diesen Gründen nicht glücklich.\r\nMit freundlichen Grüßen\r\nDirk Schulz\r\n \r\n \r\n \r\n------------------------------------------------------------------\r\n \r\n \r\nPD Dr.-Ing. Dirk Schulz\r\nTechnische Universität Dortmund\r\nLehrstuhl für Hochfrequenztechnik\r\nFriedrich-Wöhler-Weg 4\r\nD-44227 Dortmund\r\nTel.: 0231/755-3909\r\nFax: 0231/755-4631\r\nE-Mail: dirk2.schulz@tu-dortmund.de<mailto:dirk2.schulz@tu-dortmund.de>\r\n \r\n \r\n------------------------------------------------------------------"
test1 = "(Der Preis ist heiß.)"
test2 = "Der Preis ist heiß."
test3 = "Die abdichtete Regenrinne ist"
test4 = "Wir haben uns abarbeiten"
test5 = "Das Gebäude steht stabil"
test6 = "Das gebaeude steht stabil"
test7 = "Gr<EFBFBD><EFBFBD>e"
"<EFBFBD>"
ressources_path = FILEPATH + "ressources/"
path2wordsdict = ressources_path + config.get("spellchecking", "pickle_file")
WORDS = load_obj(path2wordsdict)
########################## Spellchecking ##########################################
# http://norvig.com/spell-correct.html
# http://wortschatz.uni-leipzig.de/en/download
"""
import re
def words(text): return re.findall(r'\w+', text.lower())
def P(word, N=sum(WORDS.values())):
"Probability of `word`."
return WORDS[word] / N
def correction(word):
"Most probable spelling correction for word."
return max(candidates(word), key=P)
def candidates(word):
"Generate possible spelling corrections for word."
return (known([word]) or known(edits1(word)) or known(edits2(word)) or [word])
def known(words):
"The subset of `words` that appear in the dictionary of WORDS."
return set(w for w in words if w in WORDS)
def edits1(word):
"All edits that are one edit away from `word`."
letters = 'abcdefghijklmnopqrstuvwxyz'
splits = [(word[:i], word[i:]) for i in range(len(word) + 1)]
deletes = [L + R[1:] for L, R in splits if R]
transposes = [L + R[1] + R[0] + R[2:] for L, R in splits if len(R) > 1]
replaces = [L + c + R[1:] for L, R in splits if R for c in letters]
inserts = [L + c + R for L, R in splits for c in letters]
return set(deletes + transposes + replaces + inserts)
def edits2(word):
"All edits that are two edits away from `word`."
return (e2 for e1 in edits1(word) for e2 in edits1(e1))
def autocorrectWord(word):
try:
return correction(word)
except:
return word
"""
to_corr = "------------------------ Urspr<70>ngliche Nachricht -------------------------\r\nBetreff: Universit<69>t Postfach-Quota <20>berschritten!\r\nVon: \"ITMC-ServiceDesk\" <erkj@ruc.dk>\r\nDatum: Mo, 25.04.2016, 20:18\r\nAn: heinke.kirzinger@tu-dortmund.de\r\n--------------------------------------------------------------------------\r\n\r\n Das Universit<69>t-Postfach-Quota\r\n<EFBFBD>berschritten hat die Grenze, k<>nnen\r\nSie m<>glicherweise nicht auf\r\nSenden/Empfangen e-Mails mehr. \r\n Bitte l<>schen Sie ein\r\nbeliebiges Element, das Sie nicht\r\nben<EFBFBD>tigen aus Ihrem Postfach und\r\nEntfernen der gel<65>schten Elemente\r\noder HIER ANMELDEN, damit wir die\r\nGr<EFBFBD><EFBFBD>e Ihrer Postfach.\r\n\r\nDas Amt des Inforamtion Sicherheit halten dies aktualisiert, wenn\r\nInformationen <20>ndern sollten, aber wir empfehlen allen Anwendern ihre\r\nAktualisierungen nach der erwarteten Version dieses Patches ausgef<65>hrt.\r\n\r\nMit freundlichen Gr<47><72>en\r\nIhr ITMC-SeviceDesk Team\r\n --\r\nTechnischen Universit<69>t Dortmund\r\nIT & Medien Centrum (ITMC)\r\nE-Mail: service.itmc@tu-dortmund.de\r\nInternet: itmc.tu-dortmund.de\r\n-------------------------\r\n\r\n\r\n <20> 2016, IT & Medien Centrum (ITMC)\r\n All rights reserved.\r\n\r\n"
to_correct = [
"Gr<EFBFBD><EFBFBD>en",
"ausgef<EFBFBD>hrt",
"k<EFBFBD>nnen",
"Universit<EFBFBD>t",
]
"""
#print(textacy.preprocess.unidecode(test7))
#print(textacy.preprocess.fix_bad_unicode(test7))
print(test7.encode('utf8').decode('utf8'))
print("<EFBFBD>".encode())
for elem in to_correct:
bytes = elem.replace("<EFBFBD>","ä")
#bytes = re.sub(r'<27>', "", bytes)
word = autocorrectWord(bytes)
print(word)
corpus.add_text(to_corr)
for doc in corpus:
for tok in doc:
bytes = tok.text.encode()
#text = bytes.Replace("\xef\xbf\xbd", "");
bytes = re.sub(r'\xef\xbf\xbd', "", bytes)
word = autocorrectWord(bytes.decode())
print(word)
"""
# idee autocorrect bei \xef\xbf\xbd
"""
Sehr', 'geehrte', 'Damen', 'und', 'Herren,',
['Liebes', 'ITMC-Team,', 'Leider', 'kann', 'ich', 'mich', 'nicht']
Hallo
Guten
['Lieber', 'Arbeiter:', 'Es', 'tut', 'mir', 'leid!', 'Heute']
lemmas und synonyme von : sehr, geehrt, damen, herren, liebe, hallo, guten tag/morgen/abend
"""
def cleaning(string):
# fixUnicode
string = textacy.preprocess.fix_bad_unicode(string, normalization=u'NFC')
# normalize whitespace
string = textacy.preprocess.normalize_whitespace(string)
# remove linebreaks
string = re.sub(r'[\n]', " ", string)
# replaceRockDots
string = re.sub(r'[ß]', "ss", string)
string = re.sub(r'[ö]', "oe", string)
string = re.sub(r'[ü]', "ue", string)
string = re.sub(r'[ä]', "ae", string)
string = re.sub(r'[ß]', "ss", string)
string = re.sub(r'[oe]', "ö", string)
string = re.sub(r'[ue]', "ü", string)
string = re.sub(r'[ä]', "ae", string)
return string
# fehler case sensitive pos tagging idee abgleich mit nomenliste und dann Großschreiben
# fehler replaceRockdots verändert pos: bsp für adp aber fuer verb
# klammern ändern nix an pos
#
"""
corpus.add_text(test5)
corpus.add_text(test6)
#corpus.add_text(test1.lower())
#corpus.add_text(test2.lower())
test1 = corpus[0].pos_tagged_text
test2 = corpus[1].pos_tagged_text
print(test1)
print(test2)
# <class 'list'>: [[('Sehr', 'ADV'), ('geehrte', 'ADJ'), ('Damen', 'NOUN'), ('und', 'CONJ'), ('Herren', 'NOUN'), (',', 'PUNCT'), ('ich', 'PRON'), ('bitte', 'ADV'), ('um', 'ADP'), ('Prüfung', 'NOUN'), (',', 'PUNCT'), ('ob', 'SCONJ'), ('und', 'CONJ'), ('wie', 'ADV'), ('eine', 'DET'), ('TU', 'NOUN'), ('-', 'PUNCT'), ('Email', 'NOUN'), ('-', 'PUNCT'), ('Adresse', 'NOUN'), ('für', 'ADP'), ('einen', 'DET'), ('Honorarprofessor', 'NOUN'), ('eingerichtet', 'VERB'), ('werden', 'AUX'), ('kann', 'VERB'), ('.', 'PUNCT'), [('Herr', 'NOUN'), ('Prof.', 'PROPN'), ('Dr', 'PROPN'), ('.-', 'PUNCT'), ('Ing', 'PROPN'), ('.', 'PUNCT')], [('Klaus', 'PROPN'), ('-', 'PUNCT'), ('Günter', 'PROPN'), ('Meng', 'PROPN'), ('hält', 'VERB'), ('seit', 'ADP'), ('etwa', 'ADV'), ('1995', 'NUM'), ('an', 'ADP'), ('der', 'DET'), ('TU', 'NOUN'), ('Dortmund', 'PROPN'), ('Vorlesungen', 'NOUN'), ('im', 'ADP'), ('Bereich', 'NOUN'), ('der', 'DET'), ('Satellitenkommunikation', 'NOUN'), ('und', 'CONJ'), ('Satellitennavigation', 'NOUN'), ('(', 'PUNCT'), ('Fakultät', 'NOUN'), ('Elektrotechnik', 'NOUN'), ('und', 'CONJ'), ('Informationstechnik', 'NOUN'), (')', 'PUNCT'), ('.', 'PUNCT')], [('Von', 'ADP'), ('etwa', 'ADV'), ('1984', 'NUM'), ('bis', 'ADP'), ('etwa', 'ADV'), ('1988', 'NUM'), ('war', 'AUX'), ('er', 'PRON'), ('auch', 'ADV'), ('wissenschaftlicher', 'ADJ'), ('Mitarbeiter', 'NOUN'), ('am', 'ADP'), ('Lehrstuhl', 'NOUN'), ('Hochfrequenztechnik', 'NOUN'), ('der', 'DET'), ('TU', 'NOUN'), ('Dortmund', 'PROPN'), ('.', 'PUNCT')], [('Seine', 'DET'), ('Vorlesungsthemen', 'NOUN'), ('sind', 'AUX'), ('diesem', 'DET'), ('Lehrstuhl', 'NOUN'), ('zugeordnet', 'VERB'), ('.', 'PUNCT'), ('\r\n', 'SPACE')], [('Eine', 'DET'), ('eigenständige', 'ADJ'), ('TU', 'NOUN'), ('-', 'PUNCT'), ('Email', 'NOUN'), ('-', 'PUNCT'), ('Adresse', 'NOUN'), ('wäre', 'AUX'), ('äußerst', 'ADV'), ('hilfreich', 'ADJ'), (',', 'PUNCT'), ('um', 'SCONJ'), ('eine', 'DET'), ('sinnvolle', 'ADJ'), ('Kommunikation', 'NOUN'), ('mit', 'ADP'), ('Studenten', 'NOUN'), ('zu', 'PART'), ('ermöglichen', 'VERB'), ('und', 'CONJ'), ('um', 'SCONJ'), ('auch', 'ADV'), ('andere', 'ADJ'), ('Hilfsmittel', 'NOUN'), ('(', 'PUNCT'), ('EWS', 'PROPN'), (')', 'PUNCT'), ('nutzen', 'VERB'), ('zu', 'PART'), ('können', 'VERB'), ('.', 'PUNCT')], [('Im', 'ADP'), ('Sinne', 'NOUN'), ('der', 'DET'), ('"', 'PUNCT'), ('Corporate', 'PROPN'), ('Identity', 'PROPN'), ('"', 'PUNCT'), ('der', 'DET'), ('TU', 'NOUN'), ('wäre', 'AUX'), ('das', 'PRON'), ('sicherlich', 'ADV'), ('sehr', 'ADV'), ('sinnvoll', 'ADJ'), ('.', 'PUNCT')], [('Die', 'DET'), ('Nutzung', 'NOUN'), ('einer', 'DET'), ('privaten', 'ADJ'), ('oder', 'CONJ'), ('geschäftlichen', 'ADJ'), ('Email', 'NOUN'), ('-', 'PUNCT'), ('Adresse', 'NOUN'), ('ist', 'AUX'), ('nicht', 'PART'), ('nur', 'ADV'), ('aus', 'ADP'), ('diesen', 'DET'), ('Gründen', 'NOUN'), ('nicht', 'PART'), ('glücklich', 'ADJ'), ('.', 'PUNCT'), ('\r\n', 'SPACE')], [('Mit', 'ADP'), ('freundlichen', 'ADJ'), ('Grüßen', 'NOUN'), ('\r\n', 'SPACE'), ('Dirk', 'PROPN'), ('Schulz', 'PROPN'), ('\r\n\u3000\r\n\u3000\r\n\u3000\r\n', 'SPACE'), ('------------------------------------------------------------------', 'PUNCT'), ('\r\n\u3000\r\n\u3000\r\n', 'SPACE'), ('PD', 'PROPN'), ('Dr', 'PROPN'), ('.-', 'PUNCT'), ('Ing', 'PROPN'), ('.', 'PUNCT')], [('Dirk', 'PROPN'), ('Schulz', 'PROPN'), ('\r\n', 'SPACE')], [('Technische', 'ADJ'), ('Universität', 'NOUN'), ('Dortmund', 'PROPN'), ('\r\n', 'SPACE')], [('Lehrstuhl', 'NOUN'), ('für', 'ADP'), ('Hochfrequenztechnik', 'NOUN'), ('\r\n', 'SPACE'), ('Friedrich', 'PROPN'), ('-', 'PUNCT'), ('Wöhler', 'PROPN'), ('-', 'PUNCT'), ('Weg', 'NOUN'), ('4', 'NUM'), ('\r\n', 'SPACE'), ('D-44227', 'NOUN'), ('Dortmund', 'PROPN'), ('\r\n', 'SPACE'), ('Tel.', 'NOUN'), (':', 'PUNCT'), ('0231/755', 'NUM'), ('-', 'PUNCT'), ('3909', 'NUM'), ('\r\n', 'SPACE'), ('Fax', 'NOUN'), (':', 'PUNCT'), ('0231/755', 'NUM'), ('-', 'PUNCT'), ('4631', 'NUM'), ('\r\n', 'SPACE'), ('E', 'X'), ('-', 'PUNCT'), ('Mail', 'PROPN'), (':', 'PUNCT'), ('dirk2.schulz@tu-dortmund.de<mailto:dirk2.schulz@tu-dortmund.de', 'DET')], [('>', 'X'), ('
# <class 'list'>: [[('Sehr', 'ADV'), ('geehrte', 'ADJ'), ('Damen', 'NOUN'), ('und', 'CONJ'), ('Herren', 'NOUN'), (',', 'PUNCT'), ('ich', 'PRON'), ('bitte', 'ADV'), ('um', 'ADP'), ('Pruefung', 'NOUN'), (',', 'PUNCT'), ('ob', 'SCONJ'), ('und', 'CONJ'), ('wie', 'ADV'), ('eine', 'DET'), ('TU', 'NOUN'), ('-', 'PUNCT'), ('Email', 'NOUN'), ('-', 'PUNCT'), ('Adresse', 'NOUN'), ('fuer', 'VERB')('einen', 'DET'), ('Honorarprofessor', 'NOUN'), ('eingerichtet', 'VERB'), ('werden', 'AUX'), ('kann', 'VERB'), ('.', 'PUNCT')], [('Herr', 'NOUN'), ('Prof.', 'PROPN'), ('Dr', 'PROPN'), ('.-', 'PUNCT')], [('Ing', 'PROPN'), ('.', 'PUNCT')], [('Klaus', 'PROPN'), ('-', 'PUNCT'), ('Guenter', 'PROPN'), ('Meng', 'PROPN'), ('haelt', 'VERB'), ('seit', 'ADP'), ('etwa', 'ADV'), ('1995', 'NUM'), ('an', 'ADP'), ('der', 'DET'), ('TU', 'NOUN'), ('Dortmund', 'PROPN'), ('Vorlesungen', 'NOUN'), ('im', 'ADP'), ('Bereich', 'NOUN'), ('der', 'DET'), ('Satellitenkommunikation', 'NOUN'), ('und', 'CONJ'), ('Satellitennavigation', 'NOUN'), ('(', 'PUNCT'), ('Fakultaet', 'NOUN'), ('Elektrotechnik', 'NOUN'), ('und', 'CONJ'), ('Informationstechnik', 'NOUN'), (')', 'PUNCT'), ('.', 'PUNCT')], [('Von', 'ADP'), ('etwa', 'ADV'), ('1984', 'NUM'), ('bis', 'ADP'), ('etwa', 'ADV'), ('1988', 'NUM'), ('war', 'AUX'), ('er', 'PRON'), ('auch', 'ADV'), ('wissenschaftlicher', 'ADJ'), ('Mitarbeiter', 'NOUN'), ('am', 'ADP'), ('Lehrstuhl', 'NOUN'), ('Hochfrequenztechnik', 'NOUN'), ('der', 'DET'), ('TU', 'NOUN'), ('Dortmund', 'PROPN'), ('.', 'PUNCT')], [('Seine', 'DET'), ('Vorlesungsthemen', 'NOUN'), ('sind', 'AUX'), ('diesem', 'DET'), ('Lehrstuhl', 'NOUN'), ('zugeordnet', 'VERB'), ('.', 'PUNCT')], [('Eine', 'DET'), ('eigenstaendige', 'ADJ'), ('TU', 'NOUN'), ('-', 'PUNCT'), ('Email', 'NOUN'), ('-', 'PUNCT'), ('Adresse', 'NOUN'), ('waere', 'VERB'), ('aeusserst', 'ADV'), ('hilfreich', 'ADJ'), (',', 'PUNCT'), ('um', 'SCONJ'), ('eine', 'DET'), ('sinnvolle', 'ADJ'), ('Kommunikation', 'NOUN'), ('mit', 'ADP'), ('Studenten', 'NOUN'), ('zu', 'PART'), ('ermoeglichen', 'VERB'), ('und', 'CONJ'), ('um', 'SCONJ'), ('auch', 'ADV'), ('andere', 'ADJ'), ('Hilfsmittel', 'NOUN'), ('(', 'PUNCT'), ('EWS', 'PROPN'), (')', 'PUNCT'), ('nutzen', 'VERB'), ('zu', 'PART'), ('koennen', 'VERB'), ('.', 'PUNCT')], [('Im', 'ADP'), ('Sinne', 'NOUN'), ('der', 'DET'), ('"', 'PUNCT'), ('Corporate', 'PROPN'), ('Identity', 'PROPN'), ('"', 'PUNCT')], [('der', 'DET'), ('TU', 'NOUN'), ('waere', 'VERB'), ('das', 'PRON'), ('sicherlich', 'ADV'), ('sehr', 'ADV'), ('sinnvoll', 'ADJ'), ('.', 'PUNCT')], [('Die', 'DET'), ('Nutzung', 'NOUN'), ('einer', 'DET'), ('privaten', 'ADJ'), ('oder', 'CONJ'), ('geschaeftlichen', 'ADJ'), ('Email', 'NOUN'), ('-', 'PUNCT'), ('Adresse', 'NOUN'), ('ist', 'AUX'), ('nicht', 'PART'), ('nur', 'ADV'), ('aus', 'ADP'), ('diesen', 'DET'), ('Gruenden', 'NOUN'), ('nicht', 'PART'), ('gluecklich', 'ADJ'), ('.', 'PUNCT')], [('Mit', 'ADP'), ('freundlichen', 'ADJ'), ('Gruessen', 'NOUN'), ('Dirk', 'PROPN'), ('Schulz', 'PROPN'), (' ', 'SPACE'), ('------------------------------------------------------------------', 'PUNCT'), (' ', 'SPACE'), ('PD', 'PROPN'), ('Dr', 'PROPN'), ('.-', 'PUNCT'), ('Ing', 'PROPN'), ('.', 'PUNCT')], [('Dirk', 'PROPN'), ('Schulz', 'PROPN')], [('Technische', 'ADJ'), ('Universitaet', 'NOUN'), ('Dortmund', 'PROPN')], [('Lehrstuhl', 'NOUN'), ('fuer', 'ADJ'), ('Hochfrequenztechnik', 'NOUN'), ('Friedrich', 'PROPN'), ('-', 'PUNCT'), ('Woehler', 'NOUN'), ('-', 'PUNCT')], [('Weg', 'NOUN'), ('4', 'NUM')], [('D-44227', 'NOUN')], [('Dortmund', 'PROPN')], [('Tel.', 'NOUN'), (':', 'PUNCT'), ('0231/755', 'NUM'), ('-', 'PUNCT'), ('3909', 'NUM'), ('Fax', 'NOUN'), (':', 'PUNCT'), ('0231/755', 'NUM'), ('-', 'PUNCT'), ('4631', 'NUM'), ('E', 'NOUN'), ('-', 'PUNCT'), ('Mail', 'PROPN'), (':', 'PUNCT'), ('dirk2.schulz@tu-dortmund.de<mailto:dirk2.schulz@tu-dortmund.de', 'DET')], [('>', 'X'), (' ', 'SPACE')], [('------------------------------------------------------------------', 'PUNCT')]]
"""
2017-11-27 12:49:05 +01:00
2017-11-27 12:49:05 +01:00
split = 0.8
weighting = "tf"
min_df = 0
max_df = 1
ngrams = 1
n_topics = 3
top_n = 7
2017-12-08 11:06:07 +01:00
"""
split_index = int(float(len(rawCorpus)) * split)
corpus_train = rawCorpus[0:split_index]
corpus_test = rawCorpus[split_index:len(rawCorpus) - 1]
2017-11-17 11:46:57 +01:00
2017-11-27 12:49:05 +01:00
###### Initialize and train a topic model
vectorizer = Vectorizer(weighting=weighting, min_df=min_df, max_df=max_df)
terms_list = (doc.to_terms_list(ngrams=ngrams, named_entities=False, as_strings=True) for doc in corpus_train)
doc_term_matrix = vectorizer.fit_transform(terms_list)
id2term = vectorizer.__getattribute__("id_to_term")
model = textacy.tm.TopicModel("lda", n_topics=n_topics)
model.fit(doc_term_matrix)
######
2017-12-08 11:06:07 +01:00
"""
2017-11-27 12:49:05 +01:00
2017-12-08 11:06:07 +01:00
"""
2017-11-27 12:49:05 +01:00
compenents = model.model.components_
2017-11-29 16:31:30 +01:00
2017-11-27 12:49:05 +01:00
components_ : array, [n_components, n_features]
Variational parameters for topic word distribution.
Since the complete conditional for topic word distribution is a Dirichlet,
components_[i, j] can be viewed as pseudocount that represents
the number of times word j was assigned to topic i.
It can also be viewed as distribution over the words for each topic after normalization:
model.components_ / model.components_.sum(axis=1)[:, np.newaxis].
2017-12-08 11:06:07 +01:00
"""
2017-11-27 12:49:05 +01:00
2017-12-08 11:06:07 +01:00
"""
2017-11-27 12:49:05 +01:00
test_doc = corpus_test[0]
2017-11-29 16:31:30 +01:00
bla = test_doc.to_bag_of_terms(ngrams=1, named_entities=True, normalize=u'lower', lemmatize=None, lowercase=True, weighting=u'count', as_strings=False)
key_list = bla.keys()
bla_list = list(bla)
print(bla)
print(bla_list)
for k in bla.keys():
print(id2term[k])
2017-11-27 12:49:05 +01:00
2017-12-08 11:06:07 +01:00
2017-11-27 12:49:05 +01:00
2017-11-29 16:31:30 +01:00
ressources_path = FILEPATH + "ressources/"
path2DEstopwordlist = ressources_path + config.get("de_stopwords", "pickle_file")
DE_STOP_WORDS = load_obj(path2DEstopwordlist)
2017-11-27 12:49:05 +01:00
2017-11-29 16:31:30 +01:00
# load corpus
corpus_de_path = FILEPATH + config.get("de_corpus", "path")
rawCorpus_name = "de" + "_raw_ticket"
corpus, parser = load_corpus(corpus_name=rawCorpus_name, corpus_path=corpus_de_path)
2017-12-08 11:06:07 +01:00
"""
2017-11-29 16:31:30 +01:00
#parser = spacy.load("de")
#corpus = textacy.Corpus(parser)
2017-11-27 12:49:05 +01:00
2017-11-29 16:31:30 +01:00
testtxt = "Sehr geehrtes ITMC Service Team,\r\n\r\nseit ein einiger Zeit scheint der Netzwerkanschluss eines Kollegen" \
" an das Intranet der BMP mit der Dosennummer G1 303/04/12.05 (G1 4 26-1) in Raum G1-426 nicht mehr zu funktionieren. " \
"\r\nIch würde Sie daher bitten diese Mail an den zuständigen Kollegen weiterzuleiten, um die Leitung vielleicht einmal zu Prüfen.\r\n\r\n" \
"Des Weiteren hätte ich noch eine Frage bezüglich der Möglichkeit zur Nutzung einer VPN Verbindung aus" \
" unserem Intranet heraus zu einem fremden Netzwerk. Dies ist zwar über das WLAN-Netz möglich, jedoch nicht " \
"aus unserem Netzwerk heraus. Vielleicht können Sie mir mitteilen an welchen Kollegen ich mich bezüglich" \
" dieses Problem wenden kann.\r\n\r\nBei Rückfragen stehe ich gerne zur Verfügung!\r\n\r\nBeste Grüße," \
"\r\n\r\nNicolas Rauner\r\n\r\nLS Biomaterialien und Polymerwissenschaften\r\nFakultät Bio- und Chemieingenieurwesen\r\nTU Dortmund" \
" \r\nD-44227 Dortmund\r\n\r\nTel: + 49-(0)231 / 755 - 3015\r\nFax: + 49-(0)231 / 755 - 2480\r\n\r\nwww.ls-bmp.de <http://www.ls-bmp.de/>"
#corpus.add_text(testtxt)
2017-11-27 12:49:05 +01:00
2017-12-08 11:06:07 +01:00
"""
2017-11-29 16:31:30 +01:00
term_dict_w_stop = {}
term_dict_wo_stop = {}
footings = ["gruss", "grusse", "gruesse", "gruessen", "grusses"]
2017-11-27 12:49:05 +01:00
2017-11-29 16:31:30 +01:00
for doc in corpus:
2017-11-27 12:49:05 +01:00
2017-11-29 16:31:30 +01:00
tokens = [tok for tok in doc]
2017-11-27 12:49:05 +01:00
2017-11-29 16:31:30 +01:00
# footer raus
2017-11-27 12:49:05 +01:00
2017-11-29 16:31:30 +01:00
for i,tok in enumerate(tokens):
text = tok.text
text = re.sub(r'[ß]', "ss", text)
text = re.sub(r'[ö]', "oe", text)
text = re.sub(r'[ü]', "ue", text)
text = re.sub(r'[ä]', "ae", text)
2017-11-27 12:49:05 +01:00
2017-11-29 16:31:30 +01:00
for gr in footings:
if gr in text.lower():
tokens = tokens[0:i]
#print(tokens)
break
2017-11-27 12:49:05 +01:00
2017-11-29 16:31:30 +01:00
for i,tok in enumerate(tokens):
2017-11-27 12:49:05 +01:00
2017-11-29 16:31:30 +01:00
if tok.is_space or tok.is_punct or tok.like_url or tok.like_email:
continue
2017-11-27 12:49:05 +01:00
2017-11-29 16:31:30 +01:00
if i is not 0:
#text = tok.text if tokens[i-1].pos_ is not "NUM" else tok.text+" "+tokens[i-1].text
2017-11-27 12:49:05 +01:00
2017-11-29 16:31:30 +01:00
if tokens[i-1].like_num:
text = tokens[i - 1].text + " " + tok.text
else:
text = tok.text
2017-11-27 12:49:05 +01:00
2017-11-29 16:31:30 +01:00
else:
text = tok.text
2017-11-27 12:49:05 +01:00
2017-11-29 16:31:30 +01:00
# replaceRockDots
text = re.sub(r'[ß]', "ss", text)
text = re.sub(r'[ö]', "oe", text)
text = re.sub(r'[ü]', "ue", text)
text = re.sub(r'[ä]', "ae", text)
2017-11-27 12:49:05 +01:00
2017-11-29 16:31:30 +01:00
if text not in term_dict_w_stop.keys():
term_dict_w_stop[text] = 1
else:
term_dict_w_stop[text] += 1
2017-11-27 12:49:05 +01:00
2017-11-29 16:31:30 +01:00
if text.lower() not in DE_STOP_WORDS:
if text not in term_dict_wo_stop.keys():
term_dict_wo_stop[text] = 1
else:
term_dict_wo_stop[text] += 1
2017-11-27 12:49:05 +01:00
2017-11-29 16:31:30 +01:00
term_dict_sorted = sort_dictionary(term_dict_w_stop)
term_dict_wo_sorted = sort_dictionary(term_dict_wo_stop)
2017-11-27 12:49:05 +01:00
2017-11-29 16:31:30 +01:00
split_value = 0.2
from_ = int((1-split_value) * float(len(term_dict_sorted))) #1-splt
to_ = len(term_dict_sorted)
2017-11-27 12:49:05 +01:00
2017-11-29 16:31:30 +01:00
#logprint(term_dict_sorted[from_: to_])
#logprint("\n")
#logprint(term_dict_wo_sorted[from_: to_])
2017-11-27 12:49:05 +01:00
2017-11-29 16:31:30 +01:00
for elem in term_dict_sorted:
logprint(elem)
2017-11-27 12:49:05 +01:00
2017-11-29 16:31:30 +01:00
logprint("\n")
logprint("\n")
logprint("\n")
logprint("\n")
2017-11-27 12:49:05 +01:00
2017-11-29 16:31:30 +01:00
for elem in term_dict_wo_sorted:
logprint(elem)
2017-11-27 12:49:05 +01:00
2017-12-08 11:06:07 +01:00
2017-11-29 16:31:30 +01:00
"""
2017-11-27 12:49:05 +01:00
2017-11-29 16:31:30 +01:00
2017-11-27 12:49:05 +01:00
2017-11-29 16:31:30 +01:00
2017-12-08 11:06:07 +01:00
end = time.time()
print("\n\n\nTime Elapsed Test:{0}\n\n".format(end - start))
2017-11-29 16:31:30 +01:00
2017-12-08 11:06:07 +01:00
"""
2017-11-29 16:31:30 +01:00
2017-12-08 11:06:07 +01:00
#.txt löiste reveersen
2017-11-29 16:31:30 +01:00
2017-12-08 11:06:07 +01:00
in_path= "/home/jannis.grundmann/PycharmProjects/topicModelingTickets/log/terms_without_stop.txt"
out_path= "/home/jannis.grundmann/PycharmProjects/topicModelingTickets/log/terms_without_stopwords.txt"
2017-11-29 16:31:30 +01:00
2017-12-08 11:06:07 +01:00
gen=reversed(list(open(in_path)))
2017-11-29 16:31:30 +01:00
2017-12-08 11:06:07 +01:00
textacy.fileio.write_file_lines(gen,out_path)
"""
2017-11-29 16:31:30 +01:00
2017-11-27 12:49:05 +01:00
"""
# frage wieviele tickets pro topic?
2017-11-17 11:46:57 +01:00
2017-11-27 12:49:05 +01:00
ticket_gen = textacy.fileio.read_csv(FILEPATH + "M42-Export/de_tickets.csv", delimiter=";")
cat_dict = {}
cat2id_dict = {}
for line in ticket_gen:
tick_id = line[0]
cat = normalize(line[3])
cat2id_dict[cat] = tick_id
if cat not in cat_dict.keys():
cat_dict[cat] = 1
else:
cat_dict[cat] += 1
import operator
sorted_dict = sorted(cat_dict.items(), key=operator.itemgetter(1))
for k, v in sorted_dict:
if k == "sd":
print(cat2id_dict[k])
print(k, v)
print(len(sorted_dict))
kb2ticket_gen = textacy.fileio.read_csv(FILEPATH + "M42-Export/KB2Ticket_2017-09-13.csv", delimiter=";")
2017-11-17 11:46:57 +01:00
ticket2kb_dict = {}
2017-11-17 11:46:57 +01:00
for line in kb2ticket_gen:
2017-11-17 11:46:57 +01:00
ticket_id = line[0]
kb_id = line[1]
2017-11-17 11:46:57 +01:00
ticket2kb_dict[ticket_id] = kb_id
# {'INC55646': 'KBA10065', 'INC65776': 'KBA10040', 'INC43025': 'KBA10056', ...} # kb2keywords_dict
2017-11-17 11:46:57 +01:00
kb2keywords_gen = textacy.fileio.read_csv(FILEPATH + "M42-Export/KB_2017-09-13.csv", delimiter=";")
2017-11-17 11:46:57 +01:00
next(kb2keywords_gen, None) # skip first line("ArticleID";"Subject";"Keywords";...)
2017-11-17 11:46:57 +01:00
kb2keywords_dict = {}
2017-11-17 11:46:57 +01:00
kb_keywords=False
2017-11-17 11:46:57 +01:00
for line in kb2keywords_gen:
2017-11-17 11:46:57 +01:00
kb_id = line[0]
2017-11-17 11:46:57 +01:00
subject = line[1]
2017-11-17 11:46:57 +01:00
keywords = line[2]
keywords_list = [normalize(x) for x in str(keywords).split(",")]
2017-11-17 11:46:57 +01:00
if kb_id not in kb2keywords_dict.keys():
kb2keywords_dict[kb_id] = []
2017-11-17 11:46:57 +01:00
if kb_keywords:
for item in keywords_list:
if item != "":
kb2keywords_dict[kb_id].append(item)
2017-11-17 11:46:57 +01:00
else:
kb2keywords_dict[kb_id].append(subject)
2017-11-17 11:46:57 +01:00
# remove all empty items
kb2keywords_dict = {k: v for k, v in kb2keywords_dict.items() if len(v) != 0}
# {'KBA10091': ['citavi'], 'KBA10249': ['"beschaedigte unicard"', 'risse', '"defekte karte"'], ...}
cat_dict = {}
count_dict={}
keywords_dict={}
for doc in corpus:
category_name_ = doc.metadata["categoryName"]
if category_name_ not in cat_dict.keys():
cat_dict[category_name_] = 1
else:
cat_dict[category_name_] += 1
try:
x=doc.metadata["TicketNumber"]
x=ticket2kb_dict[x]
x=kb2keywords_dict[x]
except:
pass
for k,v in kb2keywords_dict.items(): #str,list
for elem in v:
if elem not in count_dict.keys():
count_dict[elem] = 1
else:
count_dict[elem] += 1
import operator
kb2keywords_gen = textacy.fileio.read_csv(FILEPATH + "M42-Export/KB_2017-09-13.csv", delimiter=";")
next(kb2keywords_gen, None) # skip first
cnt=0
for kb in kb2keywords_gen:
cnt +=1
print(str(cnt))
count_dict = {}
# "ArticleID";"Subject";"Keywords";"Solution";"SolutionText";"CreatedOn"
for kb_entry in kb2keywords_gen:
entry_ = kb_entry[1]
if entry_ not in count_dict.keys():
count_dict[entry_] = 1
else:
count_dict[entry_] += 1
2017-11-27 12:49:05 +01:00
import operator
sorted_dict = sorted(count_dict.items(), key=operator.itemgetter(1))
#for k,v in sorted_dict:
# print(k,v)
#print(len(sorted_dict))
2017-11-27 12:49:05 +01:00
"""
2017-11-17 11:46:57 +01:00
"""
# kb2keywords_dict
kb2keywords_gen = textacy.fileio.read_csv(FILEPATH + "M42-Export/KB2Ticket_2017-09-13.csv",
delimiter=";")
used_kb=[]
for kb in kb2keywords_gen:
used_kb.append(kb[1])
print("used_kb: {}".format(len(list(set(used_kb)))))
#"ArticleID";"Subject";"Keywords";"Solution";"SolutionText";"CreatedOn"
kb2keywords_gen = textacy.fileio.read_csv(FILEPATH + "M42-Export/KB_2017-09-13.csv", #
delimiter=";")
next(kb2keywords_gen, None) # skip first
cat_lst=[]
sub_lst=[]
key_lst=[]
for kb in kb2keywords_gen:
cat_lst.append(kb[0])
sub_lst.append(kb[1])
key_lst.append(kb[2].split(","))
cats_setlist = list(set(cat_lst))
print("cats: {}".format(len(cats_setlist)))
print(cats_setlist[0:20])
print()
print("sub_lst: {}".format(len(sub_lst)))
sub_setlist = list(set(sub_lst)) #frage: hat wirklich jeder kb_eintrag ein anderesn Betreff?
print("sub_setlist: {}".format(len(sub_setlist)))
#print(sub_setlist[0:20])
print()
key_lst = [item for sublist in key_lst for item in sublist] #flatten list
key_setlist = list(set(key_lst))
print("key_setlist: {}".format(len(key_setlist)))
#print(key_setlist[0:20])
print("\n\n\n\n")
"""
"""
used_list = ['bd_unicard_nicht_eingeschrieben', 'sd_vpn_temporaerer fehler ub', 'sd_webmailer_threadanzeige und weiterleitung', 'ub_beschaedigte unicard', 'sd_boss_notenverbuchung', 'd.3 client installation', 'sd_keine rueckantwort kunde', 'sd_asknet_und_dreamspark', 'sd_beantragung_unicard', 'sd_gastaufenthalter', 'sd_internationaloffice', 'sd_outlook anmeldung gestoert', 'unicard_restbetrag_auszahlung', 'apps_dms_d.3 client installation/login d.3 funktioniert nicht', 'ub_unicard_unicard mit vollmacht abholen', 'sd_namensaenderung mitarbeiter', 'sd_itmc kurse anmeldebestaetigung', 'sd_zugriff_onlinedienste_rueckmeldung', 'benutzer zum redmine hinzufuegen', 'sd_unicard_gesperrte unicard entsperre', 'lsf freischaltung als mitarbeiter/in', 'sd_mail_als_anhang', 'sd-e-mail_adresse_funktional_beantragen', 'sd_goeke drucker', 'sd_unimail imap_pop3', 'sd_origin_workaround', 'sd_matlab lizenzdatei pc-pools', 'sd_outlook kontakte automatische aktualisierung', 'sd_sap konteneinsicht antrag', 'ohne betreff', 'sd_telefonantrag_änderung_neuantrag', 'sd_sophos download', 'sd_geraeteausleihe', 'studierendenausweis', 'sd_citavi', 'sd_laufzeit unimail account', 'sd_login_unibib ub-it', 'sd_tu_app_keine internetverbindung', 'sd_unicard_max_laufzeit', 'ub_unicard_zusendung der karte moeglich?', 'sd_telefonbuch-eintrag_änderung', 'ub_drucker kopierer', 'windows 10', 'sd_telefon (antrag: neuanschluss, umzug, änderung erledigt)', 'sd_tu-app feedback standard', 'sd_spam e-mail bekannt meldung', 'sd_spss_online_bestellung', 'sd_apple-on-campus', 'sd_studisek', 'sd_office 365 plus support', 'sd_sap_initialkennwort_englisch', 'sd_office365_asknet', 're: elektroarbeiten fuer leitsystem 2. und 3. obergeschoss', 'sd_login tu portale', 'ungueltiges ticket siehe journal', 'sd_sap_freischaltung ohne passwortaenderung', 'bd_unicard_geldkarte_laden', 'sd_verlust/antrag unicard', 'sd_unimail zu exchange', 'citavi_lizenzschluessel_nicht bekommen', 'sd_plotauftrag_zv', 'sd_citavi_support', 'sd_antworten_korrekt', 'sd_wlan-gastkonto', 'sd_antwort_phishingmail', 'bd_unicard_freigabe_beantragung', 'sd_origin nur noch eine seriennummer', 'cm_asiexception', 'sd_login_tu_portale', 'sd_webmailer_thread-anzeige', 'apps_dms-passwort d.3', 'apps_redmine_repository', 'sd_uniaccount_passwortaenderung', 'sd_phishing', 'sd_sap_firefox_esr', 'vpn verbindung fuer unitymedia kunden', 'sd_kurs-angebote anmeldung', 'sd_unicard fehlerhafte geldbuchung', 'sd_uniaccount_ehemalige_passwortaenderung', 'sd_sap_dienstreise', 'cm_lsf-boss_freischaltung', 'wlan', 'uni card', 'sd_webmailer einrichtung weiterleitung', 'spam ohne tu bezug', 'sd_outlook_in_exchange_einbinden', 'sd_wlan_beratung', 'sd_uniaccount_dauer freischaltung', 'sd_sap_konteneinsicht_ workaround', 'sd_vpn anleitungen', 'sd_asknet_mitarbeiter_softwarebestellung', 'sd_unicard_abholung', 'sd_vpn_probleme_mit_unitymedia', 'sd_diensthandy beschaffung', 'sd_unicard_defekt', 'sd_freischaltung uniaccount verzoegert', 'sd_kurs-angebote itmc', 'bd_goeke_allgemein', 'sd_uniaccount_ehemalige_studierende', 'sd_stellenausschreibung schwarzes brett', 'freischaltung uniaccount', 'sd_unicard_workaround_bestellung', 'probleme mit der namensaenderung/ neue unicard', 'ub_geldchip-problem bei uc', 'sd_semesterticket', 'problem mit der beantragung von der unicard', 'sd_citavi bestellung', 'sd_immatrikulationsbescheigung_druckfehler', 'sd_vpn_aktualisierung', 'vpn_ipsec_stoerung', 'sd_dreamspark', 'ub_namensaenderung', 'sd_immatrikulationsbescheinigung_portal', 'ub_prod_neue unicard bei beschaedigung', 'sd_vpn_webvpn', 'sd_telefonbuch_prof_eintragung', 'sd_kontakt_asknet', 'probleme mit unicard', 'sd_office 356 plus bestellung', 'sd_gmx_web.de', 'fehlender eintrag im elektronischen telefonbuch', 'ub_prod_namenskorrektur_student', 'einrichtung des eduroam netzwerks', 'sd_sap_initialkennwort', 'sd_boss-bescheinigung', 'sd_wlan passwort setzen', 'sd_aktivierung uniaccount', 'sd_gleitzeitanlage_dez3_stoerung', 'sd_heirat_namensaenderung_student', 'ub_unicard_spaetere abholung moeglich?', 'unicard nochmal beantragen', 'sd_studisek_buchung
labellist = ['sd_antworten_korrekt', 'sd_kurs-angebote anmeldung', 'sd_semesterticket', 'apps_dms-passwort d.3', 'freischaltung uniaccount', 'sd_heirat_namensaenderung_student', 'bd_unicard_freigabe_beantragung', 'sd_uniaccount_ehemalige_studierende', 'sd_sap_dienstreise', 'sd_origin_workaround', 'sd_uniaccount_ehemalige_passwortaenderung', 'fehlender eintrag im elektronischen telefonbuch', 'wlan', 'sd_tu-app feedback standard', 'sd_wlan_beratung', 'sd_uniaccount_passwortaenderung', 're: elektroarbeiten fuer leitsystem 2. und 3. obergeschoss', 'sd_webmailer_threadanzeige und weiterleitung', 'ub_unicard_spaetere abholung moeglich?', 'sd_citavi_support', 'sd_outlook kontakte automatische aktualisierung', 'sd_origin nur noch eine seriennummer', 'lsf freischaltung als mitarbeiter/in', 'cm_asiexception', 'sd_freischaltung uniaccount verzoegert', 'ub_unicard_zusendung der karte moeglich?', 'sd_login_unibib ub-it', 'uni card', 'sd_outlook anmeldung gestoert', 'd.3 client installation', 'ub_unicard_abholungszeiten', 'sd_antwort_phishingmail', 'sd_matlab lizenzdatei pc-pools', 'sd_sap_initialkennwort', 'sd_sap_freischaltung ohne passwortaenderung', 'sd_spss_online_bestellung', 'probleme mit der namensaenderung/ neue unicard', 'sd_keine rueckantwort kunde', 'sd_unimail imap_pop3', 'sd_beantragung_unicard', 'sd_unicard_gesperrte unicard entsperre', 'sd_internationaloffice', 'unicard nochmal beantragen', 'sd_stellenausschreibung schwarzes brett', 'sd_sophos download', 'cm_lsf-boss_freischaltung', 'sd_verlust/antrag unicard', 'vpn_ipsec_stoerung', 'sd_account_abmelden', 'sd_outlook_in_exchange_einbinden', 'ub_namensaenderung', 'sd_telefon (antrag: neuanschluss, umzug, änderung erledigt)', 'unicard vergessen abzuholen und nicht mehr da', 'apps_redmine_repository', 'einrichtung des eduroam netzwerks', 'sd_unicard_max_laufzeit', 'sd_gmx_web.de', 'sd_unicard fehlerhafte geldbuchung', 'sd_geraeteausleihe', 'spam ohne tu bezug', 'sd_uniaccount_dauer freischaltung', 'apps_dms_d.3 client installation/login d.3 funktioniert nicht', 'sd_office 365 plus support', 'sd_unicard_defekt', 'sd_phishing', 'sd_goeke drucker', 'ub_unicard_unicard mit vollmacht abholen', 'sd_gleitzeitanlage_dez3_stoerung', 'sd_pruefungsamt', 'sd_aktivierung uniaccount', 'sd_boss-bescheinigung', 'sd_sap_initialkennwort_englisch', 'bd_unicard_geldkarte_laden', 'sd_telefonbuch-eintrag_änderung', 'vpn verbindung fuer unitymedia kunden', 'sd_studisek', 'sd_antrag funktionale mailadresse', 'sd_asknet_und_dreamspark', 'sd_unicard_workaround_bestellung', 'sd_sap_firefox_esr', 'sd_vpn anleitungen', 'sd_office365_asknet', 'citavi_lizenzschluessel_nicht bekommen', 'sd_sap konteneinsicht antrag', 'sd_spam e-mail bekannt meldung', 'ub_prod_namenskorrektur_student', 'ub_beschaedigte unicard', 'sd_namensaenderung mitarbeiter', 'sd_mail_als_anhang', 'benutzer zum redmine hinzufuegen', 'sd_login_tu_portale', 'sd_email_namensaenderung', 'windows 10', 'ungueltiges ticket siehe journal', 'sd_vpn_temporaerer fehler ub', 'ub_prod_neue unicard bei beschaedigung', 'sd_dreamspark', 'sd_webmailer einrichtung weiterleitung', 'sd_asknet_mitarbeiter_softwarebestellung', 'sd_studisek_buchung_semesterbeitrag', 'sd_immatrikulationsbescheinigung_portal', 'sd_vpn_probleme_mit_unitymedia', 'sd-e-mail_adresse_funktional_beantragen', 'sd_diensthandy beschaffung', 'sd_vpn_webvpn', 'sd_laufzeit unimail account', 'sd_citavi', 'problem mit der beantragung von der unicard', 'sd_kurs-angebote itmc', 'sd_telefonbuch, neues system', 'sd_login tu portale', 'sd_wlan passwort setzen', 'sd_zugriff_onlinedienste_rueckmeldung', 'unicard_restbetrag_auszahlung', 'sd_immatrikulationsbescheigung_druckfehler', 'bd_unicard_nicht_eingeschrieben', 'sd_unimail zu exchange', 'sd_wlan-gastkonto', 'probleme mit unicard', 'sd_telefonbuch_prof_eintragung', 'sd_vpn_aktualisierung', 'sd_apple-on-campus', 'bd_goeke_allgemein', 'studierendenausweis', 'ub_drucker kopierer', 'sd_unicard_abholung', 'sd_office 356 plus bestellung', 'ohne betreff', 'sd_tu_app_keine internetverbindung', 'sd_boss_notenverbuchung', 'ub_geldchip-problem bei uc
for l in used_list:
if l not in labellist:
print(l)
print(len(used_list))
print(len(labellist))
"""
2017-11-17 11:46:57 +01:00
"""
vllt kategorien in unterkategorien aufteilen
2017-09-11 17:29:54 +02:00
2017-11-17 11:46:57 +01:00
allg:
utf-korregieren, bei sonderzeichen wörter trennen
namen raus, addressen nach grüßen
emails, urls, nummern raus
vllt sogar alles, was ebend jenes enthält (oder auf .toplvldomain bzw. sonderzeichen enthält oder alles was ein @ enthält
sinnvoller wörter von müll trennen: 8203;verfügung
abkürzungen raus: m.a, o.ä.
sinnlose bsp: nr54065467 455a33c5 tvt?= ------problem--------
"\n\n\nTime Elapsed Topic Modeling:{0}\n\n".format(end - start))
"""
2017-09-12 14:56:11 +02:00
2017-11-06 12:54:59 +01:00
"""
# load config
config_ini = FILEPATH + "config.ini"
config = ConfigParser.ConfigParser()
with open(config_ini) as f:
config.read_file(f)
2017-11-06 12:54:59 +01:00
PARSER = spacy.load("de")
2017-11-06 12:54:59 +01:00
corpi = textacy.Corpus(PARSER)
2017-11-06 12:54:59 +01:00
testcontetn = [
"fdsfdsfsd",
"juzdtjlkö",
"gfadojplk"
]
2017-11-06 12:54:59 +01:00
testmetda = [
{"categoryName": "zhb", "Solution": "", "Subject": "schulungstest"},
{"categoryName": "neuanschluss", "Solution": "subject", "Subject": "telephone contract"},
{"categoryName": "zhb", "Solution": "", "Subject": "setuji"}
]
2017-11-06 12:54:59 +01:00
def makecontent(testcontetn):
for content in testcontetn:
yield content
2017-11-06 12:54:59 +01:00
def makemeta(testmetda):
for metdata in testmetda:
yield metdata
2017-09-12 14:56:11 +02:00
2017-11-06 12:54:59 +01:00
def corpus2Text(corpus):
for doc in corpus:
yield doc.text
2017-09-11 17:29:54 +02:00
2017-11-06 12:54:59 +01:00
corpi.add_texts(
makecontent(testcontetn),
makemeta(testmetda)
)
2017-09-11 17:29:54 +02:00
2017-11-06 12:54:59 +01:00
save_corpus(corpi, corpus_path="/home/jannis.grundmann/PycharmProjects/topicModelingTickets/test", corpus_name="test")
2017-09-11 17:29:54 +02:00
2017-11-06 12:54:59 +01:00
bla = "uni mail account adresse woche falsch laufen schicken gerne januar betreff herr nachricht gruesse dezernat liebe datum freitag anfrage dienstag unicard karte abholen defekt bibliothek abholung dezember beantragung status gerne portal email nummer service id vorname prozess dez schauen eg rechner mitarbeiterin benutzerkonto oktober wissenschaftliche projekt fr download hilfskraft verantwortliche link dringend antrag schnelle arbeitsplatz november admin rahmen stand geschickt server outlook ordner bild konto postfach campus hi ueberpruefung sued beste daten freuen semester login benutzer gerne erstellen stelle frage system boss moeglichkeit student schoen spam alias geld vertrag juni ansprechpartner telefon raum einrichtung gebaeude telefonbuch abteilung element eintrag nutzer raum pc gerne lehrstuhl voraus fakultaet verfuegung herzliche drucker erreichen tlaptop kabel problem klaerung url adapter feedback koeln grundsaetzlich kaufmann problem fehler verbindung anhang meldung client netz netzwerk wenden funktionieren liebe mitarbeiter unterstuetzung aktuell herr benoetigt raumplanung gb weber vorab ueckmeldung software lizenz programm kurze urlaub gerne installation dankbar informieren team service problem loesung bestellung verlaengern verteiler alte aendern februar oeffnen update pdf browser notwendig fenster schulung beginn wege nord tkurs frage studierende personen teilnehmer standort gerne herunterladen voraus zusenden ews veranstaltung datei iso text umstellung absender message date html arbeit kaiser erfolgreich thema ablauf art at einfuehrung umfrage cloud zugang zugreifen montag probleme kollegin profil server handy web file ticket drucker einrichten senden nr mittwoch card mitteilen nrw kontakt mail fax universitaet it institut hardware hinweis fakultaet not strasse loeschen liste funktion auftrag zeitraum verwaltung angebot vorgehen entfernen moeglichkeit gefunden benutzername informatik gruppe eingabe nachname chemie dame b. angepasst name schoene abt post zukommen verlaengerung sommersemester fehlen namensaenderung auskunft tu dr prof pruefung herr namen fakultaet bereich lehrstuhl installieren buero ok anschluss maerz theologie notebook herr berechtigung master vorbeikommen passwort anmelden account hilfe helfen uniaccount anmeldung kennwort problem boss zugriff referat screenshot support laufwerk bildschirm super tastatur button auswaehlen"
bla = bla.split()
print(len(bla))
print(len(set(bla)))
print()
"""
2017-09-11 17:29:54 +02:00
2017-11-06 12:54:59 +01:00
"""
#save_corpusV2(corpi,corpus_path=corpus_de_path,corpus_name=rawCorpus_name)
2017-11-06 12:54:59 +01:00
#textacy.fileio.write_file_lines(corpus2Text(corpi), filepath=corpus_de_path+"plain.txt")
2017-11-06 12:54:59 +01:00
dict = {"unicard redaktionsteam": 189, "kms": 131, "itmc_st\u00f6rungen": 17, "benutzerverwaltung_probleme": 168, "mailverteiler exchange": 130, "beamer": 70, "cws_confluence": 190, "benutzerverwaltung": 26, "sos": 166, "virtuelle server": 116, "sap": 7, "wlan": 21, "lsf": 6, "gastaufenthalt": 8, "umzug": 5, "firewall betreuung": 129, "ausleihe": 39, "fiona": 10, "kursplanung": 195, "schulungsraum verwaltung": 200, "plagiatserkennung": 32, "designentwicklung": 100, "ub basis it": 184, "tsm": 51, "backup tsm": 110, "raumkalender": 174, "veeam": 149, "linux bs": 42, "hochleistungsrechnen": 90, "e learning": 37, "h\u00f6rsaal\u00fcbertragung": 52, "sophos": 88, "service portal redaktion": 182, "verkauf": 93, "fk 16": 30, "campus app": 54, "dns": 71, "kurse": 196, "itmc schulungsr\u00e4ume": 96, "leitung": 91, "telefon": 14, "housing": 135, "softwarelizenzen": 35, "hcm stammdaten": 68, "semesterticket": 197, "exchange nutzung": 33, "mediendienste": 167, "sam spider": 172, "pvp": 27, "webserver": 29, "werkvertr\u00e4ge": 158, "ibz raumbuchung": 177, "webmailer": 126, "unicard sperrung": 64, "cd dvd produktion": 114, "lizenzserver": 92, "pr\u00fcfungsmanagement": 38, "blogs wikis foren": 87, "unicard ausgabe": 161, "pools": 157, "desktop & basisdienste": 144, "antrag auf rechnungserstellung": 193, "mailalias": 121, "evaexam": 133, "neuanschluss": 0, "mobilfunkvertr\u00e4ge": 69, "ftp server": 191, "haustechnik": 77, "raumbuchungssysteme": 186, "confluence": 181, "uniaccount zugangsdaten": 47, "itmc medienr\u00e4ume ef50": 171, "dokoll support": 128, "elektronisches telefonbuch": 3, "softwareverteilung": 153, "overhead projektor": 104, "sicherheit": 145, "itmc_als": 48, "itmc pools": 160, "zhb": 60, "serversupport": 101, "veranstaltungen": 61, "fk12 webauftritt": 138, "hardware": 142, "unicard produktion": 156, "telefonkonferenzen": 170, "dhcp": 188, "zertifikate server dfn": 139, "lan": 1, "datanet": 49, "neuausstattung": 173, "moodle": 16, "abmeldung": 13, "uni mail": 15, "medienr\u00e4ume ef50": 117, "verschiedene aufgaben": 40, "zentrale webserver": 75, "vorlesungsaufzeichnung": 152, "grafik": 132, "campus management": 72, "hacker angriff": 46, "pos": 23, "zugangsdaten": 41, "serviceportal": 63, "ews": 24, "voicemail box": 150, "service desk itmc": 74, "test": 180, "beschaffung": 57, "bestellung": 185, "vpn": 55, "app feedback": 66, "allgemein": 134, "rundmail": 105, "telefonabrechnung": 199, "limesurvey": 31, "unicard": 28, "eldorado": 140, "uniaccount": 12, "plotter": 125, "mdm mobile device management": 120, "namens\u00e4nderung": 43, "sd": 84, "basis applikationen": 103, "\u00e4nderung": 194, "fileserver einrichtung": 187, "fk14_test": 154, "werkst\u00e4tte": 179, "itmc_aufgaben": 45, "formulare antr\u00e4ge": 81, "facility": 192, "web": 169, "asknet": 136, "server storage": 113, "mail groupware": 20, "rektorat -b\u00fcro": 178, "office": 50, "werkstoffe lehrstuhl bauwesen": 59, "telefonzentrale": 115, "verwaltung": 4, "netze": 22, "beantragung": 82, "d.3 dms": 148, "redmine projektverwaltung": 141, "wsus": 106, "lido": 118, "rechnerr\u00e4ume": 143, "matrix42_hilfe": 18, "boss service desk": 44, "konteneinsicht": 62, "spam phishing": 53, "forensic": 164, "fk 12": 11, "benutzungsverwaltung": 198, "redmine": 79, "basis app": 85, "viren": 95, "fk12 migration": 155, "raumbuchung": 109, "virtuelle desktops citrix": 176, "outlook_einrichtung": 123, "kundenserver": 137, "nrw ticket": 80, "weiterentwicklung": 127, "siport zugangskontrolle": 98, "e mail dienste": 99, "vorlagenerstellung": 36, "video": 19, "studierendensekretariat": 111, "it sicherheit sic": 86, "boss": 25, "technik": 58, "dokoll pvp": 112, "betrieb": 2, "v2 campus app feedback": 151, "mailverteiler": 108, "videoschnitt": 119, "fk raumplanung 09": 9, "sap urlaub": 73, "keine r\u00fcckantwort": 124, "prozess- und projektmanagement": 67, "dienstreise": 34, "webgestaltung": 78, "schulung": 175, "software": 89, "medientechnik": 76, "servicedesk": 107, "service portal": 94, "software entwicklung": 165, "uniflow": 159, "ub_st\u00f6rungen": 162, "fk15": 183, "uhren":
2017-11-06 12:54:59 +01:00
list = [(key,value) for key,value in dict.items()]
2017-09-18 16:08:11 +02:00
2017-11-06 12:54:59 +01:00
list.sort(key=lambda tup : tup[1])
"""
2017-11-17 11:46:57 +01:00
2017-11-06 12:54:59 +01:00
"""
from spacy.tokens.doc import Doc as SpacyDoc
2017-09-18 16:08:11 +02:00
2017-11-06 12:54:59 +01:00
filepath = "/home/jannis.grundmann/PycharmProjects/topicModelingTickets/corpi/de_clean_ticket_content.bin"
2017-09-18 16:08:11 +02:00
2017-11-06 12:54:59 +01:00
# load parser
parser = spacy.load("de")
2017-09-18 16:08:11 +02:00
2017-11-06 12:54:59 +01:00
corpus_path = "/home/jannis.grundmann/PycharmProjects/topicModelingTickets/corpi/"
2017-11-06 12:54:59 +01:00
stringstorepath = corpus_path + 'de_parser/vocab/strings.json'
with open(stringstorepath) as file:
parser.vocab.strings.load(file)
2017-09-12 14:56:11 +02:00
2017-11-06 12:54:59 +01:00
vocabpath = Path(corpus_path + 'de_parser/vocab/lexemes.bin')
parser.vocab.load_lexemes(vocabpath)
2017-09-12 14:56:11 +02:00
2017-11-06 12:54:59 +01:00
spacy_vocab = parser.vocab
2017-09-12 14:56:11 +02:00
2017-11-06 12:54:59 +01:00
def readCorpus(filepath):
with open_sesame(filepath, mode='rb') as f:
for bytes_string in SpacyDoc.read_bytes(f):
yield SpacyDoc(spacy_vocab).from_bytes(bytes_string).text
2017-09-11 17:29:54 +02:00
2017-09-18 16:08:11 +02:00
2017-11-06 12:54:59 +01:00
textacy.fileio.write_file_lines(readCorpus(filepath),"/home/jannis.grundmann/PycharmProjects/topicModelingTickets/result.txt")
"""
2017-09-18 16:08:11 +02:00
2017-11-06 12:54:59 +01:00
# load raw corpus and create new one
# raw_corpus, parser = load_corpusV2(corpus_name=rawCorpus_name, corpus_path=corpus_de_path)
2017-11-06 12:54:59 +01:00
# printRandomDoc(raw_corpus)
2017-11-06 12:54:59 +01:00
"""
spacy_doc = PARSER("test")
save_obj(spacy_doc, "/home/jannis.grundmann/PycharmProjects/topicModelingTickets/doc.pkl")
2017-11-06 12:54:59 +01:00
spacy_doc2 = load_obj("/home/jannis.grundmann/PycharmProjects/topicModelingTickets/doc.pkl")
2017-11-06 12:54:59 +01:00
print("Doc: {0}".format(spacy_doc2))
2017-09-18 16:08:11 +02:00
2017-11-06 12:54:59 +01:00
jgibbsLLDA_root = "/home/jannis.grundmann/PycharmProjects/topicModelingTickets/"
2017-11-06 12:54:59 +01:00
LLDA_filepath = "{0}labeldict.txt".format(jgibbsLLDA_root)
laveldict = {'fiona': 10, 'vorlagenerstellung': 36, 'webserver': 29, 'matrix42_hilfe': 18, 'sap': 7, 'pos': 23, 'verwaltung': 4, 'lan': 1}
with open(LLDA_filepath, 'w') as file:
file.write(json.dumps(laveldict))
"""
2017-11-17 11:46:57 +01:00
2017-11-06 12:54:59 +01:00
"""
def load_corpus(corpus_path, corpus_name, lang="de"):
from pathlib import Path
2017-11-06 12:54:59 +01:00
# load parser
parser = spacy.load(lang)
2017-11-06 12:54:59 +01:00
stringstorepath = corpus_path + str(lang) + '_parser'+'/vocab/strings.json'
with open(stringstorepath) as file:
parser.vocab.strings.load(file)
2017-11-06 12:54:59 +01:00
vocabpath = Path(corpus_path + str(lang) + '_parser'+'/vocab/lexemes.bin')
parser.vocab.load_lexemes(vocabpath)
2017-11-06 12:54:59 +01:00
corpus = textacy.Corpus(parser)
2017-11-06 12:54:59 +01:00
contentpath = corpus_path + corpus_name + "_content.bin"
metapath = corpus_path + corpus_name + "_meta.json"
2017-11-06 12:54:59 +01:00
metadata_stream = textacy.fileio.read_json_lines(metapath)
spacy_docs = textacy.fileio.read_spacy_docs(corpus.spacy_vocab, contentpath)
for spacy_doc, metadata in zip(spacy_docs, metadata_stream):
corpus.add_doc(
textacy.Doc(spacy_doc, lang=corpus.spacy_lang, metadata=metadata))
return corpus
"""
2017-11-06 12:54:59 +01:00
"""
# THESAURUS
lexicalentries = "/home/jannis.grundmann/PycharmProjects/topicModelingTickets/lexicalentries_small.xml"
lexicalentries = "/home/jannis.grundmann/PycharmProjects/topicModelingTickets/lexicalentries.xml"
synsets = "/home/jannis.grundmann/PycharmProjects/topicModelingTickets/synsets.xml"
2017-11-06 12:54:59 +01:00
def build_thesaurus(path2lexicalentries):#, path2synsets):
lextree = ET.parse(path2lexicalentries, ET.XMLParser(encoding="utf-8"))
#syntree = ET.parse(path2synsets, ET.XMLParser(encoding="utf-8"))
2017-09-18 16:08:11 +02:00
2017-11-06 12:54:59 +01:00
lexroot = lextree.getroot()
#synroot = syntree.getroot()
2017-09-18 16:08:11 +02:00
2017-11-06 12:54:59 +01:00
word2synsets = {}
template = {"w1": ["s1", "s2"]}
2017-09-18 16:08:11 +02:00
2017-11-06 12:54:59 +01:00
for ro in lexroot:
for elem in ro:
if elem.tag == "LexicalEntry":
lex_dictlist = [subentry.attrib for subentry in elem]
2017-09-18 16:08:11 +02:00
2017-11-06 12:54:59 +01:00
synlist = []
string = "WORD"
2017-09-18 16:08:11 +02:00
2017-11-06 12:54:59 +01:00
for lex_dict in lex_dictlist:
if "synset" in lex_dict.keys():
2017-11-06 12:54:59 +01:00
synset = lex_dict["synset"]
synlist.append(synset)
2017-11-06 12:54:59 +01:00
if 'writtenForm' in lex_dict.keys():
string = (lex_dict["writtenForm"])
2017-11-06 12:54:59 +01:00
# replaceRockDots
string = re.sub(r'[ß]', "ss", string)
string = re.sub(r'[ö]', "oe", string)
string = re.sub(r'[ü]', "ue", string)
string = re.sub(r'[ä]', "ae", string)
2017-11-06 12:54:59 +01:00
# alle punkte raus
string = re.sub(r'[.]', "", string)
2017-11-06 12:54:59 +01:00
# alles in klammern raus
string = re.sub(r"\((.*)\)", " ", string)
2017-11-06 12:54:59 +01:00
# längeres leerzeichen normalisieren
string = textacy.preprocess.normalize_whitespace(string)
2017-11-06 12:54:59 +01:00
string = string.lower().strip()
2017-11-06 12:54:59 +01:00
word2synsets[string] = synlist
2017-11-06 12:54:59 +01:00
synset2Words = {}
template = {"s1": ["w1","w2"]}
2017-11-06 12:54:59 +01:00
for word,synset in word2synsets.items():
for syn in synset:
if syn not in synset2Words.keys():
synset2Words[syn] = [word]
else:
synset2Words[syn].append(word)
2017-11-06 12:54:59 +01:00
# nach anzhal der wörter in den strings sortieren
for synset in word2synsets.values():
synset.sort(key=lambda x: len(x.split()))
2017-11-06 12:54:59 +01:00
thesaurus = {}
thesaurus_template = {"w1" : "mainsyn"}
2017-11-06 12:54:59 +01:00
for word,synset in word2synsets.items():
try:
thesaurus[word] = synset2Words[synset[0]][0] #Ann.: erstes synonym ist das Hauptsynonym
except:
pass
return thesaurus
2017-11-06 12:54:59 +01:00
for r in synroot:
for element in r:
2017-11-06 12:54:59 +01:00
if element.tag == "Synset":
synset = []
attrib = element.attrib
id = attrib["id"]
2017-11-06 12:54:59 +01:00
if id not in synset2Words.keys():
synset2Words[id] = "WORD"
"""
2017-11-06 12:54:59 +01:00
"""
from postal.parser import parse_address
2017-11-06 12:54:59 +01:00
address = "Nicolas Rauner LS Biomaterialien und Polymerwissenschaften Fakultät Bio- und Chemieingenieurwesen TU Dortmund D-44227 Dortmund Tel: + 49-(0)231 / 755 - 3015 Fax: + 49-(0)231 / 755 - 2480"
print(parse_address(address))
2017-11-06 12:54:59 +01:00
address = "Technische Universität Dortmund Maschinenbau/Lehrstuhl für Förder- und Lagerwesen LogistikCampus Joseph-von-Fraunhofer-Str. 2-4 D-44227 Dortmund "
print(parse_address(address))
"""
2017-11-06 12:54:59 +01:00
"""
2017-11-06 12:54:59 +01:00
corpus_path = "/home/jannis.grundmann/PycharmProjects/topicModelingTickets/corpi/"
corpus_name = "testcorpus"
2017-11-06 12:54:59 +01:00
#corpi.save(corpus_path, name=corpus_name, compression=corpus_compression)
#corpi = textacy.Corpus.load(corpus_path, name=corpus_name, compression=corpus_compression)
2017-09-12 14:56:11 +02:00
2017-11-06 12:54:59 +01:00
import pathlib
2017-11-06 12:54:59 +01:00
strings_path = pathlib.Path(corpus_path + 'strings.json')
path_lexemes_bin_ = pathlib.Path(corpus_path + 'lexemes.bin')
2017-11-06 12:54:59 +01:00
PARSER.vocab.dump(path_lexemes_bin_)
nlp.vocab.load_lexemes(path_lexemes_bin_)
2017-11-06 12:54:59 +01:00
def save_corpus(corpus_path,corpus_name):
2017-09-18 16:08:11 +02:00
2017-11-06 12:54:59 +01:00
# save stringstore
stringstore_path = corpus_path + corpus_name + '_strings.json'
with open(stringstore_path, "w") as file:
PARSER.vocab.strings.dump(file)
2017-09-18 16:08:11 +02:00
2017-11-06 12:54:59 +01:00
#save content
contentpath = corpus_path + corpus_name+ "_content.bin"
textacy.fileio.write_spacy_docs((doc.spacy_doc for doc in corpi),contentpath)
2017-11-06 12:54:59 +01:00
#save meta
metapath = corpus_path + corpus_name +"_meta.json"
textacy.fileio.write_json_lines((doc.metadata for doc in corpi), metapath)
2017-09-11 17:29:54 +02:00
2017-11-06 12:54:59 +01:00
def load_corpus(corpus_path,corpus_name):
# load new lang
nlp = spacy.load("de")
2017-09-11 17:29:54 +02:00
2017-11-06 12:54:59 +01:00
#load stringstore
stringstore_path = corpus_path + corpus_name + '_strings.json'
with open(stringstore_path,"r") as file:
nlp.vocab.strings.load(file)
2017-09-11 17:29:54 +02:00
2017-11-06 12:54:59 +01:00
# define corpi
corpi = textacy.Corpus(nlp)
2017-11-06 12:54:59 +01:00
# load meta
metapath = corpus_path + corpus_name +"_meta.json"
metadata_stream = textacy.fileio.read_json_lines(metapath)
2017-11-06 12:54:59 +01:00
#load content
contentpath = corpus_path + corpus_name+ "_content.bin"
spacy_docs = textacy.fileio.read_spacy_docs(corpi.spacy_vocab, contentpath)
2017-11-06 12:54:59 +01:00
for spacy_doc, metadata in zip(spacy_docs, metadata_stream):
corpi.add_doc(
textacy.Doc(spacy_doc, lang=corpi.spacy_lang, metadata=metadata))
2017-09-11 17:29:54 +02:00
2017-11-06 12:54:59 +01:00
return corpi
2017-09-11 17:29:54 +02:00
2017-11-06 12:54:59 +01:00
save_corpus(corpus_path,corpus_name)
2017-11-06 12:54:59 +01:00
print(load_corpus(corpus_path,corpus_name))
2017-11-06 12:54:59 +01:00
"""
2017-11-06 12:54:59 +01:00
"""
def normalizeSynonyms(default_return_first_Syn=False, parser=PARSER):
#return lambda doc : parser(" ".join([tok.lower_ for tok in doc]))
return lambda doc : parser(" ".join([getFirstSynonym(tok.lower_, THESAURUS, default_return_first_Syn=default_return_first_Syn) for tok in doc]))
def getFirstSynonym(word, thesaurus, default_return_first_Syn=False):
if not isinstance(word, str):
return str(word)
word = word.lower()
# durch den thesaurrus iterieren
for syn_block in thesaurus: # syn_block ist eine liste mit Synonymen
for syn in syn_block:
syn = syn.lower()
if re.match(r'\A[\w-]+\Z', syn): # falls syn einzelwort ist
if word == syn:
return str(getHauptform(syn_block, word, default_return_first_Syn=default_return_first_Syn))
else: # falls es ein satz ist
if word in syn:
return str(getHauptform(syn_block, word, default_return_first_Syn=default_return_first_Syn))
return str(word) # zur Not, das ursrpüngliche Wort zurückgeben
def getHauptform(syn_block, word, default_return_first_Syn=False):
for syn in syn_block:
syn = syn.lower()
if "hauptform" in syn and len(syn.split(" ")) <= 2:
# nicht ausgeben, falls es in Klammern steht#todo gibts macnmal?? klammern aus
for w in syn.split(" "):
if not re.match(r'\([^)]+\)', w):
return w
if default_return_first_Syn:
# falls keine hauptform enthalten ist, das erste Synonym zurückgeben, was kein satz ist und nicht in klammern steht
for w in syn_block:
if not re.match(r'\([^)]+\)', w):
return w
return word # zur Not, das ursrpüngliche Wort zurückgeben
"""
2017-11-06 12:54:59 +01:00
"""
path2xml="/home/jannis.grundmann/PycharmProjects/topicModelingTickets/deWordNet.xml"
tree = ET.parse(path2xml, ET.XMLParser(encoding="utf-8"))
root = tree.getroot()
for r in root:
for element in r:
if element.tag == "Synset":
attrib = element.attrib
for i,subentry in enumerate(element):
if subentry.tag == "Lemma" and subentry.attrib["partOfSpeech"] == "n":
string = (subentry.attrib["writtenForm"])
# replaceRockDots
string = re.sub(r'[ß]', "ss", string)
string = re.sub(r'[ö]', "oe", string)
string = re.sub(r'[ü]', "ue", string)
string = re.sub(r'[ä]', "ae", string)
# seperate_words_on_regex:
string = " ".join(re.compile(regex_specialChars).split(string))
string_list=string.split()
if len(string_list) == 1:
nomen.append(string.lower().strip())
"""
2017-11-06 12:54:59 +01:00
"""
import re
from collections import Counter
2017-11-06 12:54:59 +01:00
def words(text): return re.findall(r'\w+', text.lower())
2017-11-06 12:54:59 +01:00
WORDS = Counter(words(open('/home/jannis.grundmann/PycharmProjects/topicModelingTickets/deu_news_2015_1M-sentences.txt').read()))
2017-11-06 12:54:59 +01:00
def P(word, N=sum(WORDS.values())):
"Probability of `word`."
return WORDS[word] / N
2017-11-06 12:54:59 +01:00
def correction(word):
"Most probable spelling correction for word."
return max(candidates(word), key=P)
2017-11-06 12:54:59 +01:00
def candidates(word):
"Generate possible spelling corrections for word."
return (known([word]) or known(edits1(word)) or known(edits2(word)) or [word])
2017-11-06 12:54:59 +01:00
def known(words):
"The subset of `words` that appear in the dictionary of WORDS."
return set(w for w in words if w in WORDS)
2017-11-06 12:54:59 +01:00
def edits1(word):
"All edits that are one edit away from `word`."
letters = 'abcdefghijklmnopqrstuvwxyz'
splits = [(word[:i], word[i:]) for i in range(len(word) + 1)]
deletes = [L + R[1:] for L, R in splits if R]
transposes = [L + R[1] + R[0] + R[2:] for L, R in splits if len(R)>1]
replaces = [L + c + R[1:] for L, R in splits if R for c in letters]
inserts = [L + c + R for L, R in splits for c in letters]
return set(deletes + transposes + replaces + inserts)
2017-11-06 12:54:59 +01:00
def edits2(word):
"All edits that are two edits away from `word`."
return (e2 for e1 in edits1(word) for e2 in edits1(e1))
2017-11-06 12:54:59 +01:00
"""
2017-11-06 12:54:59 +01:00
"""
### extract from derewo
2017-11-06 12:54:59 +01:00
#http://www1.ids-mannheim.de/kl/projekte/methoden/derewo.html
2017-11-06 12:54:59 +01:00
raw = textacy.fileio.read_file_lines("DeReKo-2014-II-MainArchive-STT.100000.freq")
2017-11-06 12:54:59 +01:00
for line in raw:
line_list=line.split()
if line_list[2] == "NN":
string = line_list[1].lower()
2017-11-06 12:54:59 +01:00
# replaceRockDots
string = re.sub(r'[ß]', "ss", string)
string = re.sub(r'[ö]', "oe", string)
string = re.sub(r'[ü]', "ue", string)
string = re.sub(r'[ä]', "ae", string)
2017-11-06 12:54:59 +01:00
nomen.append(string.lower().strip())
2017-11-06 12:54:59 +01:00
textacy.fileio.write_file_lines(nomen,"nomen2.txt")
"""
2017-11-06 12:54:59 +01:00
"""
stream = textacy.fileio.read_csv("/home/jannis.grundmann/PycharmProjects/topicModelingTickets/M42-Export/Tickets_2017-09-13.csv", delimiter=";")
content_collumn_name = "Description"
content_collumn = 9 # standardvalue
de_tickets=[]
en_tickets=[]
misc_tickets=[]
error_count = 0
for i, lst in enumerate(stream):
if i == 0:
de_tickets.append(lst)
en_tickets.append(lst)
misc_tickets.append(lst)
else:
try:
content_collumn_ = lst[content_collumn]
if detect(content_collumn_) == "de":
de_tickets.append(lst)
elif detect(content_collumn_) == "en":
en_tickets.append(lst)
else:
misc_tickets.append(lst)
2017-11-06 12:54:59 +01:00
except:
misc_tickets.append(lst)
error_count += 1
2017-11-06 12:54:59 +01:00
print(error_count)
2017-11-06 12:54:59 +01:00
textacy.fileio.write_csv(de_tickets,"M42-Export/de_tickets.csv", delimiter=";")
textacy.fileio.write_csv(en_tickets,"M42-Export/en_tickets.csv", delimiter=";")
textacy.fileio.write_csv(misc_tickets,"M42-Export/misc_tickets.csv", delimiter=";")
2017-11-06 12:54:59 +01:00
"""
2017-11-06 12:54:59 +01:00
"""
regex_specialChars = r'[`\-=~!#@,.$%^&*()_+\[\]{};\'\\:"|</>?]'
2017-11-06 12:54:59 +01:00
def stringcleaning(stringstream, funclist):
for string in stringstream:
for f in funclist:
string = f(string)
yield string
2017-11-06 12:54:59 +01:00
def seperate_words_on_regex(regex=regex_specialChars):
return lambda string: " ".join(re.compile(regex).split(string))
2017-11-06 12:54:59 +01:00
words = [
"uniaccount",
"nr54065467",
"nr54065467",
"455a33c5,"
"tvt?=",
"tanja.saborowski@tu-dortmund.de",
"-",
"m-sw1-vl4053.itmc.tu-dortmund.de",
"------problem--------"
]
2017-11-06 12:54:59 +01:00
topLVLFinder = re.compile(r'\.[a-z]{2,3}(\.[a-z]{2,3})?', re.IGNORECASE)
specialFinder = re.compile(r'[`\-=~!@#$%^&*()_+\[\]{};\'\\:"|<,./>?]', re.IGNORECASE)
2017-11-06 12:54:59 +01:00
for s in stringcleaning((w for w in words),[seperate_words_on_regex()]):
print(s.strip())
2017-11-06 12:54:59 +01:00
#print(stringcleaning(w,string_comp))
#print(bool(re.search(r'\.[a-z]{2,3}(\.[a-z]{2,3})?',w)))
#print(bool(re.search(r'[`\-=~!@#$%^&*()_+\[\]{};\'\\:"|<,./>?]',w)))
#result = specialFinder.sub(" ", w)
#print(re.sub(r'[`\-=~!@#$%^&*()_+\[\]{};\'\\:"|<,./>?]'," ",w))
2017-11-06 12:54:59 +01:00
#print(re.sub(r'\.[a-z]{2,3}(\.[a-z]{2,3})?', " ", w))
"""
2017-11-06 12:54:59 +01:00
"""
def replaceRockDots():
return lambda string: re.sub(r'[ß]', "ss", (re.sub(r'[ö]', "oe", (re.sub(r'[ü]', "ue", (re.sub(r'[ä]', "ae", string.lower())))))))
2017-11-06 12:54:59 +01:00
de_stop_words = list(textacy.fileio.read_file_lines(filepath="german_stopwords_full.txt"))
2017-11-06 12:54:59 +01:00
#blob = Text(str(textacy.fileio.read_file("teststring.txt")))#,parser=PatternParser(pprint=True, lemmata=True))
2017-11-06 12:54:59 +01:00
#print(blob.entities)
2017-11-06 12:54:59 +01:00
de_stop_words = list(map(replaceRockDots(),de_stop_words))
#LEMMAS = list(map(replaceRockDots(),LEMMAS))
#VORNAMEN = list(map(replaceRockDots(),VORNAMEN))
2017-11-06 12:54:59 +01:00
de_stop_words = list(map(textacy.preprocess.normalize_whitespace,de_stop_words))
#LEMMAS = list(map(textacy.preprocess.normalize_whitespace,LEMMAS))
#VORNAMEN = list(map(textacy.preprocess.normalize_whitespace,VORNAMEN))
2017-11-06 12:54:59 +01:00
#textacy.fileio.write_file_lines(LEMMAS,"lemmas.txt")
#textacy.fileio.write_file_lines(VORNAMEN,"firstnames.txt")
textacy.fileio.write_file_lines(de_stop_words,"german_stopwords.txt")
2017-11-06 12:54:59 +01:00
"""