Natürliche Sprache(NL, Natural Language)
Bezieht sich auf natürlich vorkommende Sprachen wie Japanisch und Englisch. Wie eine Programmiersprache
Künstliche Sprache(Artificial Language)Ist ein Kontrast.
Verarbeitung natürlicher Sprache(NLP, Natural Language Processing)Was ist
Es ist eine Technologie, die es einem Computer ermöglicht, die natürliche Sprache zu verarbeiten, die Menschen täglich verwenden. Zu den Aufgaben, die die Verarbeitung natürlicher Sprache verwenden, gehören die Klassifizierung von Dokumenten, die maschinelle Übersetzung, die Zusammenfassung von Dokumenten, Fragen und Antworten sowie der Dialog.
Die folgenden Wörter werden häufig in der Verarbeitung natürlicher Sprache verwendet.
Token: Ein Zeichen oder eine Zeichenfolge, die bei der Analyse einer natürlichen Sprache als kleinste Einheit eines Satzes behandelt wird.
Typ: Ein Begriff, der den Worttyp beschreibt.
Satz: Ein Satz, der eine Reihe von Inhalten ausdrückt. In der Verarbeitung natürlicher Sprache bezieht es sich oft auf einen Satz.
Dokument: Bezieht sich häufig auf ein einzelnes Datenelement, das aus mehreren Sätzen besteht.
Korpus: Daten, die Informationen zu einem Dokument oder Audiodaten enthalten.
Sisorus: Wortanfang/Untergeordnete Beziehung, Teil/Klassifizieren Sie Wörter nach allgemeinen Beziehungen, Synonymen, Synonymen usw.
Ein systematisches Synonymwörterbuch / Wörterbuch.
Morphologisches Element: Die kleinste Einheit, die Bedeutung hat. Das Wort "essen" kann in zwei morphologische Elemente "essen" und "ta" unterteilt werden.
Wort: Eine kleine Einheit, die aus einem oder mehreren morphologischen Elementen besteht.
Oberflächenebene: Die Beschreibung des Originaltextes.
Prototyp: Die Beschreibung vor der Verwendung.
Merkmal: Informationen aus Sätzen und Dokumenten.
Wörterbuch: Bezieht sich bei der Verarbeitung natürlicher Sprache auf eine Liste von Wörtern.
Damit die Maschine die Bedeutung eines Satzes verstehen kann, muss eine Wortteilung durchgeführt werden. Zum Beispiel der Satz "Ich lerne bei Ideamy".
ich|Ist|Schule | At | Study |
Nomenklatur Unterhilfsnomenklatur Fallassistent Verb Hilfsverb
Sie können Wortumbrüche identifizieren und ihren Teil und ihre Grundform wie oben finden. Im Japanischen ist es schwierig, Wortumbrüche zu identifizieren, aber andererseits gibt es nur wenige Wörter, die mehrere Interpretationen haben, so dass es einfach ist, Teile und Grundformen zu finden.
Chinesisch und Thailändisch sind ebenfalls Sprachen, die eine Wortteilung erfordern.
Für Englisch
I | study | at | aidemy.
Nomenklatur Verben Präfix Nomenklatur
Worttrennzeichen können durch Symbole wie Leerzeichen und Punkte identifiziert werden. Es ist jedoch schwierig, den Teil zu identifizieren, da viele Wörter mehrere Teile haben. Wie aus dem Obigen ersichtlich ist, besteht das Merkmal der Verarbeitung natürlicher Sprache darin, dass der Ort und die Schwierigkeit von Problemen je nach Sprache unterschiedlich sind.
Es ist besonders schwierig, in Hiragana zu schreiben, wie unten gezeigt.
Wagen|damit|Kiefer
Kommen Sie|Bis|Kiefer
Es gibt zwei Hauptmethoden zum Teilen von Sätzen in Wörter.
① Morphologische Analyse(Analyse nach Wörterbuch)
②Ngram(Mechanische Analyse nach Anzahl der Zeichen)
es gibt.
Eine Morphologie ist die kleinste sprachliche Einheit, die Bedeutung hat, und ein Wort hat eine oder mehrere Morphologien. Morphologische Analyse bezieht sich auf die Unterteilung in morphologische Elemente unter Verwendung eines Wörterbuchs und das anschließende Markieren (Hinzufügen von Informationen) von Teilen jedes Elements.
Andererseits ist Ngram eine Analysemethode, bei der Wörter durch N Zeichen oder Sätze durch N Wörter getrennt werden.
Für jedes Zeichen oder Wort wird ein Monogramm ausgeschnitten, für jeweils zwei Zeichen (Wörter) wird ein Bigram ausgeschnitten, und für jeweils drei Zeichen (Wörter) wird ein Trigramm ausgeschnitten.
Betrachten Sie beispielsweise das Monogramm, Bigram und Trigramm des Satzes "aiueo" wie folgt.
Monogramm:{Ah,ich,U.,e,Oh}
Bigram:{Ai,Sagen,über,Eo}
Trigramm:{Ah,Iue,Ueo}
Ngram benötigt kein Wörterbuch oder keine grammatikalische Interpretation wie die morphologische Analyse Es kann unabhängig von der Sprache verwendet werden. Darüber hinaus hat Ngram den Vorteil, dass die Merkmalsextraktion weniger wahrscheinlich übersehen wird. Es gibt einen Fehler, dass das Rauschen groß wird. Im Gegenteil, die morphologische Analyse weist einen Unterschied in der Wörterbuchleistung auf. Es wird weniger Rauschen erzeugt als erzeugt.
Wenn Sie beispielsweise nach einer etwas längeren Zeichenkette "dem berühmtesten IT-Unternehmen der Welt in Tokio" suchen und die Zeichenkette durch Bigram und Suche teilen, besteht die Möglichkeit, dass die Firma "Kyoto" getroffen wird. Dies liegt daran, dass das Charakter-Bigram von "Tokyo" {Tokyo, Kyoto} ist. Dies ist nicht der Fall, wenn Sie die morphologische Analyse ordnungsgemäß verwenden, aber ein Hochleistungswörterbuch erstellen müssen.
<Terms>
Wortaufteilung: Aufteilen eines Satzes in Wörter
Teilwort-Tagging: Der Prozess des Klassifizierens und Markierens von Wörtern in Teilwörter.
Morphologische Analyse: Eine Zusammenfassung der Arbeit der Unterteilung in morphologische Elemente und Markierungsteile
MeCab
Für die Durchführung der morphologischen Analyse wird im Voraus ein morphologisches Analysewerkzeug vorbereitet. Typisch für einen japanischen morphologischen Analysator
Es gibt MeCab und Janome.
MeCab und Janome führen morphologische Analysen unter Bezugnahme auf das Wörterbuch durch. Hier erfahren Sie, wie Sie Mecab verwenden. Siehe das Beispiel der morphologischen Analyse mit Mecab unten.
import MeCab
mecab = MeCab.Tagger("-Owakati")
print(mecab.parse("Morgen wird es sonnig werden."))
#Ausgabeergebnis
#Morgen wird es sonnig werden .
mecab = MeCab.Tagger("-Ochasen")
print(mecab.parse("Morgen wird es sonnig werden."))
"""
#Ausgabeergebnis
Morgen Ashita Morgen Substantiv-Anwalt möglich
Ha ha ist ein Assistent-Hilfe
Sunny Harrell Sunny Verb-Unabhängiger einstufiger Grundtyp
Es ist ein Desho. Hilfsverb Special / Tod
Uuu Hilfsverb invariante Grundform
.. .. .. Symbol-Phrase
EOS
"""
In MeCab
MeCab.Tagger()Durch Ändern des Arguments von
Sie können das Ausgabeformat der Daten ändern. Wie im Beispiel
"-Owakati"Wenn es als Argument verwendet wird, wird es in Wörter unterteilt.
"-Ochasen"Wenn es als Argument verwendet wird, wird eine morphologische Analyse durchgeführt.
.parse("Satz")とすることにより引数のSatzを指定された形式で出力させることができます。
janome (1)
Janome ist auch einer der bekanntesten japanischen morphologischen Analysatoren.
Der Vorteil von Janome ist, dass die Installation von MeCab mühsam ist. Das Paket ist einfach zu installieren. janome importiert zuerst Tokenizer Erstellen Sie mit Tokenizer () ein Tokenizer-Objekt.
from janome.tokenizer import Tokenizer
t = Tokenizer()
Sie können eine morphologische Analyse durchführen, indem Sie die zu analysierende Zeichenfolge an die Tokenize-Methode von Tokenizer übergeben.
Der Rückgabewert der Tokenize-Methode ist eine Liste von markierten Token (Token-Objekten).
#Morphologische Analyse
from janome.tokenizer import Tokenizer
tokenizer = Tokenizer() #Erstellen eines Tokenizer-Objekts
tokens = tokenizer.tokenize("Ich habe ein Python-Buch gelesen")
for token in tokens:
print(token)
"""
#Ausgabeergebnis
Python Nomen,Proprietäre Nomenklatur,Organisation,*,*,*,python,*,*
Hilfswörter,Union,*,*,*,*,von,Nein,Nein
Diese Nomenklatur,Allgemeines,*,*,*,*,Buch,Hong,Hong
Hilfs,Fallassistent,Allgemeines,*,*,*,Zu,Wo,Wo
Verb lesen,Unabhängigkeit,*,*,Fünf Schritte, Ma Linie,Kontinuierliche Verbindung,Lesen,Jung,Jung
Hilfsverb,*,*,*,Besondere,Grundform,Ist,Da,Da
"""
janome (2)
In Janome (1) wurde eine morphologische Analyse durchgeführt. Im Argument der Tokenize-Methode
wakati=Sie können es durch Angabe von True trennen.
Der Rückgabewert bei wakati = True ist eine separate Liste.
from janome.tokenizer import Tokenizer
#Teilen
t = Tokenizer()
tokens = t.tokenize("Ich habe ein Python-Buch gelesen", wakati=True)
print(tokens)
#Ausgabeergebnis
["python", "von", "Buch", "Zu", "Lesen", "Ist"]
Beim Herunterladen von Dokumentdaten usw. zur Verarbeitung in natürlicher Sprache Wörter werden oft durch Sonderzeichen wie "Banane, Apfel, Erdbeere" getrennt.
In solchen Fällen wird häufig die Split-Funktion verwendet, die eine in Python integrierte Funktion ist. Daher wird sie hier erläutert.
Die Aufteilungsfunktion teilt eine Folge von Zahlen, Alphabeten, Symbolen usw. auf. Es ist eine Funktion, die nach einer bestimmten Regel trennt und auflistet.
Wenn Zeichenfolgen durch Leerzeichen oder Trennzeichen getrennt sind (",", ".", "_" Usw.) Mit der Zeichenfolge .split ("Trennzeichen") können Sie eine durch Leerzeichen oder Trennzeichen getrennte Liste abrufen.
fruits = "banana, apple, strawberry"
print(fruits) # str
print(fruits.split(",")) # list
#Ausgabeergebnis
banana, apple, strawberry
["banana", " apple", " strawberry"]
fruits = "banana apple srawberry"
print(fruits) # str
print(fruits.split()) # list
#Ausgabeergebnis
banana apple srawberry
["banana", "apple", "srawberry"]
janome (3)
Für jedes Token (Token-Objekt)
Token.Sie können die Form der Oberflächenschicht mit der Oberfläche herausnehmen
Token.part_of_Sie können die Teilwörter mit Sprache abrufen.
Die Oberflächenform ist die Form, die tatsächlich als Zeichenfolge in einem Satz erscheint.
tokens = t.tokenize("Ich habe ein Python-Buch gelesen")
#Oberflächentyp
for token in tokens:
print(token.surface)
"""
#Ausgabeergebnis
python
von
Buch
Zu
Lesen
Ist
"""
#Teil
for token in tokens:
print(token.part_of_speech)
"""
#Ausgabeergebnis
Substantiv,固有Substantiv,Organisation,*
Partikel,Union,*,*
Substantiv,Allgemeines,*,*
Partikel,格Partikel,Allgemeines,*
Verb,Unabhängigkeit,*,*
Hilfsverb,*,*,*
Klicken Sie hier für ein Beispiel
from janome.tokenizer import Tokenizer
t = Tokenizer()
tokens = t.tokenize("Ich habe Hirschfleisch gegessen")
word = []
#Das Folgende ist ein Beispiel.
for token in tokens:
part_of_speech = token.part_of_speech.split(",")[0]
if part_of_speech == "Substantiv" or part_of_speech == "Verb":
word.append(token.surface)
print(word)
#Ausgabeergebnis
# ['Hirsch', 'Fleisch', 'Essen']
Ngram
Ngram trennt Wörter durch N Zeichen, wie bereits erwähnt. Oder es ist eine Analysemethode, die Sätze durch N Wörter trennt.
Der Ngram-Algorithmus kann unten als gen_Ngram geschrieben werden.
Wenn Sie das N-Gramm eines Wortes finden möchten, geben Sie das Wort und die Zahl, die Sie ausschneiden möchten, in das Argument ein. Wenn Sie das N-Gramm eines Satzes finden möchten, verwenden Sie die Tokenize-Funktion von janome, um eine Liste von Unterteilungen zu erstellen. Geben Sie die Liste der Unterteilungen und die Nummer ein, die Sie als Argumente ausschneiden möchten.
Stellen Sie sich den Fall vor, in dem der Satz "Ich lese ein Python-Buch" in drei Wörter unterteilt ist (N = 3).
Mit janome wird es in ["Python", "", "Buch", "", "Lesen", "Da"] unterteilt. Drei aufeinanderfolgende Wörter können 6 - 3 + 1 annehmen (Zahl geteilt durch einen Teil des Wortes - N + 1) = 4. Das Ergebnis ist ["Python-Buch", "Buch", "Buch lesen", "Lesen"].
from janome.tokenizer import Tokenizer
tokenizer = Tokenizer()
tokens = tokenizer.tokenize("Ich habe ein Python-Buch gelesen", wakati=True)
# tokens = ["python", "von", "Buch", "Zu", "Lesen", "Ist"]
def gen_Ngram(words,N):
ngram = [] #Ich werde die ausgeschnittenen Wörter hier hinzufügen.
for i in range(len(words)-N+1): #Wiederholen Sie dies mit einer for-Anweisung, bis Sie N aufeinanderfolgende Wörter erhalten.
cw = "".join(words[i:i+N]) #Verbinde N Wörter und ordne sie cw zu.
ngram.append(cw)
return ngram
print(gen_Ngram(tokens, 2))
print(gen_Ngram(tokens, 3))
#Im Falle eines Satztrigramms
gen_Ngram(tokens, 3)
#Ausgabeergebnis
["Python-Buch", "Buch", "Ein Buch lesen", "Lesen"]
#Für Wort Bigram
gen_Ngram("bird", 2)
#Ausgabeergebnis
["bi", "ir", "rd"]
from janome.tokenizer import Tokenizer
t = Tokenizer()
tokens = t.tokenize("1ro gab dieses Buch der Frau, die 2ro sah.", wakati=True)
def gen_Ngram(words,N):
#Generiere Ngram
ngram = []
for i in range(len(words)-N+1):
cw = "".join(words[i:i+N])
ngram.append(cw)
return ngram
print(gen_Ngram(tokens, 2))
print(gen_Ngram(tokens, 3))
In der Verarbeitung natürlicher Sprache beim Extrahieren von Features aus mehreren Dokumenten Die Eingaberegeln sind möglicherweise nicht einheitlich und die Notation kann schwanken. (Beispiel iPhone und iPhone)
Wörter, die gleich sein sollten, werden als unterschiedliche Wörter analysiert, was zu unbeabsichtigten Analyseergebnissen führt. Konvertieren von Zeichen basierend auf Regeln, z. B. Vereinheitlichen von voller Breite zu halber Breite und Vereinheitlichen von oberen und unteren zu unteren
Dies nennt man Normalisierung.
Bitte beachten Sie, dass Sie bei einer Übernormalisierung nicht unterscheiden können, was unterschieden werden soll.
<Terms>
Notationsschwankung: Im selben Dokument werden Wörter, die mit demselben Ton und Synonym verwendet werden sollen, unterschiedlich geschrieben.
Normalisierung: Konvertieren von Buchstaben und Zahlen auf Regelbasis, um Schwankungen der Notation zu vermeiden
Bei der String-Normalisierung in der Bibliothek
Mit NEologd können Sie problemlos eine Normalisierung durchführen.
neologdn.normalize("Die Zeichenfolge, die Sie normalisieren möchten")
#Wird als geschrieben und die normalisierte Zeichenfolge wird als Rückgabewert übergeben.
Die Normalisierungen, die mit neologdn durchgeführt werden können, sind:
Vereinen Sie alphanumerische Zeichen voller Breite zu ai halber Breite-> ai
Vereinige Katakana in halber Breite mit Katakana in voller Breite->Katakana
Lange Klangverkürzung Woooooooooo->Beeindruckend
Vereinheitlichung ähnlicher Zeichentypen"--- ---.- "-> "-"
Entfernen Sie unnötigen Platz"Raum"-> "Raum"
Einschränkung der Wiederholung (durch Problem bestätigt)
Klicken Sie hier für ein Beispiel
#Bitte importieren Sie neologdn
import neologdn
#Vereinige Katakana in halber Breite mit voller Breite
a = neologdn.normalize("Kata Kana")
print(a)
#Lange Notenverkürzung
b = neologdn.normalize("Mee --------")
print(b)
#Vereinigung ähnlicher Zeichen
c = neologdn.normalize("Verschiedene Bindestriche ˗֊ ------ - ⁃⁻₋−")
print(c)
#Vereinheitlichen Sie alphanumerische Zeichen voller Breite zu halber Breite+Löschen Sie unnötigen Speicherplatz
d = neologdn.normalize("DL vertieft")
print(d)
#Einschränkung der Wiederholung
e = neologdn.normalize("Mii Ii Ii Ii Ii", repeat=6)
print(e)
Ausgabeergebnis
Katakana
Mich
Verschiedene Bindestriche-
DL Deep Learning
Gut gut gut
In Normalisierung (1) haben wir uns die Normalisierung mithilfe einer Bibliothek angesehen. Als nächstes, falls Sie auf Ihre eigenen Daten normalisieren möchten Erfahren Sie, wie Sie die Normalisierung selbst durchführen.
Wenn das Dokument zwei Arten von Wörtern enthält: "iphone" und "iPhone" Es ist notwendig, die Notation zu vereinheitlichen, um diese als dasselbe zu behandeln.
Wenn Sie Groß- und Kleinschreibung ausrichten möchten, können Sie dies tun, indem Sie der Zeichenfolge .lower () hinzufügen. Dinge, die im Code häufig verwendet werden, wie im folgenden Beispiel, werden häufig zu Funktionen verarbeitet.
def lower_text(text):
return text.lower()
lower_letters = lower_text("iPhone")
print(lower_letters)
#Ausgabeergebnis
# iphone
Die Normalisierung kann auch Zahlen ersetzen.
Der Grund für das Ersetzen von Zahlen ist, dass die numerischen Ausdrücke unterschiedlich sind und die Häufigkeit des Auftretens hoch ist. Es ist möglicherweise nicht nützlich für Aufgaben zur Verarbeitung natürlicher Sprache.
Betrachten Sie beispielsweise die Aufgabe, Nachrichtenartikel in Kategorien wie "Sport" und "Politik" zu kategorisieren. Zu diesem Zeitpunkt denke ich, dass verschiedene numerische Ausdrücke im Artikel erscheinen werden. Es wird als wenig nützlich bei der Klassifizierung von Kategorien angesehen. aus diesem Grund
Es ersetzt die Nummer durch ein anderes Symbol und reduziert die Anzahl der Vokabeln.
Hier wird die Zeichenfolge mithilfe einer speziellen Ausdrucksmethode konvertiert, die als regulärer Ausdruck bezeichnet wird. Die Details der regulären Ausdrücke werden in Normalisierung (4) erläutert.
Für Operationen mit regulären Ausdrücken
Verwenden Sie die Standard-Python-Bibliothek re.
Um eine Zeichenfolge durch eine andere zu ersetzen,
re.sub(Reguläre Ausdrücke,Zu ersetzende Zeichenfolge,Die gesamte zu ersetzende Zeichenfolge[,Anzahl der Ersetzungen])
#Geben Sie an, was Sie durch das erste Argument durch einen regulären Ausdruck ersetzen möchten
#Gibt die Zeichenfolge an, die durch das zweite Argument ersetzt werden soll.
#Geben Sie die gesamte Zeichenfolge an, die durch das dritte Argument ersetzt werden soll.
#Wenn Sie die Anzahl der vierten Argumente nicht angeben, werden alle ersetzt.
Schauen wir uns das folgende Beispiel an. Angenommen, Sie haben den Satz "Ich bin gestern um 6 Uhr aufgewacht und um 11 Uhr ins Bett gegangen." normalize_number ist eine Funktion, die Zahlen aus Sätzen entfernt.
re
Das erste Argument \ d ist ein regulärer Ausdruck, der eine Folge von Zahlen darstellt. Hiermit können Sie eine beliebige Zahlenfolge angeben.
Das zweite Argument ist "
import re
def normalize_number(text):
replaced_text = re.sub("\d", "<NUM>", text)
return replaced_text
replaced_text = normalize_number("Ich bin gestern um 6 Uhr aufgewacht und um 11 Uhr ins Bett gegangen.")
print(replaced_text)
#Ausgabeergebnis
#Gestern<NUM>Manchmal steh auf<NUM>Manchmal habe ich geschlafen.
Ein regulärer Ausdruck ist eine Methode zum Ersetzen eines Satzes von Zeichenfolgen durch die eine oder andere Zeichenfolge. Es wird häufig für Suchfunktionen für Zeichenketten verwendet.
12A3B -> \d\dA\dB
Im obigen Beispiel werden alle Zahlen mit halber Breite durch den regulären Ausdruck \ d dargestellt.
Bei der Verarbeitung natürlicher Sprache wie dem regulären Ausdruck (3) wird eine Reihe von Zeichenketten verwendet, die für die Analyse nicht als notwendig erachtet werden Reduzieren Sie die Datenmenge durch Ersetzen.
Reguläre Ausdrücke werden verwendet, um solche Sätze von Zeichenfolgen zu ersetzen.
Die folgende Tabelle zeigt die regulären Ausdrücke, die häufig in der Verarbeitung natürlicher Sprache verwendet werden.
Recommended Posts