Natural Language Processing in Theorie und Praxis Sprachmodelle in der Softwareentwicklung

Ein Gastbeitrag von Marvin Forstreuter

Anbieter zum Thema

Die maschinelle Sprachverarbeitung, auch Natural Language Processing oder kurz NLP, erlaubt nicht nur smarte Übersetzungstools. Auch Entwickler profitieren im Arbeitsalltag von ihr. Aber wie genau funktioniert das?

Wortvorhersage. Ein Sprachmodell ist eine Wahrscheinlichkeitsverteilung für Wortfolgen.
Wortvorhersage. Ein Sprachmodell ist eine Wahrscheinlichkeitsverteilung für Wortfolgen.
(Bild: VIT)

Was ist ein Sprachmodell?

Ein Sprachmodell ist eine Repräsentation der Struktur einer Sprache. Unter einer Sprachstruktur ist hier die Art und Weise zu verstehen, wie die grammatischen und lexikalischen Einheiten, die eine Sprache bilden, organisiert sind und die Regeln, nach denen sie funktioniert. Sprachstrukturen können z. B. Wortfolgewahrscheinlichkeiten oder syntaktische Beziehungen sein.

Sprachmodelle sind in der Computerlinguistik essenziell, da sich die natürliche Sprache nicht wie formale Sprachen vollständig definieren lässt. In der Programmiersprache „C“ ist die Benutzung der Sprache durch die vorgegebene Grammatik eindeutig geregelt. Das ist möglich, da das Vokabular (der Befehlssatz) klein ist und selten Änderungen unterliegt.

Die natürliche Sprache ist anders aufgebaut, sie ist dynamisch, das heißt, das verwendete Vokabular wächst stetig, Wörter verlieren oder ändern ihre Bedeutung. Eine vollständige formale Definition der Sprache ist daher nicht oder nur temporär möglich (und das nur mit enormem Aufwand). Mithilfe heuristischer Verfahren lässt sich jedoch ein Sprachmodell erstellen, in dem Beispieldaten der Sprache analysiert und daraus Rückschlüsse über die inhärente Struktur der Sprache gezogen werden.

Wie funktioniert es?

Ein Sprachmodell ist grob gesagt das Verständnis, das ein Computer über die menschliche Sprache entwickelt hat. Es wird genutzt, um Wortfolgewahrscheinlichkeiten zu berechnen. Dies ist in der maschinellen Sprachverarbeitung nützlich, um kohärente und logische Sätze zu formulieren.

Grundlage ist die Annahme, dass bestimmte Wörter in einer benachbarten Wortumgebung (Wortkontext) häufiger vorkommen als in einer anderen. So ist etwa die Auftrittswahrscheinlichkeit des Verbs „schwimmen“ im Satz: „Ich gehe ...“, viel wahrscheinlicher als die des Verbs „fliegen“.

Das heißt: Um eine möglichst präzise Wortvorhersage zu treffen, muss ein Sprachmodell über ein Vokabular verfügen, in dem möglichst viele Wortumgebungen definiert sind, damit es sich an ihnen orientieren kann. Dieses Vokabular muss allerdings zuerst vom Sprachmodell „erlernt“ werden, da es unpraktikabel ist, dieses manuell zu befüllen. Dies tun Sprachmodelle, indem sie große Trainings-Korpora analysieren und so entsprechende Wahrscheinlichkeiten für bestimmte Wortumgebungen ermitteln.

Welche Arten von Sprachmodellen gibt es?

Es existieren im Wesentlichen zwei Arten von Sprachmodellen: statistische und neuronale Modelle.

  • Ein statistisches Sprachmodell ist das N-Gramm-Sprachmodell, es berechnet die Wahrscheinlichkeit zur Vorhersage einer Wortfolge anhand N- vorheriger Wörter (Wortvorgeschichte).
  • Neuronale Sprachmodelle berechnen den Wortkontext mithilfe eines Künstlichen Neuronalen Netzes auf Basis einer mathematischen Funktion, die dafür sorgt, dass ähnliche Wörter auch eine ähnliche mathematische Repräsentation haben (sog. Wortvektoren).

Letztere Modelle erzeugen deutlich bessere Wortvorhersagen als erstere, allerdings ist das Training solcher neuronalen Sprachmodelle auch deutlich aufwendiger.

Wird das Sprachmodell nicht aus einem Korpus von Texten der natürlichen Sprache erstellt, sondern aus Programmcodes, lassen sich sogar die Entwicklungs- und Wartungsprozesse von Software beschleunigen und die Softwarequalität insgesamt verbessern.

Unterstützung beim Code-Refactoring

Forscher aus der Schweiz (Bielik et al. 2016) haben gezeigt, dass sie mit ihrem Sprachmodell in der Lage waren, Muster zu erkennen, die mit schadhaften Verhalten (malicious programm behavior) oder Code-Smells zusammenhängen. Als Code-Smell wird im Allgemeinen ein funktionierender, aber schlecht strukturierter Code bezeichnet.

