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.
Holen Sie sich eine Zeichenfolge, in der die Zeichen der Zeichenfolge "betont" umgekehrt angeordnet sind (vom Ende bis zum Anfang).
00.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 00.py
str = "stressed"
print(str[-1::-1])
Ü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 ...
Nehmen Sie das 1., 3., 5. und 7. Zeichen der Zeichenkette "Patatokukashi" heraus und erhalten Sie die verkettete Zeichenkette.
01.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 01.py
str = u'Patatoku Kashii'
print(str[0::2])
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).
Erhalten Sie die Zeichenkette "Patatokukashi", indem Sie die Zeichen "Pattocar" + "Tax" von Anfang an abwechselnd verbinden.
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
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.
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.
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
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.
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.
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
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.
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.
\
zu lang sindstr
for
von Element zu IndexIch 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 ()
...
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.
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
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 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.
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.
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)
Informationen zur spezifischen Verwendung finden Sie im Code. Ich bin froh, solche Operationen intuitiv schreiben zu können.
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.
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.
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)
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.
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.
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
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
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.
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
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.
(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.
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.
\
zu lang sindDie 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}} $)
Fortsetzung von Kapitel 2, Teil 1.
Recommended Posts