Interaktives Ausgeben von BPE mithilfe von Python-Flüchen

Es verwendet Curses, eine Bibliothek zum Erstellen von TUI (Text User Interface), um den Lernfortschritt von BPE auf nette Weise auszugeben.

Der gesamte Code wird in gist hochgeladen. :arrow_right: bpe_curses.py

Umgebung

BPE

(Wenn Sie nur etwas über Flüche wissen möchten, überspringen Sie es)

Was ist BPE?

Die Byte-Paar-Codierung ist eine Technik, die auch im Tokenizer für neuronale maschinelle Übersetzung Satzstück verwendet wird. Der erste Auftritt war Neuronale maschinelle Übersetzung seltener Wörter mit Unterworteinheiten (ACL2016), und die Implementierung wird auch in diesem Dokument beschrieben.

Wenn Sie beispielsweise Wörter wie "niedriger", "neuer", "breiter" haben, können Sie die Anzahl der Vokabeln reduzieren, indem Sie das häufige "e r" als ein Symbol "er" behandeln.

Wie Sie sehen können, handelt es sich, obwohl es in NLP als Unterwortteilungsalgorithmus bekannt ist, in erster Linie um eine Datenkomprimierungsmethode, die in [Byte vs. Encoding (Wikipedia)](https://ja.wikipedia.org/wiki/Byte vs. Encoding) geändert wird. Das Prinzip wird ebenfalls eingeführt.

Dieses Mal wird basierend auf dem Code des Papiers der Komprimierungsfortschritt ausgegeben.

Übersicht über die BPE-Implementierung

Für die Implementierung von BPE habe ich nur den Code im Papier verwendet und Typhinweise hinzugefügt.

Die Implementierung besteht aus zwei Hauptfunktionen, "get_status ()" und "merge_vocab ()".

--get_status nimmt ein Vokalwörterbuch und überprüft die Häufigkeit von Wortkombinationen.

  def get_stats(vocab: Dict) -> DefaultDict:
    pairs = collections.defaultdict(int)
    for word, freq in vocab.items():
        symbols = word.split()
        for i in range(len(symbols)-1):
            pairs[symbols[i], symbols[i+1]] += freq
    return pairs
def merge_vocab(pair: List, v_in: Dict) -> Dict:
    v_out = {}
    bigram = re.escape(' '.join(pair))
    p = re.compile(r'(?<!<\S)' + bigram + r'(?!\S)')
    for word in v_in:
        w_out = p.sub(''.join(pair), word)
        v_out[w_out] = v_in[word]
    return v_out

Dieses Mal zeigen wir den Zustandsübergang des Wortes nach "merge_vocab" an.

Curses

Was ist Flüche?

Die Curses-Bibliothek bietet terminalunabhängige Bildschirmzeichnung und Tastaturverarbeitung für textbasierte Terminals (Terminals) wie VT100s, Linux-Konsolen und Emulationsterminals, die von verschiedenen Programmen bereitgestellt werden. Aus Curses Programming with Python

curses ist ein Standard-Python-Modul. (Es scheint nicht in der Windows-Version enthalten zu sein ...) Wenn Sie Flüche verwenden, können Sie ganz einfach so etwas wie eine CUI-App erstellen.

Zum Beispiel ist life.py in der Python-Demo [Life Game](https: //) auf dem Terminal. ja.wikipedia.org/wiki/life game) code. lifepy.gif

Wie man Flüche benutzt

Wir werden die Anzeige von Zustandsübergängen mit Flüchen implementieren.

Verwenden wir Wrapper

Wie in Curses Programming with Python beschrieben, wird curses.wrapper verwendet, um die Komplexität der Fehlerbehandlung und -initialisierung zu vermeiden. Verwenden Sie die Funktion () .

import curses

def main(stdscr):
	#Aufruf der Fluchverarbeitung mit stdscr

if __name__ == '__main__':
    curses.wrapper(main)

Grundbetrieb

Der grundlegende Verarbeitungsablauf ist wie folgt.

--stdscr.addstr (str) : Fügen Sie der aktuellen Position den Text str hinzu --stdscr.refresh () : Anzeige aktualisieren

for i in range(10):
    stdscr.addstr('{}\n'.format(i))
    stdscr.refresh()
    stdscr.getkey()

Im Fall des obigen Codes wird die Nummer angezeigt und der Wartezustand wiederholt.

Verhindert Bildschirmvorsprungsfehler

Der Versuch, in einem Bereich anzuzeigen, der länger als die Höhe des Bildschirms ist, führt zu einem Fehler.

Um Fehler zu vermeiden, ist es erforderlich, zuerst die Größe der aktuellen Anzeige zu ermitteln und dann nicht außerhalb des Bereichs der Anzeige anzugeben. Sie können die Größe mit getmaxyx () erhalten.

stdscr_y, stdscr_x = stdscr.getmaxyx()

Einfallsreichtum der Anzeige

Wenn es so bleibt, wie es ist, wird es nicht gut schmecken, also werde ich versuchen, ein Display zu entwickeln.

Wenn Sie diesmal die Buchstaben zusammenführen, sind die Wörter fett gedruckt. Fügen Sie insbesondere die Attributinformationen curses.A_BOLD zu addstr hinzu.

Sie können es auch einfärben oder blinken. Die tatsächlichen Attribute und Ausführungsergebnisse von Attribute und Farben lauten wie folgt.

stdscr.addstr('This is A_BOLD\n', curses.A_BOLD)
stdscr.addstr('This is A_BLINK\n', curses.A_BLINK)
stdscr.addstr('This is A_DIM\n', curses.A_DIM)
stdscr.addstr('This is A_STANDOUT\n', curses.A_STANDOUT)
stdscr.addstr('This is A_REVERSE\n', curses.A_REVERSE)
stdscr.addstr('This is A_UNDERLINE\n\n', curses.A_UNDERLINE)
#Geben Sie die Hintergrund- und Textfarbe an
curses.init_pair(1, curses.COLOR_RED, curses.COLOR_WHITE)
stdscr.addstr("This is curses.init_pair(1, curses.COLOR_RED, curses.COLOR_WHITE)\n", curses.color_pair(1))

Ausgabeergebnis

Wenn Sie bpe_curses.py ausführen, das unter Berücksichtigung des oben Gesagten erstellt wurde, wird das aktualisierte Ergebnis bei jedem Drücken der Taste wie unten gezeigt zusammengeführt. Getan werden.

bpe_sample.gif

Es ist ein wenig verwirrend, weil die Buchstaben klein sind, aber es ist ein Wort, das Paare mit ** fett ** zusammengeführt enthält. Anfänglich sind "e" und "r" die häufigsten Paare, daher sind "neuere" und "breitere" fett gedruckt. (2. Zeile)

Wenn Sie das Zusammenführen zehnmal wiederholen, können Sie außerdem feststellen, dass die Anzahl der Vokabeln ganz links abgenommen hat. (14 → 6)

Ich glaube nicht, dass diesmal viel Interaktivität erforderlich war, aber Flüche können Tastenanschläge empfangen, sodass ich der Meinung bin, dass sie je nach Gerät auf verschiedene Arten verwendet werden können. Es ist einfacher als die Implementierung einer GUI, daher ist es möglicherweise gut, eine kleine Ausgabe anzuzeigen.

Referenz

--Dokument

Recommended Posts

Interaktives Ausgeben von BPE mithilfe von Python-Flüchen
Python-Lernausgabe
Starten Sie Python
Scraping mit Python
Bearbeiten Sie Redmine mit Python Redmine
Fibonacci-Sequenz mit Python
Datenbereinigung mit Python
Python-Eingabe und Ausgabe
Verwenden von Python # externen Paketen
Python-Audioeingabe / -ausgabe
Ausführungszeit für Python ausgeben
WiringPi-SPI-Kommunikation mit Python
Altersberechnung mit Python
Japanische Ausgabe mit Python
Suchen Sie Twitter mit Python
Namensidentifikation mit Python
Hinweise zur Verwendung von Python-Unterprozessen
Grundlagen von Python: Ausgabe
Verwenden Sie Python-Programme mit dem Ausführungs-Plugin exec_filter von fluentd
Versuchen Sie es mit Tweepy [Python2.7]
Verwenden Sie Python-Programme mit dem exec Output Plugin von fluentd
Geben Sie Excel-Daten mit Python3 + xlrd + mecab separat aus
Ausgabe von Produktinformationen an csv mithilfe der Rakuten-Produktsuch-API [Python]
Python-Memo mit perl-ternärem Operator
Mit Python abflachen
Scraping mit Python 3.5 async / await
Speichern Sie Bilder mit Python3-Anforderungen
[S3] CRUD mit S3 unter Verwendung von Python [Python]
[Python] Versuchen Sie, Tkinters Leinwand zu verwenden
Verwenden von Quaternion mit Python ~ numpy-quaternion ~
Probieren Sie die Python-Ausgabe mit Haxe 3.2 aus
Versuchen Sie es mit Kubernetes Client -Python-
Python-Notizen zur Verwendung von Perl-Spezialvariablen
[Python] Verwenden von OpenCV mit Python (Basic)
Scraping mit Python 3.5 Async-Syntax
Überwachung von Website-Änderungen mit Python
Starten Sie mit Python zu Selen
Suchalgorithmus mit word2vec [Python]
Python: Grundlagen der Verwendung von Scikit-Learn ①
# 1 [python3] Einfache Berechnung mit Variablen
Erstellen Sie JIRA-Tickets mit Python
Instrumentensteuerung mit Python [pyvisa]
Bearbeiten Sie Tabellenkalkulationen lokal mit Python
Python-Memo mit Perl --join
Web Scraping mit Selenium (Python)
[Python] Validierung von JSON mit Voluptuous
Online-Übertragung mit Python
Datenanalyse mit Python-Pandas
Übersetzt mit Googletrans in Python
Verwenden des Python-Modus in der Verarbeitung
Verwenden von OpenCV mit Python @Mac
Lesen Sie die Fortran-Ausgabe mit Python
[Python] Schießspiel mit Pyxel
Senden Sie mit Python mit Google Mail
[Python] Sprechen mit OpenJTalk und Talk API (bis zur Sprachausgabe)
Hinweise zur Verwendung der Tab-Vervollständigung beim interaktiven Ausführen von Python unter Windows