Wie ihr schon im ersten Teil dieser kleinen Artikelserien zu LanguageTool lesen konntet, ist die Integration einer bestmöglichen Rechtschreibkorrektur in ein System gar nicht so einfach. Betreut man mehrere Rechner im Netz oder soll LanguageTool im Browser ohne den proprietären Dienst des kommerziellen Projekts funktionieren, lohnt es sich daher, selbst einen LanguageTool-Server aufzusetzen. So funkt LanguageTool weniger ins Netz und eure Texte bleiben vollständig unter eurer Kontrolle. Es braucht nur einen kleinen Rechner im eigenen LAN mit ausreichend freiem Speicherplatz, mindestens 4 GByte solltet ihr übrig haben. Optional installiert ihr euch den Server auf der eigenen Workstation.
Ursprünglich hatte ich auch gedacht, dass LanguageTool eine ideale Ergänzung für meinen Raspberry Pi wäre, der hier im LAN bereits als File-, Drucker- und Scan-Server sowie generell als stromsparende eierlegende Wollmilchsau arbeitet. Doch hier wirds leider hakelig: LanguageTool benötigt zwingend ein 64 Bit-System als Basis. Das bietet die vierte Generation des Raspberry Pi zusammen mit der ARM64-Version des Raspberry Pi OS zwar, doch am Ende scheitert es an Java-Bibliotheken, die auch auf dieser Version des Betriebssystems nur in der 32 Bit-Version vorliegen. Auf die Situation gehe ich am Ende des Artikels ein. Im Folgenden nutze ich einen kleinen Server auf Basis von Debian.
Installation von LanguageTool
Für den LanguageTool-Server benötigt ihr ein Linux-System mit einer Java-Runtime-Umgebung. Auf einem Debian-basiertem System, wie etwa auch Ubuntu oder Linux Mint, spielen die folgenden Kommandos alles Nötige ein. Die Installation der N-Gramm-Daten (zum Erkennen von Schreibfehler wie „viel“ statt „fiel“, „seit“ statt „seid“ oder „Stil“ statt „Stiel“) ist optional. Sie verbessert die Erkennung von oft falsch geschrieben Wörter, schaufelt allerdings nochmal ein paar Gigabyte mehr an Daten auf den Rechner. Für optimale Ergebnisse würde ich diesen Schritt allerdings nicht übergehen und zumindest die N-Gramm-Daten für Deutsch einspielen.
### Installation von LanguageTool: $ sudo apt install default-jre-headless unzip $ sudo apt install hunspell hunspell-de-de hunspell-en-us $ wget https://languagetool.org/download/LanguageTool-stable.zip $ unzip LanguageTool-stable.zip $ sudo mv LanguageTool-*.*/ /opt/LanguageTool $ rm LanguageTool-stable.zip
### Installation der N-Gramm-Daten für Deutsch (~3,5 GByte): $ sudo mkdir /opt/LanguageTool/ngrams $ wget https://languagetool.org/download/ngram-data/ngrams-de-20150819.zip $ sudo unzip ngrams-de-20150819.zip -d /opt/LanguageTool/ngrams $ rm ngrams-de-20150819.zip ### Installation der N-Gramm-Daten für Englisch (~8,0 GByte): $ wget https://languagetool.org/download/ngram-data/ngrams-en-20150817.zip $ sudo unzip ngrams-en-20150817.zip -d /opt/LanguageTool/ngrams $ rm ngrams-en-20150817.zip
### LanguageTool benötigt über 3 GByte Speicherplatz: $ du -hs /opt/LanguageTool 3.4G /opt/LanguageTool
Für einen ersten Test wechselt ihr nun auf dem Terminal in das Installationsverzeichnis unter /opt/LanguageTool des LanguageTool-Archivs. Das zweite Kommando aus dem folgenden Listing startet dann testweise die Server-Komponente von LanguageTool. Der Dienst lauscht auf Port 8081 auf Anfragen, mehr braucht es bei diesem Schritt auch noch nicht. Mit der Tastenkombination [Strg]+[C] beendet ihr den Dienst und kehrt wieder auf die Shell zurück.
$ cd /opt/LanguageTool $ java -cp languagetool-server.jar org.languagetool.server.HTTPServer --port 8081 2021-12-17 20:47:34.423 +0100 INFO org.languagetool.server.DatabaseAccessOpenSource Not setting up database access, dbDriver is not configured 2021-12-17 19:47:34 +0000 WARNING: running in HTTP mode, consider running LanguageTool behind a reverse proxy that takes care of encryption (HTTPS) 2021-12-17 19:47:37 +0000 Setting up thread pool with 10 threads 2021-12-17 19:47:37 +0000 Starting LanguageTool 5.5 (build date: 2021-10-02 12:33:00 +0000, 5e782cc) server on http://localhost:8081... 2021-12-17 19:47:37 +0000 Server started
Damit LanguageTool jetzt die von euch optional installierten N-Gramm-Daten integriert, erstellt ihr nun mit einem Editor wie Nano unterhalb des Ordners /opt/LanguageTool die Konfigurationsdatei languagetool.cfg. Als Inhalt fügt ihr die Ausgabe nach dem im folgenden Listing eingefügten Kommando cat languagetool.cfg ein. Mit der Tastenkombination [Strg]+[O] und [Eingabe] speichert ihr die Änderung des Editors ab, mit [Strg]+[O] geht es dann zurück auf die Shell. Selbstverständlich könnt ihr auch jeden anderen Editor verwenden.
$ sudo nano /opt/LanguageTool/languagetool.cfg $ cat languagetool.cfg languageModel=/opt/LanguageTool/ngrams/
LanguageTool-Server automatisch starten
Damit der LanguageTool-Server nun automatisch mit dem Rechner hochfährt, legt ihr eine sogenannte Unit für Systemd an. Dazu übertragt ihr den Inhalt aus dem folgenden Listing in die noch zu erstellende Datei /etc/systemd/system/languagetool.service. Orientiert euch beim Aufruf des Editors an der Nano-Zeile im vorhergehenden Listing. Alle Pfade beziehen sich auf den bei der Installation gewählten Ordner /opt/LanguageTool. Habt ihr ein anderes Installationsziel gewählt, müsst ihr die Pfade selbstverständlich in der Unit-Datei anpassen.
[Unit] Description=LanguageTool After=syslog.target After=network.target [Service] Type=simple User=languagetool Group=nogroup WorkingDirectory=/opt/LanguageTool ExecStart=/usr/bin/java -cp /opt/LanguageTool/languagetool-server.jar org.languagetool.server.HTTPServer --config languagetool.cfg --port 8081 --allow-origin "*" --public Restart=always #Environment=USER= HOME=/opt/LanguageTool [Install] WantedBy=multi-user.target
Damit LanguageTool nicht mit Root-Rechten oder mit den Rechten eures Benutzers laufen muss, legt ihr nun noch einen eigenen System-Benutzer mit dem Namen languagetool
an, ein Home-Verzeichnis braucht er nicht. Er muss sich auch nicht anmelden, daher wird auch kein Passwort gesetzt. Anschließend lasst ihr Systemd seine Konfiguration neu einlesen und aktiviert das Starten des LanguageTool-Servers. Danach ruft ihr den Dienst einmal von Hand auf und lässt euch zur Kontrolle den Status ausgeben. Der Dienst sollte sich mit active (running)
zurückmelden und auch die ersten Logeinträge ausgeben.
$ sudo adduser --system --no-create-home languagetool $ sudo systemctl daemon-reload $ sudo systemctl enable languagetool $ sudo systemctl start languagetool $ sudo systemctl status languagetool ● languagetool.service - LanguageTool ● languagetool.service - LanguageTool Loaded: loaded (/etc/systemd/system/languagetool.service; disabled; vendor preset: enabled) Active: active (running) since Sat 2021-12-18 00:36:38 CET; 4s ago Main PID: 4763 (java) Tasks: 14 (limit: 2314) Memory: 72.3M CPU: 1.569s CGroup: /system.slice/languagetool.service └─4763 /usr/bin/java -cp /opt/LanguageTool/languagetool-server.jar org.languagetool.server.HTTPServer --config languagetool.cfg --port 8081 --allow-origin * --public Dez 18 00:36:38 lui-test systemd[1]: Started LanguageTool. Dez 18 00:36:39 lui-test java[4763]: 2021-12-18 00:36:39.486 +0100 INFO org.languagetool.server.DatabaseAccessOpenSource Not setting up database access, dbDriver is not configured Dez 18 00:36:39 lui-test java[4763]: 2021-12-17 23:36:39 +0000 WARNING: running in HTTP mode, consider running LanguageTool behind a reverse proxy that takes care of encryption (HTTPS) Dez 18 00:36:39 lui-test java[4763]: 2021-12-17 23:36:39 +0000 WARNING: running in public mode, LanguageTool API can be accessed without restrictions! Dez 18 00:36:40 lui-test java[4763]: 2021-12-17 23:36:40 +0000 Setting up thread pool with 10 threads Dez 18 00:36:40 lui-test java[4763]: 2021-12-17 23:36:40 +0000 Starting LanguageTool 5.5 (build date: 2021-10-02 12:33:00 +0000, 5e782cc) server on http://localhost:8081... Dez 18 00:36:40 lui-test java[4763]: 2021-12-17 23:36:40 +0000 Server started
Chrome/Firefox und LibreOffice konfigurieren
Im Gegensatz zur LanguageTool-Erweiterung für LibreOffice arbeiten die Browser-Erweiterungen für Chrome und Firefox in der Standardkonfiguration immer mit dem kommerziellen Backend des Dienstes zusammen. Um nun euren eigenen LanguageTool-Server in die Einstellungen einzutragen, öffnet ihr (unter Chrome) über das Menü mit den drei Punkten rechts oben den Eintrag Weitere Tools | Erweiterungen. Dort sucht ihr dann die Karte zur Grammatik- und Rechtschreibprüfung – LanguageTool heraus und tippt auf den Button Details, im nächsten Dialog dann weiter auf die Optionen. In den Einstellungen zu LanguageTool angekommen, müsst ihr euch via Ausloggen vom Dienst abmelden. Danach könnt ihr unter Experimentelle Einstellungen (nur für Profis) die URL zum eigenen LanguageTool-Server in der Art http://Server-IP:Port/v2
eintragen.
Ähnlich funktioniert die Konfiguration auch mit der LanguageTool-Erweiterung für LibreOffice. Hier öffnet ihr über den Menüeintrag Extras | LanguageTool | Optionen… die Einstellungen. Die URL zu eurem Server tragt ihr dann im Reiter Allgemein ein. Im Gegensatz zur Konfiguration der Browser-Erweiterung kommt hier allerdings kein /v2
an das Ende der URL. Es genügt die Server-IP zusammen mit der Nummer des Ports einzutippen. Das N-Gramm-Verzeichis (wie im Screenshot abgebildet) müsst ihr nicht zwingend lokal abspeichern. Nutzt ihr einen Server mit eigenen N-Gramm-Daten, ist dieser Schritt natürlich nicht nötig.
LanguageTool auf einem Raspberry Pi
Im Prinzip erfüllt der Raspberry Pi die Anforderungen von LanguageTool: Ausreichend Speicherplatz lässt sich mit einer entsprechend großen Speicherkarte schaffen. Auch die Rechenkapazität der vierten Generation des Mini-Rechners genügt vollkommen. Und der Raspberry Pi 4 lässt sich zusammen mit der ARM64-Version des Raspberry Pi OS auch mit 64 Bit fahren, den Server gibt es nur in einer 64-Bit-Version. Die Installation und der Aufruf funktioniert daher auch, schiebt man allerdings die ersten Texte zur Korrektur auf den Raspberry Pi, dann meldet das System Probleme mit Hunspell und BridJ.
pi@raspberrypi:/opt/LanguageTool $ java -cp /opt/LanguageTool/languagetool-server.jar org.languagetool.server.HTTPServer --config languagetool.cfg --port 8081 --allow-origin "*" --public [...] /tmp/BridJExtractedLibraries1395486954380915815/libbridj.so: Kann die Shared-Object-Datei nicht öffnen: Datei oder Verzeichnis nicht gefunden (Possible cause: can't load AMD 64-bit .so on a AARCH64-bit platform)) [...] Caused by: java.lang.RuntimeException: Could not create hunspell instance. Please note that LanguageTool supports only 64-bit platforms (Linux, Windows, Mac) and that it requires a 64-bit JVM (Java).
Die Thematik wird bereits im Github des LanguageTool-Projekts diskutiert. Dort gibt auch einen Patch für BridJ sowie einen Workaround für Hunspell — ich habe beides allerdings hier bei mir nicht zum Laufen gebracht. Wer noch ein wenig mehr Experimentieren möchte, dem würde ich zu diesem Docker-Image für LanguageTool von Erik van Leeuwen raten. Es soll auch auf ARM64 laufen, also auch auf einem Raspberry Pi der vierten Generation. Ich habe hier bei mir allerdings LanguageTool inzwischen zufriedenstellend auf einem kleinen Intel Nuc laufen, von daher habe ich mich nicht weiter mit dem Betrieb von LanguageTool auf einem Raspberry Pi beschäftigt.
Ahhhh jetzt muss ich das ja ausprobieren. Und ich hab doch keine Zeit. Aber gut… hilft ja nix.
Kann man das Wörterbuch eigentlich zentral bearbeiten und ergänzen?
Hi Alex, gute Frage. Das schaue ich mir mal demnächst an 😀
Danke für den tollen Input. Ich hab das ganze eben mit Docker realisiert. Ich denke, man sollte das ganze aber hinter einem Reverse Proxy betreiben – wenn aus dem Internet erreichbar.
Gruß,
PLanB2008