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
BPE
(Wenn Sie nur etwas über Flüche wissen möchten, überspringen Sie es)
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.
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.
defaultdict
wird verwendet, um Kombinationen zu verarbeiten, die nicht im Schlüssel enthalten sind. 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
merge_vocab
wird unter den von get_status
untersuchten Kombinationen die häufigste Kombination zusammengeführt, um sie als ein Wort zu behandeln.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
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.
Wir werden die Anzeige von Zustandsübergängen mit Flüchen implementieren.
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)
Der grundlegende Verarbeitungsablauf ist wie folgt.
--stdscr.addstr (str)
: Fügen Sie der aktuellen Position den Text str
hinzu
--stdscr.refresh ()
: Anzeige aktualisieren
addstr
Text an
--stdscr.getkey ()
: Akzeptiert Tastenanschläge
--Wartende Rolle (sonst endet das Programm)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.
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()
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))
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.
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.
--Dokument
Recommended Posts