Commit 55885de9 authored by Tim Seegmüller's avatar Tim Seegmüller Committed by Patrick Schlindwein
Browse files

#63 spacy word embedding

parent eb809b59
...@@ -105,6 +105,22 @@ The following parameters can be set: ...@@ -105,6 +105,22 @@ The following parameters can be set:
text (string): The text that will be summarized. text (string): The text that will be summarized.
An explanation on how the strategy works including code: https://medium.com/nerd-for-tech/extractive-text-summarization-using-sentence-transformer-and-kmeans-clustering-algorithm-e942a6b33860 An explanation on how the strategy works including code: https://medium.com/nerd-for-tech/extractive-text-summarization-using-sentence-transformer-and-kmeans-clustering-algorithm-e942a6b33860
<ins>Word Embedding</ins>
The class 'WordEmbeddingSummarizer' is implemented in 'summary_word_embedding.py'. It implements a method called 'summarize' which returns a summary created with the strategy Word Embedding using the SpaCy library.
How to call the method:
```
summaryWordEmbedding = WordEmbeddingSummarizer()
summary = summaryWordEmbedding.summarize(text)
```
The following parameters can be set:
text (string): The text that will be summarized.
An explanation on how the strategy works including code: https://www.mkbergman.com/2416/cwpk-64-embeddings-summarization-and-entity-recognition/
## learning ## learning
### spacy ### spacy
......
from fastapi import FastAPI, Request from fastapi import FastAPI, Request
from app.summary.summary_word_embedding import WordEmbeddingSummarizer
from app.utilities import generator from app.utilities import generator
from app.summary.simple_spacy_summarizer import SimpleSpacySummarizer from app.summary.simple_spacy_summarizer import SimpleSpacySummarizer
from app.summary.summary_sentence_embedding import SentenceEmbeddingSummarizer from app.summary.summary_sentence_embedding import SentenceEmbeddingSummarizer
...@@ -15,7 +17,8 @@ app = FastAPI( ...@@ -15,7 +17,8 @@ app = FastAPI(
strategies = [ strategies = [
SimpleSpacySummarizer(), SimpleSpacySummarizer(),
SentenceEmbeddingSummarizer(), SentenceEmbeddingSummarizer(),
SummaryTFIDF()] SummaryTFIDF(),
WordEmbeddingSummarizer()]
@app.get("/") @app.get("/")
......
from typing import Any
from spacy.lang.de.stop_words import STOP_WORDS
from string import punctuation
import spacy
from app.summary.summary_strategy_interface import ISummaryStrategy
class WordEmbeddingSummarizer(ISummaryStrategy):
nlp = spacy.load('de_core_news_sm')
def __init__(self):
self._id = "word_embedding"
super().__init__()
@property
def id(self):
return self._id
def summarize(self, text: str) -> str:
extra_words = list(STOP_WORDS) + list(punctuation) + ['\n']
docx = self.nlp(text)
# Technik um ein Vokabular anzulegen
freq_word: dict[Any, float] = self.__get_vocab(docx, extra_words)
# Überschrift-Generierung:
val = sorted((freq_word.values()))
max_freq = val[-3:]
# TFIDF - Term Frequency - Inverse Document Frequency:
# Maß, um die Wichtigkeit eines Wortes im Dokument ausfindig zu machen
for word in freq_word.keys():
freq_word[word] = (freq_word[word] / max_freq[-1])
# Sentence Strength - Vergibt jedem Satz im Dokument eine Gewichtung
sent_strength = self.__get_sentence_strength(docx, freq_word)
# Getting strong sentences - um die wichtigsten Sätze herauszufiltern
top_sentences = (sorted(sent_strength.values())[::-1])
top50percent_sentence = int(0.5 * len(top_sentences))
top_sent = top_sentences[:top50percent_sentence]
# Zusammenfassung erstellen:
return self.__get_summary(sent_strength, top_sent)
@staticmethod
def __get_vocab(docx, extra_words):
all_words = [word.text for word in docx]
freq_word = {}
for w in all_words:
w1 = w.lower()
if w1 not in extra_words and w1.isalpha():
if w1 in freq_word.keys():
freq_word[w1] += 1
else:
freq_word[w1] = 1
return freq_word
@staticmethod
def __get_summary(sent_strength, top_sent):
sentence_array = []
for sent, strength in sent_strength.items():
if strength in top_sent:
sentence_array.append(sent.text)
else:
continue
return ' '.join(sentence_array)
@staticmethod
def __get_sentence_strength(docx, freq_word):
sent_strength = {}
for sent in docx.sents:
for word in sent:
if word.text.lower() in freq_word.keys():
if sent in sent_strength.keys():
sent_strength[sent] += freq_word[word.text.lower()]
else:
sent_strength[sent] = freq_word[word.text.lower()]
else:
continue
return sent_strength
from unittest import TestCase
from app.summary.summary_word_embedding import WordEmbeddingSummarizer
class TestSummarizationSentenceEmbedding(TestCase):
def test_summarize_text(self):
summary_word_embedding = WordEmbeddingSummarizer()
text = ("Herr Doktor Çelik, wir sprechen regelmäßig über Ihre Arbeit "
"als Oberarzt auf der Isolierstation für Covid-19-Kranke im "
"Klinikum Darmstadt. Wie ist aktuell die Lage? Es ist ein "
"gemischtes Bild. Aktuell haben wir bei uns den Zenit der "
"Neuaufnahmen vorerst überschritten. Wir wissen noch nicht "
"genau, wie es weitergeht. Aber auf der Normalstation "
"entspannt sich die Situation etwas, wir haben in den "
"vergangenen Tagen weniger Patienten aufgenommen und "
"gleichzeitig einige Patienten entlassen können. Ganz anders "
"sieht es leider auf der Intensivstation aus: Da steigt die "
"Zahl der Covid-Patienten, gerade mussten die Räumlichkeiten "
"vergrößert werden. In der Vergangenheit war es so, dass sich "
"die Situation zuerst auf der Normalstation entspannt hat und "
"zwei Wochen später dann auf der Intensivstation. Jetzt ist "
"die Besonderheit zu beobachten, dass viele Patienten sehr "
"schnell nach der Krankenhausaufnahme auf die Intensivstation "
"müssen. Die klinischen Verläufe sind momentan schwerer. Die "
"Korrelation zwischen Patienten auf der Normal- und auf der "
"Intensivstation ist in der dritten Welle durcheinandergeraten"
". Woran liegt das? Insgesamt haben sich die Kenngrößen in der"
" Pandemie verändert. In den ersten zwei Wellen war der Anteil"
" der Infizierten, die im Krankenhaus behandelt werden müssen,"
" recht konstant – also die Hospitalisierungsrate. Das ist ein"
" wichtiger Wert für die Planung im Krankenhaus und für"
" politische Maßnahmen. Dieser Wert scheint niedriger geworden"
" zu sein, weil viele alte Menschen jetzt geimpft sind. Es"
" brauchen weniger Infizierte eine Krankenhausbehandlung."
" Gleichzeitig scheint die Intensivquote aber deutlich höher"
" zu sein – also der Anteil der Patienten im Krankenhaus, die"
" auf die Intensivstation müssen. Durch die Mutation B.1.1.7"
" hat sich der Verlauf der Krankheit verändert. Es müssen"
" viele junge Menschen unter 50 mit sehr schweren Verläufen"
" behandelt werden. Das kann eigentlich nur an der Mutation"
" liegen. Alle anderen Faktoren waren in der zweiten Welle"
" ähnlich wie jetzt. Auch die Inzidenz unter den jüngeren"
" Menschen war nicht viel niedriger. Aber in der dritten Welle"
" sehen wir viel häufiger junge Patienten mit schweren"
" Verläufen. Inwiefern haben sich die Verläufe verändert?"
" Vorher kamen die Patienten meist eine Woche nach"
" Symptombeginn mit milden oder schweren Symptomen auf die"
" Normalstation, zu Beginn der zweiten Krankheitswoche hat"
" sich oft eine Verschlechterung eingestellt. Jetzt läuft es"
" bei uns öfter so, dass die Patienten schon mit sehr wenig"
" Sauerstoff im Blut in der Notaufnahme ankommen oder schon"
" Gefäßverschlüsse haben. Einige müssen direkt auf die"
" Intensivstation – das haben wir vorher selten gesehen, jetzt"
" kommt das regelmäßig vor. Sollte der Anteil der"
" intensivpflichtigen Patienten unter den Infizierten weiter"
" ansteigen, hilft auch ein leichtes Absinken der"
" Neuinfiziertenzahlen nicht, um die Intensivstationen zu"
" entlasten. Aber noch lässt sich das nicht richtig"
" einschätzen. Es ist also noch kein Grund zur Freude, dass"
" sich der Inzidenzwert auf hohem Niveau eingependelt hat? In"
" Darmstadt liegt er schon seit ein paar Wochen um 100, da"
" scheint ein Plateau erreicht. Aber der Inzidenzwert muss in"
" seiner Bedeutung für uns neu geeicht werden. Er ist immer"
" noch eine entscheidende Größe, aber wir wissen nicht mehr"
" genau, welcher Wert welche Bedeutung für die Entwicklung im"
" Krankenhaus hat. Subjektiv wirkt es bei uns so, als müssten"
" die jüngeren Patienten im Schnitt länger behandelt werden,"
" auch das spielt eine Rolle. Sie haben eine sehr viel höhere"
" Chance, die Intensivtherapie zu überleben – aber mit einer"
" höheren Liegezeit. Wann verlegen Sie Patienten von der"
" Normal- auf die Intensivstation? Covid-Stationen sind"
" mittlerweile richtige Überwachungsstationen geworden. Es"
" werden sekundengenau die Vitalparameter der Patienten"
" überwacht, so können auch Patienten, die einen höheren"
" Sauerstoffbedarf haben, noch lange sicher bei uns behalten"
" werden. Ein Patient muss beispielsweise auf die"
" Intensivstation, wenn er mehr Sauerstoff braucht, als man"
" auf einer Normalstation verabreichen kann. Maschinelle"
" Druckbeatmung findet zum Beispiel auf der Intensivstation"
" statt. Außerdem wird ein Patient verlegt, wenn wir merken,"
" dass eine sehr unheilvolle Dynamik begonnen hat. Tritt"
" innerhalb von kurzer Zeit eine Verschlechterung der"
" Sauerstoffwerte auf und verschlechtert sich gleichzeitig das"
" Röntgenbild der Lunge, verlegen wir manchmal Patienten, die"
" ihre Luftnot selbst noch gar nicht so bemerken. Man"
" erschrickt immer noch darüber, wenn man einen Patienten, der"
" lächelt und mit uns spricht, auf die Intensivstation verlegt"
" und er dort Stunden später intubiert werden muss. Es wurde"
" bekannt, dass Asthmaspray bei Covid-Erkrankungen helfen kann"
". Beobachten Sie das auch? Zu Beginn der Pandemie wurden"
" Asthmakranke als Risikogruppe eingestuft. Man hat aber sehr"
" schnell gemerkt, dass sie eher keine schweren Verläufe haben"
". Und dann hat man überprüft, ob das vielleicht an"
" Asthmasprays mit Kortison liegt. Eine Studie deutet darauf"
" hin, dass Covid-Patienten, die das früh im Krankheitsverlauf"
" nutzen, seltener einen schweren Verlauf haben. Diese Studie"
" hat eine Hypothese generiert und ist Anlass für weitere,"
" größere Studien. Man kann aus ihr noch keine Empfehlung für"
" eine prophylaktische Einnahme oder sogar eine Nutzung ohne"
" ärztlichen Rat ableiten. Das Spray hat auch potentielle"
" Nebenwirkungen, es kann zu bakteriellen Pneumonien führen"
" oder zu Pilzinfekten im Mund. Deswegen sollte man das nur"
" nehmen, wenn es der Hausarzt oder Lungenarzt empfiehlt. Aus"
" welchen Bevölkerungsgruppen kommen Ihre Patienten aktuell?"
" Das sind Menschen, die mitten im Leben stehen: Eltern,"
" Berufstätige, oft auch Menschen aus prekären Wohn- und"
" Arbeitsverhältnissen. Die Ansteckungen finden, soweit man"
" das eruieren kann, weiterhin vor allem im familiären und"
" beruflichen Umfeld statt. In vielen Personalabteilungen wird"
" leider aus mangelndem Detailwissen sehr inkonsequent"
" gehandelt. Wenn man den Personalabteilungen oder den Chefs"
" die Entscheidungen über das Kontaktpersonenmanagement"
" überlässt, geht vieles schief. Wir haben immer wieder"
" mitbekommen, dass eine Quarantäne nach einem Risikokontakt"
" abgekürzt wurde, weil es keine Symptome gab und direkt nach"
" dem Kontakt ein Test gemacht worden ist. Das geschieht auch"
" aus Unwissen, weil Gesundheitsämter nicht eingebunden oder"
" nicht erreicht werden. Jeder Fehler kann zu weiteren"
" Infektionen führen. Wie ist die Stimmung beim"
" Krankenhauspersonal? Die Reserven sind erschöpft, wir machen"
" das seit einem Jahr. Und dass jetzt so viele jüngere"
" Patienten betroffen sind, ist emotional noch mal belastender"
". Viele junge Patienten hatten sich in Sicherheit gewähnt und"
" sind sehr erschrocken darüber, wenn es sie auf einmal so"
" hart trifft. Das geht auch an hartgesottenen Pflegenden und"
" Medizinern nicht spurlos vorbei. Es ist auf der einen Seite"
" zunehmend schwierig, Personal für die Covid-Abteilung zu"
" gewinnen. Auf der anderen Seite macht die Covid-Abteilung"
" die Abläufe in allen anderen Bereichen des Krankenhauses"
" nicht leichter. Mal müssen wir uns ausbreiten, dann wieder"
" zurückziehen, das ist schwer kalkulierbar. Es kann in einem"
" Krankenhaus grade nur sehr schlecht geplant werden, und das"
" ist immer Gift für die Stimmung beim Personal. Was halten"
" Sie davon, dass sich prominente Schauspieler unter dem"
" Schlagwort #allesdichtmachen über Corona-Maßnahmen lustig"
" machen? Der wirtschaftliche und kulturelle Schaden des"
" vergangenen Jahres ist sicher groß, es steckt also ein Kern"
" legitimer Kritik in dieser Aktion – oder zumindest eine"
" nachvollziehbare Motivation. Allerdings ist meiner Meinung"
" nach der Inhalt, den ich nicht von Querdenker-Argumenten"
" unterscheiden kann, der Zynismus und die spottende Ironie,"
" Gift für die öffentliche Diskussion, ohne dass ich im Detail"
" auf die Thesen eingehen möchte. Es ist in diesen"
" Diskussionen sehr wichtig, sachlich zu bleiben. Diese Aktion"
" ist meiner Meinung nach das Gegenteil: polemisierend,"
" populistisch, wissenschaftsleugnend und unfair. Speziell von"
" Menschen, die das Glück haben, durch Alter und"
" sozioökonomischen Status nicht zur absoluten Risikogruppe zu"
" gehören. Offen gesagt, fühlt man sich als Mediziner davon"
" verhöhnt. Ich glaube vielen Menschen in den"
" Gesundheitsberufen, aber auch Angehörigen und Patienten geht"
" es gerade so. Sie wurden kürzlich mit Astra-Zeneca geimpft."
" Warum? Für Ihr Alter ist der Impfstoff nicht mehr empfohlen."
" Einige Bundesländer lockern die Vorgaben dazu bereits. Ich"
" hatte eigentlich einen Termin für eine Biontech-Impfung,"
" habe aber darum gebeten, dass ich einen anderen Impfstoff"
" bekomme. Ich halte den Impfstoff für mich persönlich für"
" sicher und wirksam. Vor Ort konnte ich noch mit einer"
" ärztlichen Kollegin reden und wurde nach einer Beratung mit"
" dem Vakzin von Astra-Zeneca geimpft. Der Impfstoff wird"
" aktuell oft von Menschen über 60 verschmäht, bleibt häufiger"
" liegen, das bremst die Impfkampagne. Ich möchte einfach,"
" dass die Impfkampagne schnell vorankommt.")
summary = summary_word_embedding.summarize(text)
assert type(summary) == str
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment