100 Sprachverarbeitungsklopfen mit Python (Kapitel 1)

Einführung

Knock 100-Sprachverarbeitung, veröffentlicht auf der Website des Inui-Okazaki-Labors der Tohoku-Universität zum Training der Verarbeitung natürlicher Sprache und von Python. Ich werde nlp100 /) herausfordern. Ich habe vor, den darin implementierten Code und die Techniken, die unterdrückt werden sollten, zu notieren. Der Code ist auch auf [GitHub] verfügbar (https://github.com/gamma1129/nlp100).

Das Lehrbuch verwendet "Einführung in die Python 2 & 3-Unterstützung (geschrieben von Kenji Hosoda et al., Hidekazu System)".

Wir möchten die Artikel vorstellen, auf die wir uns beim Start bezogen haben. Ich kann das Gefühl nicht leugnen, dass es zu hilfreich ist. Bitte kontaktieren Sie mich, wenn Sie sich unwohl fühlen.

Da ich ein Amateur von Zub bin, ist es sehr unansehnlich, weil die Notation nicht einheitlich ist und die Beziehungen zwischen Python 2/3 gemischt sind, aber ich würde es begrüßen, wenn Sie darauf hinweisen könnten. Die Ausführungsumgebung selbst ist Python 2.

Kapitel 1: Vorbereitende Bewegung

00. Umgekehrte Reihenfolge der Zeichenfolgen

Holen Sie sich eine Zeichenfolge, in der die Zeichen der Zeichenfolge "betont" umgekehrt angeordnet sind (vom Ende bis zum Anfang).

Antworten

00.py


#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 00.py

str = "stressed"
print(str[-1::-1])

Kommentar

Übung der Technik des "Schneidens" für Zeichenketten. Wie im obigen Artikel erwähnt (http://qiita.com/tanaka0325/items/08831b96b684d7ecb2f7), werde ich das Schneiden erneut untersuchen.

Ein Slice wird in Form von "Zeichenkettenindex [Startindex: Endindex: Anzahl der Schritte]" beschrieben, und ein Teil der Zeichenkette wird ausgeschnitten und erfasst. Zusätzlich zu Zeichenketten können Listen verwendet werden.

str = "abcdefgh"

#Holen Sie sich einen bestimmten Charakter
str[0]        # 'a', Null von Anfang an-based
str[-1]       # 'h', Kann auch mit einer negativen Zahl angegeben werden (ab dem Ende des Satzes). Diesmal str[7]Synonym zu

#Scheibe
str[1:3]      # 'bc', Beachten Sie, dass das Zeichen des Endindex nicht enthalten ist. Nicht die Anzahl der Zeichen
str[0:-3]     # 'abcde', Negative Zahlen sind OK. Diesmal str[0:5]Synonym zu
str[:4]       # 'abcd', Wenn der Startindex weggelassen wird, von Anfang an
str[4:]       # 'efgh', Bis zum Ende, wenn der Endindex weggelassen wird

#Geben Sie die Anzahl der Schritte an
str[0:6:2]    # 'ace', Erfasst diskrete Zeichen um den durch die Anzahl der Schritte (0) angegebenen Betrag.,2,4.)
str[::3]      # 'adg', Kann ausgelassen werden
str[-3::2]    # 'fh', Negative Zahlen sind ebenfalls möglich
str[::-3]     # 'hed', Wenn die Anzahl der Schritte negativ ist, wird in umgekehrter Reihenfolge zurückgegangen

Die Antwort war diesmal also "str [:: -1]", aber es war meine erste Erfahrung mit dem Schneiden, also schauen Sie bitte genau hin ...

01. "Patatokukashi"

Nehmen Sie das 1., 3., 5. und 7. Zeichen der Zeichenkette "Patatokukashi" heraus und erhalten Sie die verkettete Zeichenkette.

Antworten

01.py


#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 01.py

str = u'Patatoku Kashii'
print(str[0::2])

Kommentar

Scheibenübungen sowie 00. Ebenso können Sie die Startposition weglassen und str [:: 2] verwenden. Darüber hinaus können japanischen (Unicode-) Zeichenfolgen u vorangestellt werden, z. B. "u'hogehoge" (UTF-8-Umgebung).

02. "Patcar" + "Tax" = "Patatokukasie"

Erhalten Sie die Zeichenkette "Patatokukashi", indem Sie die Zeichen "Pattocar" + "Tax" von Anfang an abwechselnd verbinden.

Antworten

02.py


#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 02.py

str1 = u'Pat Auto'
str2 = u'Taxi'
str3 = u''

for a,b in zip(str1, str2):
    str3 = str3 + a + b

print str3

Kommentar

zip () ist eine Funktion, die aus jedem Argument ein Element extrahiert und einen Taple erstellt. Techniken, die verwendet werden können, wenn Bedingungen für "for loop" angegeben werden. print ist plötzlich keine Funktion mehr, aber dies ist die Python 2-Notation. Die Mischung tut mir leid.

Dies wird auch in dem obigen Artikel erwähnt, aber es scheint, dass die Methode, jedes Mal während einer Schleife zum Ende hinzuzufügen, hinsichtlich der Ausführungsgeschwindigkeit problematisch ist. Ding. Es scheint am besten, die Zeichenfolgen später als "print (") zu kombinieren. Join ([a + b für a, b in zip (str1, str2)])). Join () verbindet die Elemente im Argument, nachdem sie durch das Trennzeichen in "" getrennt wurden. Bitte beachten Sie, dass sich der Schreibstil geändert hat.

