85.1.29. pepsi-detect-language¶
classify one message the way the pipeline would, offline
- Handbuchabschnitt:
1
85.1.29.1.1. Name¶
pepsi-detect-language - Diagnose- und Tuning-Werkzeug für Pepsis Spracherkennung.
85.1.29.1.2. Übersicht¶
pepsi-detect-language [OPTIONS] [FILE]
85.1.29.1.3. Beschreibung¶
pepsi-detect-language beantwortet eine Frage: Was würde pepsi-stage-detect-language(1) für diese Nachricht festhalten? Es liest eine einzelne Nachricht, lässt die eigene Klassifikation der Stage darüber laufen und schreibt den resultierenden state.language-Wert — und sonst nichts — auf die Standardausgabe.
Es ist ein Diagnose- und Tuning-Werkzeug, kein Teil der Pipeline. Es öffnet nie die Datenbank, berührt nie die Warteschlange und braucht keinen pepsi.workqueue-Datensatz, sodass es gefahrlos an einer gespeicherten Kopie einer im Produktivbetrieb falsch klassifizierten Nachricht ausgeführt werden kann, auf einem Host, der nicht der Mailserver ist, und wiederholt mit verschiedenen –languages-Mengen, während man die zu konfigurierende Option eingrenzt.
Verwenden Sie es, um:
eine Fehlklassifikation aus einer gespeicherten Nachricht nachzustellen und mit –explain zu sehen, warum der Detektor gewählt hat, was er gewählt hat — den extrahierten Text, die nach der Filterung verbliebene Prosa (das, was der Detektor tatsächlich gesehen hat) und die Konfidenz jeder Kandidatensprache;
die LANGUAGES-Option der Stage abzustimmen: Eine Kandidatensprache, die im Verkehr nie vorkommt, konkurriert dennoch um Wahrscheinlichkeit, und sie zu streichen ist oft die ganze Lösung. Führen Sie dieselbe Nachricht mit –languages gegen verschiedene Mengen erneut aus, bis die Antwort stimmt, und konfigurieren Sie dann diese Menge;
ein Korpus in einer Schleife zu prüfen (
for m in Maildir/cur/*; do …; done), vor und nach einer Konfigurationsänderung.
Es ist dieselbe ausführbare Datei wie pepsi-stage-detect-language(1), als zweiter Name dafür installiert — die beiden teilen sich den gesamten Klassifikationspfad und die statisch gelinkten Sprachmodelle, weshalb sie auch gemeinsam paketiert sind. Welches Programm läuft, wird aus dem Namen gewählt, unter dem es aufgerufen wurde, sodass ein Build ohne einen solchen Symlink das Werkzeug als pepsi-stage-detect-language pepsi-detect-language [OPTIONS] [FILE] erreicht, was sich selbst unter dem zweiten Namen erneut ausführt.
85.1.29.1.4. Eingabe¶
Die Nachricht wird aus FILE gelesen, oder von der Standardeingabe, wenn keine Datei angegeben ist (oder wenn FILE - ist). Eine Nachricht je Aufruf. Drei Eingabeformen werden angenommen, und es wird erkannt, welche davon übergeben wird:
- mbox
Eine führende
From_-Trennzeile — die mbox-Konvention:From, gefolgt von einem Leerzeichen und dem Umschlagabsender — wird entfernt, und mboxrd->From-Quoting im Nachrichtentext wird rückgängig gemacht. (Das Entquoten geschieht nur, wenn tatsächlich eine Trennzeile gefunden wurde: sonst ist eine mit>Frombeginnende Zeile der zitierte Text von jemandem.) Beachten Sie, dass eine Datei mit mehreren mbox-Nachrichten als eine Nachricht behandelt wird; teilen Sie sie zuvor auf.- eine vollständige RFC-5322-Nachricht
Wird unverändert verwendet, genau so, wie die Stage sie sähe, nachdem pepsi-ingress(1) sie gespeichert hat.
- ein nackter Nachrichtentext ohne Header-Block
Wird in einen minimalen
Content-Type: text/plain-Header gewickelt — derutf-8oderiso-8859-1deklariert, je nachdem, was die Bytes sind —, sodass der MIME-Parser ihn als Text liest.
Ein Header-Block wird nur dann erkannt, wenn jede Zeile vor der ersten Leerzeile ein Header-Feld oder eine gefaltete Fortsetzung davon ist. Das ist es, was einen Nachrichtentext, der mit etwas wie Re: the meeting beginnt, davor bewahrt, für einen einfeldrigen Header-Block gehalten zu werden; –body-only erzwingt die Lesart als nackter Nachrichtentext, wenn die Eingabe wirklich ein solcher ist.
Zeilenenden werden auf CRLF normalisiert, wie es pepsi-ingress(1) tut, sodass eine aus einer Datei gespeicherte Nachricht identisch zu der Kopie klassifiziert wird, die die Warteschlange hielt.
Der Header-Block bleibt erhalten, und das ist Absicht. Kein Header-Text erreicht je den Klassifizierer — die Stage extrahiert nur eingebettete Teile des Nachrichtentexts, sodass Subject:, From: und die Received:-Spur aus dem Klassifizierten herausfallen. Aber Content-Type, charset und Content-Transfer-Encoding entscheiden, was der Nachrichtentext ist: Entfernt man sie, würde eine Quoted-Printable-, Base64- oder HTML-Nachricht anhand ihrer Kodierung statt anhand ihrer Prosa klassifiziert — was eine der Fehlklassifikationen ist, die dieses Werkzeug finden soll.
85.1.29.1.5. Ausgabe¶
Bei Erfolg eine Zeile auf der Standardausgabe: die Accept-Language-artige Zeichenkette, die die Stage in state.language einmergen würde, zum Beispiel:
en;q=1, de;q=0.45
Sonst wird nie etwas auf die Standardausgabe geschrieben, sodass der Wert direkt eingefangen werden kann:
lang=$(pepsi-detect-language message.eml)
Wenn die Stage keine Sprache festhalten würde — die Nachricht hat keinen eingebetteten Text, nichts von diesem Text ist Prosa (ein Nachrichtentext aus lauter URLs), es gibt zu wenig Prosa zum Klassifizieren, oder keine Kandidatensprache erreicht die 5-%-Konfidenzschwelle —, bleibt die Standardausgabe leer und der Grund wird auf der Standardfehlerausgabe gemeldet. Das ist kein Fehler: Es ist das, was die Stage tut, indem sie die Nachricht ohne hinzugefügten language-Schlüssel weiterschaltet.
Das Format ist in pepsi-stage-detect-language(1) und pepsi.state(7) beschrieben.
85.1.29.1.6. Optionen¶
- –languages CODES
Erkennt unter diesen Kandidatensprachen statt unter den konfigurierten, geschrieben wie die LANGUAGES-Option der Stage (durch Leerraum oder Kommata getrennte ISO-639-1-Codes, mindestens zwei, z. B.
"en de fr";*wählt jede unterstützte Sprache, wie in der Option). Die Konfigurationsdatei wird dann überhaupt nicht gelesen, sodass dies auch der Weg ist, das Werkzeug auf einem Host ohne Pepsi-Konfiguration auszuführen. Dies ist die Stellschraube für das Tuning: Die Kandidatenmenge ist die Option, die eine falsche Antwort am häufigsten erklärt — vergleichen Sie--languages '*'(was der pepsi-setup-Assistent standardmäßig konfiguriert) mit einer Menge, die auf die Sprachen eingeengt ist, die Ihr Verkehr tatsächlich enthält.- –stage NAME
Nimmt die Kandidatensprachen aus
[stage-NAME]. Nur nötig, wenn eine Konfiguration die Erkennungs-Stage mehr als einmal ausführt (zum Beispiel auf dem eingehenden und dem Submission-Pfad mit verschiedenen Sprachmengen); bei einer einzelnen solchen Stage wird sie automatisch gefunden.- –body-only
Behandelt die Eingabe als nackten Nachrichtentext, auch wenn sie mit etwas beginnt, das wie ein Header-Block aussieht.
- –explain
Schreibt die Zwischenschritte auf die Standard**fehler**ausgabe: wie die Eingabe eingerahmt war, die Kandidatenmenge und woher sie stammte, den extrahierten Nachrichtentext, die nach dessen Filterung verbliebene Prosa (das, was dem Detektor tatsächlich übergeben wurde, und ob es aus der HTML-Alternative kam), die Konfidenz jeder Kandidatensprache und welche davon die Top-drei- und die 5-%-Regel behalten haben, sowie das Endergebnis. Die Standardausgabe bleibt unberührt, sodass –explain jedem Aufruf hinzugefügt werden kann, ohne ein Skript zu stören, das das Ergebnis liest.
Die beiden Textblöcke sind diejenigen, die man zusammen lesen sollte. Die Stage klassifiziert den Nachrichtentext nicht so, wie er extrahiert wurde: Sie entfernt zuerst alles, was kein Wort sein kann — URLs, E-Mail-Adressen, Base64-Blöcke, DNS-Einträge, Bezeichner —, weil solche Token in keiner Sprache Wörter sind und ein von ihnen beherrschter Nachrichtentext nach ihnen statt nach seiner Prosa klassifiziert wird. Wenn eine Klassifikation falsch aussieht, lautet die Frage meist, was im zweiten Block steht, nicht im ersten.
- -c FILE, –config FILE
Liest die Konfiguration aus FILE, statt die Standardorte zu durchsuchen. Nur die Kandidatensprachenmenge wird daraus entnommen.
- -L LOGLEVEL, –log LOGLEVEL
Setzt die Log-Ausführlichkeit (Standardwert
info). Die Log-Ausgaben gehen auf die Standardfehlerausgabe.- -v, –verbose
Zeigt Log-Meldungen aus allen Quellen.
- -h, –help; -V, –version
Gibt eine Verwendungsübersicht / die Version aus und beendet sich.
85.1.29.1.7. Konfiguration¶
Ohne –languages ist die Kandidatenmenge die LANGUAGES-Option der konfigurierten Erkennungs-Stage — des einen [stage-<name>]-Abschnitts, dessen PROGRAM pepsi-stage-detect-language ist, oder desjenigen, den –stage benennt. Führt die Konfiguration keine solche Stage aus, wird die eingebaute Standardmenge der Stage verwendet und eine Warnung sagt das. Keine andere Option wird gelesen, und nichts wird geschrieben.
85.1.29.1.8. Exit-Status¶
- 0
Die Nachricht wurde klassifiziert. Die Standardausgabe enthält die
state.language-Zeichenkette oder ist leer, wenn die Stage keine festhalten würde.- 1
Die Nachricht konnte nicht gelesen werden, die Konfiguration konnte nicht geladen werden (geben Sie –languages an, um ohne eine zu laufen), –stage benannte einen Abschnitt, der nicht existiert oder der ein anderes Programm ausführt, mehrere Stages führen das Programm aus und keine wurde benannt, oder –languages war ungültig. Der Grund wird auf die Standardfehlerausgabe geschrieben.
85.1.29.1.9. Beispiele¶
Was hat die Pipeline aus dieser Nachricht gemacht?
pepsi-detect-language -c /etc/pepsi/pepsi.conf message.eml
Warum hat sie das gesagt?
pepsi-detect-language --explain message.eml >/dev/null
Würde eine engere Kandidatenmenge es beheben?
pepsi-detect-language --languages "en de" message.eml
Einen auf dem Terminal getippten Nachrichtentext klassifizieren (mit Strg-D beenden):
pepsi-detect-language --languages "en de fr" -
Ein Maildir überblicken, bevor LANGUAGES geändert wird:
for m in ~/Maildir/cur/*; do
printf '%s\t%s\n' "$(pepsi-detect-language --languages "en de" "$m")" "$m"
done | sort | uniq -c
85.1.29.1.10. Siehe auch¶
pepsi-stage-detect-language(1), pepsi-stage-block-language(1), pepsi-stage-vacation(1), pepsi.conf(5), pepsi.state(7)
85.1.29.1.11. Fehler¶
Melden Sie Fehler an den Pepsi-Issue-Tracker.