Solche Codeabschnitte können auf ein tieferliegendes Problem in der Programmierung hindeuten und legen daher eine Überarbeitung der „übelriechenden Codeabschnitte“ nahe (Code Refactoring). Das können zum Beispiel Codeabschnitte sein, die unnötig kompliziert gestaltet wurden und daher ein Erweitern bzw. Warten erschweren.

Wie der Name schon andeutet, lassen sich solche Abschnitte schnell ausfindig machen. In großen Softwareprojekten kann dies jedoch zu einem enormen zeitlichen Aufwand führen. Ein Sprachmodell, das fähig ist, solche Muster zu erkennen und den Entwicklern bereits eine Vorauswahl von potenziellen zu überarbeitenden Programmdateien zu liefern, kann die Überarbeitungszeit erheblich verkürzen.

Automatische Bug Detection

Ein anderes Forscherteam aus China (Xuan Huo und Ming Li, 2017 ) setzte Sprachmodelle ein, um Programmfehler automatisiert zu entdecken. Sie sind damit führend auf dem Gebiet der automatischen Bug Detection. Sie erreichten dies, indem sie ihr Sprachmodell mit einer großen Anzahl Bug-Reports trainierten. Das so erstellte Sprachmodell war anschließend in der Lage, fehlerhafte Programmdateien anhand von eingereichten Bug-Reports zu ermitteln.

Jetzt Newsletter abonnieren

Täglich die wichtigsten Infos zu Softwareentwicklung und DevOps

Mit Klick auf „Newsletter abonnieren“ erkläre ich mich mit der Verarbeitung und Nutzung meiner Daten gemäß Einwilligungserklärung (bitte aufklappen für Details) einverstanden und akzeptiere die Nutzungsbedingungen. Weitere Informationen finde ich in unserer Datenschutzerklärung.

Aufklappen für Details zu Ihrer Einwilligung

Bug-Reports sind Berichte von Endnutzern, die Beschreibungen von Situationen enthalten, in denen das Programm, mit denen sie arbeiten, nicht wie erwartet funktioniert. Sie fungieren als Schnittstelle zwischen Anwender und Softwareentwickler, damit der Entwickler über das berichtete Fehlverhalten Bescheid weiß und es beheben kann.

Das Problem bei diesem Verfahren ist, dass die Entwickler bei großen Software-Systemen regelrecht von Anfragen überschüttet werden und somit vielen Anfragen nicht zeitgerecht nachkommen können. Zumal die schwierigste Aufgabe das Finden, Replizieren und Beheben des Fehlers noch vor ihnen steht.

Softwareentwicklung

Die bisherigen vorgestellten Ansätze in der KI-gestützten Softwareentwicklung waren nur sehr fach- bzw. aufgabenspezifisch. Die Arbeit von zwei Forschern der Universität Kiel (Sousa und Hasselbring, 2021) zeigt, dass sich die allgemeine Softwarequalität mithilfe eines modernen neuronalen Sprachmodells verbessern lässt.

Dabei verwendeten sie das Sprachmodell „BERT“ und trainierten es mithilfe einer speziellen Pipeline zur Datenerfassung auf ein generelles Verständnis der Programmiersprache Java. Damit war es erstmals möglich, die syntaktischen Features einer Programmiersprache in die Textverarbeitung einzubeziehen. Vorherige Arbeiten anderer Forscher betrachteten den Programmcode als bloßen Text und vernachlässigten die programmiersprachlichen Eigenheiten.

Die vorgestellte Pipeline kann auch dazu verwendet werden, ein BERT-Sprachmodell für eine andere Programmiersprache zu erzeugen. Mit diesem Vorgehen ist es erstmals möglich, mit einem einzigen Sprachmodell mehrere Aspekte der Softwarequalität anzugehen und somit eine gemeinsame Basis für zukünftige KI-Unterstützung Softwareentwicklung zu erschaffen.

Fazit

NLP ist längst nicht mehr die erfolglose Technik, die bis vor wenigen Jahren noch nicht mal in der Lage war, Telefonkontakte per Spracheingabe vernünftig auszuwählen. Die Beispiele haben gezeigt, dass Sprachmodelle als Werkzeug der maschinellen Sprachverarbeitung tatsächlich helfen können – Künstliche Intelligenz ist dabei der Schlüsselfaktor.

Marvin Forstreuter
Marvin Forstreuter
(Bild: adesso SE)

Wie die Zusammenarbeit aussehen könnte, zeigt seit neuestem auch das Projekt „Copilot“ von GitHub, das Entwicklern Code-Vorschläge unterbreitet. Es generiert dabei ganze Codeblöcke auf Basis eines neuronalen Sprachmodells. Wie die Zusammenarbeit ausgeht, ist noch ungewiss, aber eins ist sicher: Es bleibt spannend!

* Marvin Forstreuter ist Trainee in der Line of Business Insurance bei adesso SE. Sein Schwerpunkt ist die Softwareentwicklung mit Java. Darüber hinaus befasst er sich mit Themen rund um die Bereiche maschinelle Sprachverarbeitung und künstliche Intelligenz.

(ID:48503042)