03. Umfangsrate

Zerlegen Sie den Satz „Jetzt brauche ich nach den schweren Vorlesungen über Quantenmechanik einen Alkoholiker.“ In Wörter und erstellen Sie eine Liste der Anzahl der (alphabetischen) Zeichen in jedem Wort in der Reihenfolge ihres Auftretens.

Antworten

03.py


#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 03.py

str = "Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics."
str = str.replace('.', "")
str = str.replace(',', "")
str = str.split()

list = []

for word in str:
    list.append(len(word))

print list

Kommentar

Nachdem Sie den Punkt und das Komma mit "replace ()" entfernt haben, trennen Sie jedes Wort mit "split ()", ermitteln Sie die Länge mit "len ()" und tauchen Sie in "list" ein. .. Ich fragte mich, ob es einen besseren Weg gibt, Punkte und Kommas zu entfernen, aber ich gab auf. Da split () ein Trennzeichen als Argument angeben kann (Standard ist ein Leerzeichen), dachte ich, ich würde sie alle auf einmal angeben, konnte es aber nicht.

04. Elementsymbol

Brechen Sie den Satz "Hi He Lied, weil Bor Fluor nicht oxidieren konnte. Neue Nationen könnten auch die Friedenssicherheitsklausel unterzeichnen. Arthur King Can." In die Wörter 1, 5, 6, 7, 8, 9, 15, 16 auf. Das 19. Wort ist das erste Zeichen, und die anderen Wörter sind die ersten beiden Zeichen. Erstellen.

Antworten

04.py


#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 04.py

str = "Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can."
str = str.split()

dict = {}
single = [1, 5, 6, 7, 8, 9, 15, 16, 19]

for element in str:
    if str.index(element) + 1 in single:
        dict[element[:1]] = str.index(element) + 1
    else:
        dict[element[:2]] = str.index(element) + 1

#Nach Ordnungszahl sortieren und drucken
for k, v in sorted(dict.items(), key=lambda x:x[1]):
    print k, v

Kommentar

Wie bei 03 wird jedes Wort getrennt und einzeln mit "for loop" verarbeitet. Da ohnehin nur der Anfang zu sehen ist, entfällt die Periodenverarbeitung. Ich kann nicht anders, als zu glauben, dass Magnesium bei dieser Geschwindigkeit zu Mi wird ... Ist es unvermeidlich? Sie können sie einzeln angeben und in Scheiben schneiden (element [: 3: 2]). Sie müssen es nicht als "single" angeben, aber "str.index (element) + 1" wird dreimal angezeigt, daher möchte ich diesen Bereich gut organisieren. Ist es eine Lösung, wenn Sie es einer geeigneten Variablen zuweisen? Außerdem garantiert das Wörterbuch nicht in erster Linie die Reihenfolge, sondern ist zur einfachen Anzeige sortiert.

Fix

Geänderte Version


#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 04.py

str = "Hi He Lied Because Boron Could Not Oxidize Fluorine.\
 New Nations Might Also Sign Peace Security Clause. Arthur King Can."
words_list = str.split()

dict = {}
single = [0, 4, 5, 6, 7, 8, 14, 15, 18]

for i in range(len(words_list)):
    clen = 1 if i in single else 2
    dict[words_list[i][:clen]] = i + 1

#Nach Ordnungszahl sortieren und drucken
# for k, v in sorted(dict.items(), key=lambda x: x[1]):
#     print(k, v)

Die Hauptverbesserungen sind wie folgt.

Ich denke, das Größte in dieser Zeit ist, sich nach Index zu wenden. Ich wollte versuchen, for zu schreiben, was ich im vorherigen Code zum ersten Mal gelernt habe, und als Ergebnis habe ich den Index erneut mit index () ...

  1. n-gram

Erstellen Sie eine Funktion, die aus einer bestimmten Sequenz (Zeichenfolge, Liste usw.) ein n-Gramm erstellt. Verwenden Sie diese Funktion, um das Wort Bi-Gramm und den Buchstaben Bi-Gramm aus dem Satz "Ich bin ein NLPer" zu erhalten.

Antworten

05.py


#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 05.py

original = "I am an NLPer"

def ngram(input, n):
    #Zeichen n-gram (Argument str)
    l = len(input)
    if type(input) == str:
        input = "$" * (n - 1) + input + "$" * (n - 1)
        for i in xrange(l + 1):
            print input[i:i+n]
    #Wort n-gram (Argumentliste)
    elif type(input) == list:
        input = ["$"] * (n - 1) + input + ["$"] * (n - 1)
        for i in xrange(l + 1):
            print input[i:i+n]

ngram(original, 2)              #Zeichen n-gram
original = original.split()
ngram(original, 2)              #Wort n-gram

Kommentar

Es war schwieriger als ich erwartet hatte. Viele Feineinstellungen wie ± 1 aufgrund der Länge der Anzahl der Zeichen ... Ich habe "$" vor dem Anfang und nach dem Ende der Zeichenkette eingefügt. Ich wollte eine Funktion wie Java Overload implementieren, aber es scheint, dass Overload in Python nicht standardmäßig implementiert ist, also habe ich es mit type () implementiert.

Kommentare und Umsetzung

Kommentare und Implementierung von knok.

Implementierung der ngram-Funktion durch knok


def ngram(input, n):
    last = len(input) - n + 1
    ret = []
    for i in range(0, last):
        ret.append(input[i:i+n])
    return ret

Wenn Sie am Anfang und am Ende kein "$" einfügen, können Sie intelligent gleichzeitig implementieren. Sowohl in der Zeichenfolge als auch in der Liste können Sie das Element nach Index angeben und in Scheiben schneiden, sodass Sie den Typ nicht kennen müssen.

Hmm schön. Wenn ich meinen Code noch einmal betrachte, wird mir schwindelig. Vielen Dank.

06. Treffen

Suchen Sie den in "paraparaparadise" und "Absatz" enthaltenen Satz von Zeichen-Bi-Gramm als X bzw. Y und suchen Sie die Summen-, Produkt- und Differenzsätze von X bzw. Y. Finden Sie außerdem heraus, ob das Bi-Gramm in X und Y enthalten ist.

Antworten

06.py


#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 06.py

str1 = "paraparaparadise"
str2 = "paragraph"

def ngram(input, n):
    l = len(input)
    list = []
    input = "$" * (n - 1) + input + "$" * (n - 1)
    for i in xrange(l + 1):
        list.append(input[i:i+n])
    return list

#ngram Liste zu setzen;Kann Doppelarbeit beseitigen und festgelegte Operationen ausführen
X = set(ngram(str1, 2))
Y = set(ngram(str2, 2))

print X.union(Y)            #Summensatz
print X.intersection(Y)     #Produktset
print X.difference(Y)       #Differenz gesetzt

print "se" in X		# in:Zu X."se"Richtig wenn,Falsch wenn nicht
print "se" in Y		#Fast das gleiche (X.-> Y)

