Ich bin ein fauler Mensch. Und ich schreibe viel, u. a. beruflich und privat in Blogs, auf Twitter und auf Wissenschaftsseiten. Das Schreiben per se ist schön. Aber wenn ich mir Titel überlegen muss oder gar Schlagwörter, dann ist der Spaß vorbei. Noch weniger Spaß macht das Auswählen von Vorschaubildern, die sofort Interesse wecken sollen. Kann ich mit NLP (Natural Language Processing) aus den geschriebenen Texten automatisch Vorschläge generieren? Dieser Frage geht dieser kleine Blogpost nach. Ziel ist nicht, die perfekte automatisierte Lösung zu entwicklen, sondern einen kleinen leichten hilfreichen Proof of Concept (PoC).
Welche Daten brauche ich nun für die Vorschläge? Erst einmal den Volltext des Blogposts. Daraus generiere ich einen passenden Titel und Schlagwörter. Aus dem Titel lasse ich dann ein passendes Vorschaubild erstellen. Dafür möchte ich möglichst wenig machen müssen, so viel wie möglich soll mit wenigen Zeilen Code funktionieren. Ich möchte jeweils drei Vorschläge haben, um mir so das beste Ergebnis aussuchen zu können. Denn so toll die KIs und Möglichkeiten sind: An Kreativität bei den Vorschlägen fehlt es noch.
Daher habe ich mir ein Tool gebaut, das mir mittels NLP und einiger APIs alles generiert. Der Sourcecode liegt hier auf GitHub. Wichtig dabei ist mir so minimaler Aufwand wie möglich, sowohl in der Aufsetzung als auch in der Benutzung. Außerdem sollen auch NLP-Laien in der Lage sein, ein schönes Ergebnis zu bekommen. Daher verwende ich ausschließlich vorhandene Standard-Modelle, State-of-the-Art-APIs und Standardeinstellungen. Der Algorithmus soll innerhalb von drei Minuten durchgelaufen sein, also eine gute Zeit, sich ein Glas Wasser zu holen.
DaVincis Titel
Ich benutze für die Titel-Generierung das DaVinci2-Modell von OpenAI, es ist deren fähigstes Modell. Es ist zwar auch das teuerste Modell, liefert aber wertvolle Antworten und mit dem Free-Tier bekomme ich, was ich brauche. Nach einigem Herumspielen auf deren Playground habe ich eine gute Idee, wie ich den Titel generieren lassen kann. Einen API Key habe ich mir generiert und der Titel muss noch etwas nachbearbeitet werden. So weit, so einfach.
Der Programmcode ist hier gegeben:
1def create_title(text: str) -> str:
2 # Create title with DaVinci2 Model on OpenAI
3
4 openai.api_key = os.getenv("OPENAI_API_KEY")
5 response = openai.Completion.create(
6 model="text-davinci-002",
7 prompt=f"Fasse folgenden Text in einem kurzen deutschen Titel zusammen.\n\n{text}",
8 temperature=0.3,
9 max_tokens=64,
10 top_p=1,
11 frequency_penalty=1,
12 presence_penalty=0
13 )
14
15 return response.choices[0]["text"].replace("\n", "")
Die dort gewählten Einstellungen sind Standard. Als Beispieltexte habe ich meine anderen deutschen codecentric-Blogposts benutzt und mehrere Titelvorschläge generiert.
Für den Artikel „IIoT mal anders: Rezepte für den Pflanzen-Thermomix“ bekomme ich:
- IIoT-Lösung für autonome, deklarative Pflanzenzucht
- Die IIoT-Lösung zur autonomen, deklarativen Pflanzenzucht
Für „Vom PoC zu Produktionssoftware: Trinke, bactane, programmiere, refaktoriere, wiederhole“:
- Vom Proof of Concept zur Produktionssoftware – Ein eigenwilliges Plädoyer für Clean Code, Test-Driven Design und dafür, zu berücksichtigen, dass auch andere irgendwann auf deinen Code sch[...]
- Vom Proof of Concept zum Produkt – Tipps für den Weg dahin
- Vom Proof of Concept zum Produkt: Eine fiktive Story
Für „Entscheidungen leichter gemacht mit HOT-Tests – eine Meinung“:
- HOT-Tests: So entscheidest du dich schnell und richtig
- Annie Dukes Methode für schnelle und fundierte Entscheidungen
- Annie Dukes Methode für schnelle Entscheidungen
Und schlussendlich für „Knowledge Management – Wie ich ungeplante Texte schreibe“
- Zettelkasten: Ein Weg zum besseren Lernen und Schreiben
- Zettelkasten – ein Schlüssel für strukturiertes Lernen und Output
- Wie ich durch Knowledge Management strukturierter lerne, Blogposts schreibe und Output generiere
Es fällt auf, dass manche Titel mehrfach kommen oder sehr ähnlich sind. Manche sind abgeschnitten und müssen noch vervollständigt werden. Das Abschneiden liegt an der Einstellung max_tokens
. Aber einige Titel sind als Vorschlag großartig und zumindest für mich sehr hilfreich.
Schlagwörter oder die Wahrnehmung von Kontext
Für die Generierung der Schlagwörter nutzte ich ursprünglich KeyBert. Es ist leicht zu nutzen, hat ein deutsches Modell und als BERT-Modell ist es auch State-of-the-Art. Leider waren die Ergebnisse überraschend schlecht, wie sich in den Beispielen gleich zeigen wird. Daher verwendete ich nochmals das DaVinci2-Modell und biete die Ergebnisse beider Tools hier an.
Der Programmcode für beide Methoden ist hier:
1def create_keywords_mit_davinci(text: str) -> list[str]:
2 # Create keywords with DaVinci2 Model on OpenAI
3
4 openai.api_key = os.getenv("OPENAI_API_KEY")
5 response = openai.Completion.create(
6 model="text-davinci-002",
7 prompt=f"Gib eine Liste der fünf wichtigsten Schlagwörtern zurück.\n\n{text}",
8 temperature=0.3,
9 max_tokens=64,
10 top_p=1,
11 frequency_penalty=1,
12 presence_penalty=0
13 )
14
15 return response.choices[0]["text"].replace("\n", "").replace("-", " ")
16
17def create_keywords(fulltext: str) -> list[str]:
18 nlp = spacy.load("de_dep_news_trf")
19
20 keyword_model = KeyBERT(model=nlp)
21 keywords = keyword_model.extract_keywords(fulltext, highlight=False, keyphrase_ngram_range=(1, 1),
22 stop_words=list(STOPWORDS))
23
24 return [keyword for keyword, weight in keywords] # Remove the weights and only return keywords
Was wir für die Blogposts erhalten:
Für den Artikel „IIoT mal anders: Rezepte für den Pflanzen-Thermomix“ bekomme ich:
- DaVinci2: IIoT, Lösung, autonome, deklarative Pflanzenzucht, Hardware-agnostisch, Reparaturen und Updates in Produktion
- KeyBert: benötigen, Automatisierung, gesondert, aufwendig, gleichzeitig
Für „Vom PoC zu Produktionssoftware: Trinke, bactane, programmiere, refaktoriere, wiederhole“:
- DaVinci2: Proof of Concept (PoC), Produktionssoftware, Clean Code, Test-Driven Design, Trinken
- KeyBert: streik, sinngemäß, speziell, wirklich, gesondert
Für „Entscheidungen leichter gemacht mit HOT-Tests – eine Meinung“:
- DaVinci2: Das Buch ist eine Hilfestellung für mich, um mein Bauchgefühl zu hinterfragen und mit Zahlen zu unterfüttern., HOT-Tests, Annie Duke, Zukunft
- KeyBert: bilden, wirklich, liegt, müssen, wahrscheinlich
Und schlussendlich für „Knowledge Management – Wie ich ungeplante Texte schreibe“
- DaVinci2: Vorher hätte ich dafür eine Woche gebraucht. Zettelkasten, Knowledge Management, Learning, Writing, Output
- KeyBert: lässt, gleichzeitig, jahrelang, bewusst, liegt
Die Qualität dieser Schlagwörter lässt wirklich arg zu wünschen übrig. Ggf. muss hier weiter an den Stop Words, an den Modell-Parametern und auch am zugelassenen Vokabular gefeilt werden. Aber zumindest für einen ersten Schritt erkennt DaVinci2 sehr gut, worum es geht. KeyBert scheint auf häufige Wörter zu schauen und liegt eher daneben. Da das KeyBert-Modell kostenlos und lokal läuft, kann es aber durchaus spannend für Anwendungen sein, die sich nicht auf eine stabile Internetverbindung verlassen können.
Vorschaubilder durch Text2Image
Spätestens seit Imagen und DALL-E ist klar: Die KI-gestützte Bildgenerierung aus Text ist mächtig. Noch sind solche Modelle in Closed Beta und es wird wohl noch etwas dauern, bis wir sie alle ausprobieren können. Aber es gibt bereits Anbieter mit entsprechenden APIs für weniger mächtige Modelle. Für meinen Ansatz habe ich NLPCloud verwendet. Es gibt viele weitere Anbieter, aber hier war das API auf den ersten Blick leicht nutzbar. Da die Schlagwörter eine schlechte Qualität hatten, füttere ich das API stattdessen mit den Titeln.
Das API liefert mir die URL des generierten Bildes zurück, die ich herunterlade und mit einem Timestamp versehe, um mehrere Bilder ausprobieren zu können:
1def generate_preview(filename: str, title: str):
2 api_key = os.getenv("NLPCLOUD_API_KEY")
3 client = nlpcloud.Client("stable-diffusion", api_key, gpu=True, lang="de")
4
5 # If this yields 429 - wait a while
6 response = client.image_generation(f"Erstelle ein Bild aus diesem Titel: {title}")
7
8 # Download image
9 response = requests.get(response["url"])
10
11 file_name = f"{filename}_preview_{datetime.datetime.now().timestamp()}.png"
12 # Save the image
13 if response.status_code == 200:
14 with open(file_name, "wb") as f:
15 f.write(response.content)
16 print(f"Preview created for '{filename}'.")
Und natürlich haben wir alle darauf gewartet, hier sind die Bilder:
„IIoT mal anders: Rezepte für den Pflanzen-Thermomix“
„Vom PoC zu Produktionssoftware: Trinke, bactane, programmiere, refaktoriere, wiederhole“
„Entscheidungen leichter gemacht mit HOT-Tests – eine Meinung“
„Knowledge Management – Wie ich ungeplante Texte schreibe“
Einige der Bilder sind schräg, etwa für den Entscheidungspost. Dass beim Knowledge Management ein Zettelkasten vorgeschlagen wird, ist super. Und dass beim IIoT-Projekt einige Pflanzen aussehen wie Cannabis ist auch spannend. Als Inspiration helfen sie auf jeden Fall.
Fazit
Es ist spannend, mit wie wenig Aufwand aus einem Volltext Titel, Schlagwörter und ein Preview erstellt werden. All das benötige ich für meine Blogposts und ich freue mich einfach über diese Vorschläge und Inspirationen. Komplett automatisiert würde ich die Ergebnisse aber noch nicht in den Blogpost stecken. Mit einigen Feintunings lässt sich viel gewinnen und aufgrund der vielen Anbietenden solcher NLP-Lösungen findet sich gewiss schnell eine Verbesserung. Im Rahmen dieses Blogposts reicht es aber völlig.
Und hier habt es euch bestimmt schon gedacht – Titel, Preview und Schlagwörter für diesen Blogpost sind auch autogeneriert.
Weitere Beiträge
von Robert Meißner
Dein Job bei codecentric?
Jobs
Agile Developer und Consultant (w/d/m)
Alle Standorte
Weitere Artikel in diesem Themenbereich
Entdecke spannende weiterführende Themen und lass dich von der codecentric Welt inspirieren.
Gemeinsam bessere Projekte umsetzen.
Wir helfen deinem Unternehmen.
Du stehst vor einer großen IT-Herausforderung? Wir sorgen für eine maßgeschneiderte Unterstützung. Informiere dich jetzt.
Hilf uns, noch besser zu werden.
Wir sind immer auf der Suche nach neuen Talenten. Auch für dich ist die passende Stelle dabei.
Blog-Autor*in
Robert Meißner
Product Owner, Project Manager
Du hast noch Fragen zu diesem Thema? Dann sprich mich einfach an.
Du hast noch Fragen zu diesem Thema? Dann sprich mich einfach an.