Kommentar

Informationen zur spezifischen Verwendung finden Sie im Code. Ich bin froh, solche Operationen intuitiv schreiben zu können.

Fix

Geänderte Version


#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 06.py

from mymodule import ngram

str1 = "paraparaparadise"
str2 = "paragraph"

X = set(ngram(str1, 2))
Y = set(ngram(str2, 2))

#Unterlassung

Mit Bezug auf diesen Artikel habe ich ihn so eingestellt, dass die in 05 erstellte selbst erstellte Funktion wiederverwendet werden kann.

07. Anweisungsgenerierung nach Vorlage

Implementieren Sie eine Funktion, die die Argumente x, y, z verwendet und die Zeichenfolge "y bei x ist z" zurückgibt. Setzen Sie außerdem x = 12, y = "Temperatur", z = 22,4 und überprüfen Sie das Ausführungsergebnis.

Antworten

07.py


#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 07.py

x = 12
y = u'Temperatur'
z = 22.4

def function(x, y, z):
    return unicode(x) + u'von Zeit' + unicode(y) + u'Ist' + unicode(z)

print function(x, y, z)

Kommentar

Da "x" und "y" "int" bzw. "float" sind, müssen sie beim Verketten mit "Unicode" konvertiert werden. Die Konvertierung des Zeichencodes scheint ziemlich tief zu sein, wenn Sie tiefer graben, aber diesmal hat es funktioniert, also vor allem. Gibt es eine Möglichkeit, ~~ zip () zu verwenden? ~~ Es sieht nicht so aus.

08. Kryptographie

Implementieren Sie die Funktionsverschlüsselung, die jedes Zeichen der angegebenen Zeichenfolge mit den folgenden Spezifikationen konvertiert.

  • Bei Kleinbuchstaben durch (219 - Zeichencode) ersetzen

  • Andere Zeichen so ausgeben, wie sie sind

Verwenden Sie diese Funktion, um englische Nachrichten zu verschlüsseln / entschlüsseln.

Antworten

08.py


#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 08.py

#Quelle:Wikipedia Englische Version"Atbash"Als
str = "Atbash is a simple substitution cipher for the Hebrew alphabet."

def cipher(input):
    ret = ""
    for char in input:
        ret += chr(219-ord(char)) if char.islower() else char
    return ret

str = cipher(str)
print str
str = cipher(str)
print str

Kommentar

Da es sich um einen sogenannten "Atbash-Code" handelt, kann er mit derselben Funktion verschlüsselt und entschlüsselt werden. chr () ist eine Funktion, die ASCII-Code in konkrete Zeichen konvertiert (chr (97) -> 'a'). ord () ist das Gegenteil, aber Unicode gibt Unicode-Codepunkte zurück. Die Unicode-Version von "chr ()" ist "unichr ()".

Vor der Konvertierung Nach der Konvertierung Zu verwendende Funktion
ASCII-Code ASCII-Zeichen chr()
Unicode-Codepunkt Unicode-Zeichen unichr()
ASCII-Zeichen ASCII-Code ord()
Unicode-Zeichen Unicode-Codepunkt ord()

Siehe auch Offizielles Dokument.

Wir haben einen if-Zweig mit dem ternären Operator zusammengestellt.

Dreiecksoperator


#Wert 1, wenn der bedingte Ausdruck wahr ist, Wert 2, wenn der bedingte Ausdruck falsch ist
Wert 1, wenn bedingter Ausdruck sonst Wert 2
  1. Typoglycemia

Erstellen Sie ein Programm, das die Reihenfolge der anderen Zeichen zufällig neu anordnet, wobei das erste und das letzte Zeichen jedes Wortes für die Wortfolge durch Leerzeichen getrennt bleiben. Wörter mit einer Länge von 4 oder weniger werden jedoch nicht neu angeordnet. Geben Sie einen geeigneten englischen Satz ein (zum Beispiel: "Ich konnte nicht glauben, dass ich tatsächlich verstehen konnte, was ich las: die phänomenale Kraft des menschlichen Geistes.") Und überprüfen Sie das Ausführungsergebnis.

Antworten

09.py


#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 09.py
import random

str = "I couldn't believe that I could actually understand what I was reading : the phenomenal power of the human mind ."
words = str.split()
shuffled_list = []

for word in words:
    if len(word) < 4:
        pass
    else:
        char_list = list(word)
        mid_list = char_list[1:-1]
        random.shuffle(mid_list)
        word = word[0] + "".join(mid_list) + word[-1]
    shuffled_list.append(word)

shuffled_str = " ".join(shuffled_list)
print shuffled_str

Kommentar

Ersetzen Sie die Zeichenfolgen nach dem Zufallsprinzip durch "random.shuffle ()"! Sehr angenehm. Die Implementierung in C scheint ziemlich ärgerlich zu sein, aber ... ich bin dankbar, dass Python über eine so umfangreiche Bibliothek verfügt. Da es völlig zufällig ist, kann dieselbe Zeichenfolge wie die ursprüngliche Zeichenfolge zurückgegeben werden. Wenn es nach dem Vergleich der Zeichenfolgen dasselbe ist, können Sie es erneut versuchen oder implementieren.

Ergänzung

(Zeichenkette) Im Vergleich gibt es == und is. Während "==" reinen Inhalt vergleicht, vergleicht "is", ob es sich um dasselbe Objekt handelt. Diesmal ist es korrekter, beim Implementieren des Zeichenfolgenvergleichs "==" zu verwenden.

(Zitat) In Python sind sowohl "" als auch "" in Ordnung, wenn eine Zeichenfolge eingeschlossen wird. Wenn Sie jedoch "" in englischem Besitz oder in englischer Abkürzung verwenden und die gesamte Zeichenfolge in "" einschließen, stimmen die Kontingente nicht überein und es tritt ein Fehler auf. Um dieses Problem zu umgehen, können Sie es entweder in "" einschließen oder mit einem Backslash wie "" maskieren.

Fix

Geänderte Version


#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 09.py

import random


def word_typoglycemia(word):
    if len(word) <= 4:
        return word

    mid_list = list(word[1:-1])
    while mid_list == list(word[1:-1]):
        random.shuffle(mid_list)
    return word[0] + "".join(mid_list) + word[-1]


def str_typoglycemia(str):
    shuffled_list = []
    for word in str.split():
        shuffled_list.append(word_typoglycemia(word))
    return " ".join(shuffled_list)


str = "I couldn't believe that I could actually understand \
 what I was reading : the phenomenal power of the human mind ."

print(str_typoglycemia(str))

Die Hauptverbesserungen sind wie folgt.

Die große Veränderung ist die Beseitigung von Zufällen, aber es ist ein wenig bedauerlich, dass es keine Garantie dafür gibt, dass "while" endet. Es ist sehr unwahrscheinlich ... (Selbst die gefährlichsten 5 Zeichen, wenn Sie n-mal schleifen, ist die Wahrscheinlichkeit $ \ frac {1} {6 ^ {n}} $)

abschließend

Fortsetzung von Kapitel 2, Teil 1.

Recommended Posts

100 Sprachverarbeitungsklopfen mit Python (Kapitel 1)
100 Sprachverarbeitungsklopfen mit Python (Kapitel 3)
100 Sprachverarbeitungsklopfen mit Python (Kapitel 2, Teil 2)
100 Sprachverarbeitungsklopfen mit Python (Kapitel 2, Teil 1)
100 Sprachverarbeitungsklopfen mit Python 2015
100 Sprachverarbeitung Knock Kapitel 1 (Python)
100 Sprachverarbeitung Knock Kapitel 2 (Python)
100 Sprachverarbeitung Knock Kapitel 1 in Python
100 Sprachverarbeitung Knock Kapitel 1 von Python
100 Sprachverarbeitung Knock 2020 Kapitel 1
100 Sprachverarbeitung Knock Kapitel 1
100 Sprachverarbeitung Knock 2020 Kapitel 3
100 Sprachverarbeitung Knock 2020 Kapitel 2
Ich habe mit GiNZA v3.1 Kapitel 4 100 Sprachverarbeitungsklopfen 2020 durchgeführt
100 Sprachverarbeitung Knock 2020 Kapitel 2: UNIX-Befehle
100 Sprachverarbeitung Knock 2015 Kapitel 5 Abhängigkeitsanalyse (40-49)
100 Sprachverarbeitung Knock 2020 Kapitel 4: Morphologische Analyse
100 Sprachverarbeitung Knock 2020 Kapitel 9: RNN, CNN
100 Sprachverarbeitungsklopfen (2020): 28
Ich habe versucht, 100 Sprachverarbeitung klopfen 2020: Kapitel 3
[Kapitel 5] Einführung in Python mit 100 Klopfen Sprachverarbeitung
100 Sprachverarbeitungsklopfen: Kapitel 1 Vorbereitungsbewegung
100 Sprachverarbeitung Knock 2020 Kapitel 6: Maschinelles Lernen
100 Sprachverarbeitung Knock Kapitel 4: Morphologische Analyse
100 Sprachverarbeitung Knock 2020 Kapitel 10: Maschinelle Übersetzung (90-98)
100 Sprachverarbeitung Knock 2020 Kapitel 5: Abhängigkeitsanalyse
[Kapitel 3] Einführung in Python mit 100 Klopfen Sprachverarbeitung
100 Sprachverarbeitung Knock 2020 Kapitel 7: Word Vector
100 Sprachverarbeitung Knock 2020 Kapitel 8: Neuronales Netz
Python-Anfänger versucht 100 Sprachverarbeitung klopfen 2015 (05 ~ 09)
100 Sprachverarbeitungsklopfen (2020): 38
[Kapitel 2] Einführung in Python mit 100 Klopfen Sprachverarbeitung
Rehabilitation von Python- und NLP-Kenntnissen ab "100 Language Processing Knock 2015" (Kapitel 1)
Ich habe versucht, 100 Sprachverarbeitung klopfen 2020: Kapitel 1
100 Sprachverarbeitung klopfen 00 ~ 02
100 Sprachverarbeitung Knock 2020 Kapitel 1: Vorbereitende Bewegung
100 Sprachverarbeitung Knock 2020 Kapitel 3: Reguläre Ausdrücke
100 Language Processing Knock 2015 Kapitel 4 Morphologische Analyse (30-39)
Ich habe versucht, 100 Sprachverarbeitung zu klopfen 2020: Kapitel 2
Ich habe versucht, 100 Sprachverarbeitung zu klopfen 2020: Kapitel 4
[Kapitel 4] Einführung in Python mit 100 Klopfen Sprachverarbeitung
Python-Anfänger versucht 100 Sprachverarbeitung klopfen 2015 (00 ~ 04)
3. Verarbeitung natürlicher Sprache durch Python 2-1. Netzwerk für das gleichzeitige Auftreten
Bildverarbeitung mit Python 100 Knock # 12 Bewegungsfilter
3. Verarbeitung natürlicher Sprache durch Python 1-1. Word N-Gramm
[Programmierer-Neuling "100 Sprachverarbeitung klopfen 2020"] Lösen Sie Kapitel 1
Sprachverarbeitung 100 Klopfen-88: 10 Wörter mit hoher Ähnlichkeit
100 Sprachverarbeitung klopfen 2020 [00 ~ 39 Antwort]
100 Sprachverarbeitung klopfen 2020 [00-79 Antwort]
100 Sprachverarbeitung klopfen 2020 [00 ~ 69 Antwort]
Rehabilitation von Python- und NLP-Kenntnissen ab "100 Language Processing Knock 2015" (Kapitel 2, erste Hälfte)
100 Amateur-Sprachverarbeitungsklopfen: 17
100 Sprachverarbeitung klopfen 2020 [00 ~ 49 Antwort]
100 Sprachverarbeitung Knock-52: Stemming
100 Sprachverarbeitungsklopfen ~ Kapitel 1
100 Amateur-Sprachverarbeitungsklopfen: 07
100 Sprachverarbeitung klopft Kapitel 2 (10 ~ 19)
Bildverarbeitung mit Python
100 Amateur-Sprachverarbeitungsklopfen: 09
100 Amateur-Sprachverarbeitungsklopfen: 47
100 Sprachverarbeitung Knock-53: Tokenisierung