In der Verarbeitung natürlicher Sprache habe ich hauptsächlich erklärt, wie man mit Dokumenten und Sätzen umgeht. Wir werden die Beziehungen zwischen Sätzen und Wörtern analysieren.
Die Vektordarstellung eines Dokuments ist eine Vektordarstellung der Verteilung von Wörtern in einem Dokument.
Zum Beispiel kann der Satz "Ich mag Tomaten und Gurken wie Tomaten" in den folgenden Vektorausdruck umgewandelt werden.
(Aber Gurke, ich mag es und Tomate)= (1, 1, 1, 1, 1, 2)
Die Anzahl der Vorkommen jedes Wortes wird ausgedrückt, aber Informationen darüber, wo es aufgetaucht ist, gehen verloren. Das heißt, die Struktur- und Wortordnungsinformationen gehen verloren. Ein solches Vektor-Expressionsverfahren
Bag of Words(BOW)Wird genannt.
Es gibt drei typische Methoden zum Konvertieren in eine Vektordarstellung.
(1) Zählausdruck: Wie im vorherigen Beispiel, wie man sich auf die Anzahl der Vorkommen jedes Wortes im Dokument konzentriert
(2) Binärer Ausdruck: Eine Methode, die sich nur darauf konzentriert, ob jedes Wort in einem Satz vorkommt oder nicht, ohne sich um die Häufigkeit des Auftretens zu sorgen.
③tf-idf Ausdruck: tf-Umgang mit Gewichtsinformationen für jedes Wort in einem Satz, berechnet mit einer Methode namens idf
Im Allgemeinen wird tf-idf verwendet, aber es braucht Zeit, um zu berechnen, wann viele Sätze vorhanden sind. Verwenden Sie Binär- oder Zähldarstellungen.
Im Zählausdruck wird das Dokument in einen Vektor konvertiert, indem die Anzahl der Vorkommen jedes Wortes im Dokument gezählt wird.
1.John likes to watch movies. Mary likes movies too.
2.John also likes to watch football games.
Wenn es die obigen zwei Sätze gab, die Tasche der Wörter dieser zwei Sätze Es ist ein Vektor, der die Anzahl der Wörter im Dokument als Element verwendet.
["John","likes","to","watch","movies","Mary","too","also","football", "games"]
Die Häufigkeit, mit der die obigen Wörter erscheinen
1. [1, 2, 1, 1, 2, 1, 1, 0, 0, 0]
2. [1, 1, 1, 1, 0, 0, 0, 1, 1, 1]
Es ist geworden. Dies repräsentiert die Eigenschaften des Textes.
In Python wird mit gensim eine Bibliothek für maschinelles Lernen hauptsächlich für die Textanalyse verwendet Es ist möglich, automatisch zu berechnen.
Zuerst,
dictionary = gensim.corpora.Dictionary
# (Geteilter Text)
Erstellt ein Wörterbuch mit Wörtern, die im Voraus im Dokument angezeigt werden.
dictionary.doc2bow
# (Jedes Wort im geteilten Satz)
Sie können eine Tasche mit Wörtern mit erstellen, und die Ausgabe wird eine Liste von (ID, Anzahl der Vorkommen) sein. Sie können die ID-Nummer jedes Wortes mit dictionary.token2id abrufen.
from gensim import corpora
#Liste der Wörter für jedes Dokument(documents)Erstellen Sie ein entsprechendes Wörterbuch mit Wörtern und der Anzahl der Vorkommen aus
dictionary = corpora.Dictionary(documents)
#Tasche voller Wörter erstellen
bow_corpus = [dictionary.doc2bow(d) for d in documents]
Klicken Sie hier für einen detaillierteren Code
from gensim import corpora
from janome.tokenizer import Tokenizer
text1 = "Von den Oberschenkeln und Oberschenkeln"
text2 = "Tolles Essen und Landschaft"
text3 = "Mein Hobby ist Fotografie"
t = Tokenizer()
tokens1 = t.tokenize(text1, wakati=True)
tokens2 = t.tokenize(text2, wakati=True)
tokens3 = t.tokenize(text3, wakati=True)
documents = [tokens1, tokens2, tokens3]
#Erstellen Sie ein Wortwörterbuch mit Korpora.
dictionary =corpora.Dictionary(documents)
#Zeigen Sie die ID jedes Wortes an
print(dictionary.token2id)
#Erstellen Sie eine Tasche voller Wörter
bow_corpus =[dictionary.doc2bow(d) for d in documents]
# (id,Anzahl der Auftritte)Die Liste von wird ausgegeben.
print(bow_corpus)
print()
# bow_Geben Sie den Inhalt des Korpus leicht verständlich aus
texts = [text1, text2, text3]
for i in range(len(bow_corpus)):
print(texts[i])
for j in range(len(bow_corpus[i])):
index = bow_corpus[i][j][0]
num = bow_corpus[i][j][1]
print("\"", dictionary[index], "\"Aber" ,num, "Mal", end=", ")
print()
Ausgabeergebnis
{'Sumomo': 0, 'Ebenfalls': 1, 'EbenfallsEbenfalls': 2, 'von': 3, 'Zuhause': 4, 'Küche': 5, 'Aussicht': 6, 'groß': 7, 'ich': 8, 'Hobby': 9, 'Ist': 10, 'Foto': 11, 'Schießen': 12, 'ist': 13}
[[(0, 1), (1, 2), (2, 2), (3, 1), (4, 1)], [(1, 2), (5, 1), (6, 1), (7, 1)], [(3, 1), (8, 1), (9, 1), (10, 1), (11, 1), (12, 1), (13, 1)]]
Von den Oberschenkeln und Oberschenkeln
"Sumomo"Einmal, "Ebenfalls"Zweimal, "Pfirsiche"Zweimal, "von"Einmal, "Zuhause"Einmal,
Tolles Essen und Landschaft
"Ebenfalls"Zweimal, "Küche"Einmal, "Aussicht"Einmal, "groß"Einmal,
Mein Hobby ist Fotografie
"von"Einmal, "ich"Einmal, "Hobby"Einmal, "Ist"Einmal, "Foto"Einmal, "Schießen"Einmal, "ist"Einmal,
In dem in "BOW_count expression" ausgeführten Zählausdruck wurde die Anzahl der Vorkommen der Wörter, die den Satz charakterisieren, als Merkmalsmenge behandelt.
tf-idf ist
tf(Term frequency):Worthäufigkeit und
idf(Inverse Document Frequency):Umgekehrte Dokumenthäufigkeit, die anzeigt, wie selten das Wort ist (Seltenheit)
Es wird durch das Produkt von dargestellt.
tf und idf werden durch die folgende Formel definiert.
Verringern Sie die Wichtigkeit von Wörtern (allgemeinen Wörtern), die in vielen Dokumenten vorkommen Die Formel zeigt, dass sie dazu beiträgt, die Bedeutung von Wörtern zu erhöhen, die nur in einem bestimmten Dokument vorkommen.
Infolgedessen werden die Werte wie "is" und "masu" reduziert und die Wichtigkeit kann korrekt eingestellt werden.
Mit anderen Worten, in tf-idf sind Wörter mit einer voreingenommenen Verteilung der Erscheinungen wichtiger, die häufiger nur in bestimmten Dokumenten und seltener in anderen Dokumenten vorkommen.
Ich möchte tf-idf tatsächlich implementieren. Paket von scikit-learn zur Verfügung gestellt
Implementieren Sie mit TfidfVectorizer.
TfidfVectorizer verwendet die in "BOW tf-idf-Gewichtung (Theorie)" erläuterte Formel. Es ist leicht verbessert implementiert, aber das Wesentliche ist dasselbe.
Die Implementierung der Vektordarstellung eines Dokuments mit TfidfVectorizer ist wie folgt.
#Bei der Anzeige mit 2 gültigen Nummern anzeigen
np.set_printoptions(precision=2)
#Getrennte Dokumente
docs = np.array([
"Weiß schwarz rot",
"Weiß weiß schwarz",
"Rot schwarz"
])
vectorizer = TfidfVectorizer(use_idf=True, token_pattern="(?u)\\b\\w+\\b")
vecs = vectorizer.fit_transform(docs)
#Ruft das Spaltenelement ab
print(vectorizer.get_feature_names())
# tf-Ruft die Matrix ab, in der der IDF-Wert gespeichert ist
print(vecs.toarray())
#Ausgabeergebnis
['Weiß', 'rot', 'schwarz']
[[ 0.62 0.62 0.48]
[ 0.93 0. 0.36]
[ 0. 0.79 0.61]]
Die n-te Zeile von vecs.toarray () entspricht der n-ten Vektordarstellung der Originaldokumentdokumente. Und die n-te Spalte von vecs.toarray () entspricht der Vektordarstellung aller Wörter.
Ich werde den Code ergänzen.
vectorizer = TfidfVectorizer()
#Dies erzeugt einen Konverter für die Vektordarstellung.
use_idf=False
#Wenn Sie dies tun, wird nur tf gewichtet.
TfidfVectorizer
#Dies liegt daran, dass standardmäßig ein Zeichen oder eine Zeichenfolge nicht als Token behandelt wird.
#Token als Argument_pattern="(?u)\\b\\w+\\b"Sollte nicht durch Hinzufügen ausgeschlossen werden.
"(?u)\\b\\w+\\b"
#Dies ist ein regulärer Ausdruck, der für "eine beliebige Zeichenfolge aus einem oder mehreren Zeichen" steht, aber Sie müssen ihn nicht gründlich verstehen.
#(Um genau zu sein, handelt es sich um einen regulären Ausdruck mit einer hinzugefügten Escape-Sequenz.)
vectorizer.fit_transform()
#Konvertieren Sie das Dokument in einen Vektor.
#Das Argument ist eine Reihe von Dokumenten, die durch Leerzeichen getrennt (geteilt) sind.
#Sie können die Ausgabe mit toarray in ein Numpy ndarray-Array konvertieren.
np.set_printoptions()
#Diese Funktion definiert das Anzeigeformat des Numpy-Arrays, und Sie können gültige Zahlen mit Genauigkeit angeben.
#In diesem Beispiel wird es mit zwei gültigen Nummern angezeigt.
Hier ist ein Beispiel, das darauf basiert
import numpy as np
from sklearn.feature_extraction.text import TfidfVectorizer
np.set_printoptions(precision=2)
docs = np.array([
"Apfel Apfel", "Apfelgorilla", "Gorilla-Trompete"
])
#In Vektordarstellung konvertieren.
vectorizer = TfidfVectorizer(use_idf=True, token_pattern=u"(?u)\\b\\w+\\b")
vecs = vectorizer.fit_transform(docs)
print(vectorizer.get_feature_names())
print(vecs.toarray())
Ausgabeergebnis
['Gorilla', 'Rap', 'Apfel']
[[ 0. 0. 1. ]
[ 0.71 0. 0.71]
[ 0.61 0.8 0. ]]
Bisher haben wir Dokumente vektorisiert, um sie quantitativ zu beurteilen. Durch Vergleichen der Vektoren können Sie die Ähnlichkeit zwischen Dokumenten analysieren. Zeigen, wie nahe ein Vektor an einem Vektor liegt
Es gibt eine cos Ähnlichkeit.
Die cos-Ähnlichkeit wird durch die folgende Formel ausgedrückt und repräsentiert den Cosinus (0 bis 1) des durch den Vektor gebildeten Winkels. Daher ist der cos-Ähnlichkeitswert hoch, wenn die Richtungen der beiden Vektoren nahe beieinander liegen. Es nimmt einen kleinen Wert an, wenn es in die entgegengesetzte Richtung zeigt.
Denken Sie daran, dass "wenn es nahe bei 1 ist, ist es ähnlich, und wenn es nahe bei 0 ist, ist es nicht."
Wenn implementiert, wird es wie folgt sein. np.dot () repräsentiert das innere Produkt und np.linalg.norm repräsentiert die Norm des Vektors (Länge des Vektors).
import numpy as np
def cosine_similarity(v1, v2):
cos_sim = np.dot(v1, v2) / (np.linalg.norm(v1)*np.linalg.norm(v2))
return cos_sim
Hier ist ein Anwendungsbeispiel.
import numpy as np
from sklearn.feature_extraction.text import TfidfVectorizer
docs = np.array([
"Apfel Apfel", "Apfelgorilla", "Gorilla-Trompete"
])
vectorizer = TfidfVectorizer(use_idf=True, token_pattern=u"(?u)\\b\\w+\\b")
vecs = vectorizer.fit_transform(docs)
vecs = vecs.toarray()
#Definieren Sie eine Funktion, um die Ähnlichkeit zu ermitteln
def cosine_similarity(v1, v2):
cos_sim = np.dot(v1, v2) / (np.linalg.norm(v1)*np.linalg.norm(v2))
return cos_sim
#Vergleichen wir die Ähnlichkeit
print("%1.3F" % cosine_similarity(vecs[0], vecs[1]))
print("%1.3F" % cosine_similarity(vecs[0], vecs[2]))
print("%1.3F" % cosine_similarity(vecs[1], vecs[2]))
Word2Vec
Im vorherigen Abschnitt wurde das Dokument als Vektordarstellung dargestellt, aber dieses Mal werden wir die Wörter vektorisieren. Indem Sie ein Wort als Vektor ausdrücken, können Sie die Nähe der Bedeutung des Wortes quantifizieren und nach Synonymen suchen.
Neuere Forschungen haben es zu einem Werkzeug zur Vektorisierung neugeborener Wörter gemacht
Es gibt etwas namens Word2Vec.
Um es kurz zu machen, um die Bedeutung und Grammatik von Wörtern zu erfassen Ein Werkzeug, das Dimensionen durch Vektorisieren von Wörtern komprimiert.
Es wird gesagt, dass die Anzahl der Vokabeln, die Japaner täglich verwenden, Zehntausende bis Hunderttausende beträgt. Word2Vec kann jedes Wort als Vektor mit etwa 200 Dimensionen ausdrücken.
Word2Vec erleichtert das Ausdrücken von Wort-zu-Wort-Beziehungen
"König"-"Mann"+"Frau"="Königin"
"Paris"-"Frankreich"+"Japan"="Tokio"
Es ist auch möglich, Operationen zwischen Wörtern wie z.
Hier geben wir Word2Vec die Dokumentdaten des Nachrichtenartikels "livingoor news corpus". Wir werden die Beziehungen zwischen Wörtern lernen.
Von nun an werden wir Word2Vec verwenden, um nach Zeichenfolgen zu suchen, die für das Wort "man" von hoher Relevanz sind. Der Fluss ist wie folgt. Gleichzeitig wird auch der entsprechende Sitzungsname aufgelistet.
1,Extrahieren Sie Nachrichtenartikel als Textkorpus und unterteilen Sie sie in Sätze und Kategorien.:"Glob Modul", "mit Anweisung", "Korpus aufrufen"
2,Teilen Sie die extrahierten Dokumente durch Teile und erstellen Sie eine Liste.: 「janome(3)」
3,Generieren Sie ein Modell mit Word2Vec.:"Word2Vec (Implementierung)"
4,Suchen Sie nach Wörtern, die für einen Mann von hoher Relevanz sind.:"Word2Vec (Implementierung)"
Das Glob-Modul ist ein praktisches Modul zum Bearbeiten von Dateien und Verzeichnissen. Sie können den Pfad mithilfe regulärer Ausdrücke angeben.
Datei: Die kleinste Informationseinheit, die vom Benutzer betrieben und verwaltet wird, z. B. Dokumente, Fotos und Musik.
Verzeichnis: Ein Container, der Dateien zusammenhält.
Pfad: Der Speicherort einer Datei oder eines Verzeichnisses auf Ihrem Computer.
Glob-Modul
Was unterscheidet sich vom OS-Modul (im Grunde das Modul, das beim Bearbeiten von Dateien und Verzeichnissen verwendet wird)?
Der Punkt ist, dass Sie Dateien mit Sonderzeichen und Zeichenfolgen mit Bedacht durchsuchen können. Wenn Sie beispielsweise wie im folgenden Beispiel mit einem Stern * schreiben Sie können alle txt-Dateien im Testverzeichnis anzeigen.
import glob
lis = glob.glob("test/*.txt")
print(lis)
#Ausgabeergebnis
["test/sample.txt", "test/sample1.txt", "test/sample2.txt"]
Sie können auch eine spezielle Zeichenfolge wie im folgenden Beispiel verwenden. In diesem Beispiel können alle .txt-Beispieldateien (Nummer) im Testverzeichnis angezeigt werden.
import glob
lis = glob.glob("test/sample[0-9].txt")
print(lis)
#Ausgabeergebnis
["test/sample1.txt", "test/sample2.txt"]
Beim Lesen einer normalen Datei
open()Öffnen Sie die Datei mit
read()Lesen Sie die Datei mit etc.
close()Schließen Sie die Datei mit.
Das zweite Argument "r" von open () im folgenden Beispiel gibt den Modus beim Öffnen der Datei an. In diesem Fall bedeutet dies "Lesen", was bedeutet, dass es schreibgeschützt ist. Wenn es beispielsweise nur schreibgeschützt ist, geben Sie "w" an, um "schreiben" zu bedeuten.
f = open("a.text", "r", encoding="utf-8")
data = f.read()
f.close()
Aber mit dieser Notation Ich habe vergessen, close () zu schreiben Unterwegs ist ein Fehler aufgetreten und die Datei konnte nicht geschlossen werden Möglicherweise wird Speicher verschwendet.
Also stattdessen
Verwenden Sie die with-Anweisung.
Verwenden Sie die with-Anweisung Und die Datei wird automatisch geschlossen () Selbst wenn beim Öffnen der Datei ein Fehler auftritt, wird die ordnungsgemäße Ausnahmebehandlung automatisch durchgeführt. sehr angenehm.
Wenn Sie die with-Anweisung verwenden, öffnen Sie die Datei wie folgt. Das beliebteste in diesem Beispiel
Zeichencode UTF-Die Datei wird bei 8 ausgegeben.
Ein Zeichencode ist eine Nummer, die jedem Zeichen zugewiesen wird, um das Zeichen auf dem Computer zu verarbeiten.
with open("a.text", "r", encoding="utf-8") as f:
Zum Beispiel im with-Satz
data = f.read()
Lesen Sie die Datei mit etc. Wenn Sie read () verwenden Liest alle Daten in der Datei als Zeichenfolge.
Ein Korpus bestand aus Daten, die einem Dokument oder Audiodaten einige Informationen gaben.
Laut der Download-Quelle enthält der Livedoor-Nachrichtenkorpus die folgenden Daten.
Von den "Livedoor News", die von NHN Japan Co., Ltd. betrieben werden.
Sammeln Sie Nachrichtenartikel, die unter die Creative Commons-Lizenz fallen
Es wird erstellt, indem HTML-Tags so weit wie möglich entfernt werden.
Es erfordert nicht die Datenformatierungsarbeit, die normalerweise erforderlich ist.
Nehmen Sie das Verzeichnis, das ich als Beispiel verwende Sie können den Inhalt des Textverzeichnisses und des Verzeichnisses für jede Kategorie mit dem folgenden Code überprüfen.
glob.glob("./5050_nlp_data/*")
glob.glob("./text/sports-watch/*")
Nehmen Sie diesmal den Livedoor-Nachrichtenkorpus als Textkorpus heraus Es ist in Sätze und Kategorien unterteilt. Sie können den Korpus herausnehmen und klassifizieren, indem Sie wie folgt schreiben. Auf den ersten Blick ist es kompliziert, aber der Inhalt ist sehr einfach.
splitlines()Ist
Eine integrierte Funktion, die eine Zeichenfolge bei Unterbrechungen zerlegt und eine Liste jeder Zeile zurückgibt.
import glob
def load_livedoor_news_corpus():
category = {
"dokujo-tsushin": 1,
"it-life-hack":2,
"kaden-channel": 3,
"livedoor-homme": 4,
"movie-enter": 5,
"peachy": 6,
"smax": 7,
"sports-watch": 8,
"topic-news":9
}
docs = [] #Der Text aller Artikel wird hier gespeichert.
labels = [] #Behandeln Sie die Kategorien 1-9 von Artikeln, die in Dokumenten gespeichert sind, als Etiketten.
#Für Verzeichnisse aller Kategorien ausführen.
for c_name, c_id in category.items():
# {c_name}In der Kategorie.items()Kategoriename c erhalten von_Betten Sie den Namen mit der Formatierungsmethode ein.
files = glob.glob("./5050_nlp_data/{c_name}/{c_name}*.txt".format(c_name=c_name))
#Zeigt die Anzahl der Dateien (Anzahl der Artikel) an, die zur Kategorie gehören.
print("category: ", c_name, ", ", len(files))
#Rufen Sie für jeden Artikel die folgenden Informationen zu URL, Datum, Titel und Text ab.
for file in files:
#Schließen Sie, da die with-Anweisung verwendet wird()Ist unnötig.
with open(file, "r", encoding="utf-8") as f:
#Aufteilen nach Zeilenvorschubzeichen
lines = f.read().splitlines()
#0. URL beim Teilen,Das Datum wird zuerst aufgeführt, der Titel wird an zweiter Stelle aufgeführt und der Artikeltext wird nach dem dritten aufgeführt.
url = lines[0]
datetime = lines[1]
subject = lines[2]
#Der Text im Artikel wird in einer Zeile zusammengefasst.
body = "".join(lines[3:])
#Ich werde den Titel und den Text zusammenstellen.
text = subject + body
docs.append(text)
labels.append(c_id)
return docs, labels
#Holen Sie sich die Textdaten aller Artikel und deren Beschriftungen (Kategorien).
docs, labels = load_livedoor_news_corpus()
Klicken Sie hier für aktuelle Anwendungsbeispiele
import glob
def load_livedoor_news_corpus():
category = {
"dokujo-tsushin": 1,
"it-life-hack":2,
"kaden-channel": 3,
"livedoor-homme": 4,
"movie-enter": 5,
"peachy": 6,
"smax": 7,
"sports-watch": 8,
"topic-news":9
}
docs = []
labels = []
#Kopieren Sie den obigen Code.
for c_name, c_id in category.items():
files = glob.glob("./5050_nlp_data/{c_name}/{c_name}*.txt".format(c_name=c_name))
text = ""
for file in files:
with open(file, "r", encoding="utf-8") as f:
lines = f.read().splitlines()
url = lines[0]
datetime = lines[1]
subject = lines[2]
body = "".join(lines[3:])
text = subject + body
docs.append(text)
labels.append(c_id)
return docs, labels
docs, labels = load_livedoor_news_corpus()
print("\nlabel: ", labels[0], "\ndocs:\n", docs[0])
print("\nlabel: ", labels[1000], "\ndocs:\n", docs[1000])
Nachdem wir die vorherige Phase eingeführt haben, erklären wir das Hauptthema von Word2Vec.
Importieren Sie bei Verwendung von Word2Vec aus dem Gensim-Modul.
from gensim.models import word2vec
Listen (geteilte Dokumente), die zum Lernen verwendet werden Generieren Sie ein Modell, indem Sie es als Argument der Word2Vec-Funktion verwenden.
Verwenden Sie den in "BOW count" usw. behandelten janome.tokenizer, um im Voraus zu schreiben. Schauen Sie beim Schreiben den Teil jedes Wortes nach.
Im Japanischen können nur "Substantive, Verben, Adjektive, Adjektivverben" verwendet werden, um die Relevanz von Wörtern zu analysieren. Erstellen Sie eine separate Liste mit nur "Substantiven, Verben, Adjektiven, Adjektivverben".
Word2Vec wird wie folgt verwendet.
model = word2vec.Word2Vec(aufführen, size=a, min_count=b, window=c)
#Ein, b,c ist eine Zahl
Die von Word2Vec verwendeten Hauptargumente lauten wie folgt.
Größe: Die Anzahl der Dimensionen des Vektors.
Fenster: Wörter vor und nach dieser Nummer gelten als verwandte Wörter zum Lernen.
min_count: Verwerfen Sie Wörter, die weniger als n Mal vorkommen.
Nach richtigem Lernen für das Modell
.most_similar(positive=["Wort"])
Wenn Sie die Methode most_similar () wie verwenden Der mit der hohen Ähnlichkeit zum Wort wird ausgegeben.
Als Beispiel Verwenden Sie word2vec, um Wörter auszugeben, die in hohem Maße mit dem Wort "man" verwandt sind. Geben Sie für das Argument von word2vec.Word2Vec [Sätze] in der Liste an. Setze Größe = 100, min_count = 20, Fenster = 15.
import glob
from janome.tokenizer import Tokenizer
from gensim.models import word2vec
#Laden und Klassifizieren von Livedoor-Nachrichten
def load_livedoor_news_corpus():
category = {
"dokujo-tsushin": 1,
"it-life-hack":2,
"kaden-channel": 3,
"livedoor-homme": 4,
"movie-enter": 5,
"peachy": 6,
"smax": 7,
"sports-watch": 8,
"topic-news":9
}
docs = []
labels = []
for c_name, c_id in category.items():
files = glob.glob("./5050_nlp_data/{c_name}/{c_name}*.txt".format(c_name=c_name))
text = ""
for file in files:
with open(file, "r", encoding="utf-8") as f:
lines = f.read().splitlines()
#1,Die Zeit hängt nicht mit der in der zweiten Zeile angegebenen URL zusammen. Entfernen Sie sie daher.
url = lines[0]
datetime = lines[1]
subject = lines[2]
body = "".join(lines[3:])
text = subject + body
docs.append(text)
labels.append(c_id)
return docs, labels
#Nehmen Sie Teilwörter heraus und erstellen Sie eine Liste mit "Substantiven, Verben, Adjektiven, Adjektivverben".
def tokenize(text):
tokens = t.tokenize(",".join(text))
word = []
for token in tokens:
part_of_speech = token.part_of_speech.split(",")[0]
if part_of_speech in ["Substantiv", "Verb", "Adjektiv", "形容Verb"]:
word.append(token.surface)
return word
#Klassifizieren Sie in Bezeichnungen und Sätze
docs, labels = load_livedoor_news_corpus()
t = Tokenizer() #Erstellen Sie zunächst eine Tokenizer-Instanz
sentences = tokenize(docs[0:100]) #Aufgrund der großen Datenmenge begrenzt
#Bitte erstellen Sie unten eine Antwort
#word2vec.Bei Word2Vec-Argumenten Größe=100, min_count=20, window=Bitte auf 15 einstellen
model = word2vec.Word2Vec([sentences], size=100, min_count=20, window=15)
print(model.most_similar(positive=["Mann"]))
Doc2Vec
Doc2Vec(1)
Doc2Vec ist eine Technologie zum Vektorisieren von Sätzen, die Word2Vec anwendet.
Ich habe die Satzvektorisierung mit BOW in "Document Vector Representation" studiert. Der große Unterschied zu BOW besteht darin, dass auch die Wortreihenfolge von Sätzen als Merkmal berücksichtigt werden kann.
Das Folgende ist eine Übersicht über die Mängel von BOW, die aus der Vektordarstellung von Dokumenten gelernt wurden.
① Es gibt keine Informationen zur Wortreihenfolge für Wörter
② Ich kann die Bedeutung von Wörtern nicht gut ausdrücken
Doc2Vec gleicht diese beiden Mängel aus.
Doc2Vec(2)
Wir werden Doc2Vec implementieren. Erstellt in "Retrieving Corpus"
Livedoor News Corpus Docs[0],docs[1],docs[2],docs[3]Vergleichen Sie die Ähnlichkeit von.
Der Fluss sieht so aus
1,Teilen
Verwenden Sie den Tokenizer von Janome, um den Text separat zu schreiben.
2,Erstellen Sie eine Instanz der TaggedDocument-Klasse
Wörter im Argument von TaggedDocument="Jedes Element, das geteilt wird", tags=["Etikett"]Wenn du gibst
Sie können eine Instanz der TaggedDocument-Klasse erstellen.
Tags sind wie die ID eines Dokuments.
Speichern Sie das TaggedDocument in einer Liste und übergeben Sie es an Doc2Vec.
3,Modellgenerierung mit Doc2Vec
Das Training des Modells wird wie folgt beschrieben.
model = Doc2Vec(documents=aufführen, min_count=1)
# min_count:Verwenden Sie zum Lernen nur Wörter, die mindestens so oft vorkommen
4,Ähnlichkeitsausgabe
Die Ausgabe der Ähnlichkeit wird wie folgt beschrieben.
for i in range(4):
print(model.docvecs.most_similar("d"+str(i)))
Klicken Sie hier für ein zusammenfassendes Anwendungsbeispiel
import glob
from gensim.models.doc2vec import Doc2Vec
from gensim.models.doc2vec import TaggedDocument
from janome.tokenizer import Tokenizer
#Laden und Klassifizieren von Livedoor-Nachrichten
def load_livedoor_news_corpus():
category = {
"dokujo-tsushin": 1,
"it-life-hack":2,
"kaden-channel": 3,
"livedoor-homme": 4,
"movie-enter": 5,
"peachy": 6,
"smax": 7,
"sports-watch": 8,
"topic-news":9
}
docs = []
labels = []
for c_name, c_id in category.items():
files = glob.glob("./5050_nlp_data/{c_name}/{c_name}*.txt".format(c_name=c_name))
text = ""
for file in files:
with open(file, "r", encoding="utf-8") as f:
lines = f.read().splitlines()
#1,Die Zeit hängt nicht mit der in der zweiten Zeile angegebenen URL zusammen. Entfernen Sie sie daher.
url = lines[0]
datetime = lines[1]
subject = lines[2]
body = "".join(lines[3:])
text = subject + body
docs.append(text)
labels.append(c_id)
return docs, labels
docs, labels = load_livedoor_news_corpus()
#Doc2Vec-Verarbeitung
token = [] #Eine Liste, in der die Ergebnisse der einzelnen Dokumente gespeichert sind
training_docs = [] #Liste zum Speichern von TaggedDocument
t = Tokenizer() #Erstellen Sie zunächst eine Tokenizer-Instanz
for i in range(4):
# docs[i]Und speichern Sie es in Token
token.append(t.tokenize(docs[i], wakati=True))
#Erstellen Sie eine Instanz der TaggedDocument-Klasse und trainieren Sie die Ergebnisse_In Dokumenten speichern
#Das Tag ist"d Nummer"Wird besorgt
training_docs.append(TaggedDocument(words=token[i], tags=["d" + str(i)]))
#Bitte erstellen Sie unten eine Antwort
model = Doc2Vec(documents=training_docs, min_count=1)
for i in range(4):
print(model.docvecs.most_similar("d"+str(i)))
Kategorisieren Sie japanische Textkategorien in einer zufälligen Gesamtstruktur. Auch hier verwenden wir lebende Nachrichten. Die Daten, die der zufälligen Gesamtstruktur gegeben werden, sind eine Vektordarstellung des Nachrichtenartikels Es ist in 9 Kategorien unterteilt. Indem Sie Artikel als Vektoren ausdrücken, können Sie Artikel klassifizieren, indem Sie die im überwachten Lernen erlernten Methoden so anwenden, wie sie sind.
Der Lernfluss dieses Kapitels ist wie folgt.
1,Laden und Klassifizieren von Livedoor-Nachrichten: "Retrieving Corpus"
2,Aufteilen von Daten in Trainingsdaten und Testdaten: "Theorie und Praxis der Holdout-Methode" in Einführung in das maschinelle Lernen
3,tf-Vektorisieren Sie Trainings- und Testdaten mit idf: "BOW tf-Gewichtung nach idf (Implementierung) "," fit function "
4.Lernen Sie in Random Forest: Überwachte Klassifizierung "Random Forest"
5.Implementierung: "Implementieren einer Korpuskategorie in einer zufälligen Gesamtstruktur"
6.Genauigkeit erhöhen: "Genauigkeit erhöhen"
scikit-lernen Für Konvertierungsklassen (StandardScaler, Normalizer, TfidfVectorizer usw.) Es gibt Funktionen wie fit (), fit_transform (), transform ().
fit()Funktion: Statistiken (Maximalwert, Minimalwert, Durchschnitt usw.) der übergebenen Daten abrufen und im Speicher speichern.
transform()Funktion: fit()Schreiben Sie die Daten mit den in erfassten Informationen neu.
fit_transform()Funktion: fit()Nach der Transformation()Ausführen.
Die Funktion fit () wird verwendet, um Parameter aus dem Trainingsdatensatz zu lernen Die Funktion tranform () formt die Daten basierend auf den gelernten Parametern neu. Mit anderen Worten (1) Verwenden Sie für Trainingsdaten die Funktion fit_transform (2) Bei Testdaten basiert dies auf dem Ergebnis der Anpassung () der Trainingsdaten. Sie müssen die transform () -Funktion ausführen.
Verwenden Sie das Gelernte, um den Korpus der lebenden Nachrichten in zufällige Wälder zu kategorisieren.
Wie ich in "Klassifikation des japanischen Textes" geschrieben habe, ist der Ablauf wie folgt.
1,Laden und Klassifizieren von Livedoor-Nachrichten: "Retrieving Corpus"
2,Aufteilen von Daten in Trainingsdaten und Testdaten: "Theorie und Praxis der Holdout-Methode" in Einführung in das maschinelle Lernen
3,tf-Vektorisieren Sie Trainings- und Testdaten mit idf: "BOW tf-Gewichtung nach idf (Implementierung) "," fit function "
4.Lernen Sie in Random Forest: Überwachte Klassifizierung "Random Forest"
5.Implementierung: "Implementieren einer Korpuskategorie in einer zufälligen Gesamtstruktur"
6.Genauigkeit erhöhen: "Genauigkeit erhöhen"
Wir werden daran arbeiten, die Genauigkeit der in "Klassifizieren von Korpuskategorien nach zufälligen Wäldern" implementierten Kategorievorhersage zu verbessern.
TfidfVectorizer()Zu den Parametern von
tokenizer=Sie können eine Funktion festlegen, um den Text durch die angegebene Funktion zu teilen.
Zum Beispiel die folgende Funktion Wenn tokenizer = als Argument verwendet wird, wird es mit Text vektorisiert, der "Substantiv, Verb, Adjektiv, Adjektivverb" enthält. Dieses Mal habe ich versucht, die Vorhersagegenauigkeit der Kategorie zu verbessern, indem ich die Hilfswörter usw. weggelassen habe. Je nach Modell ist es möglicherweise besser, Hilfswörter einzuschließen.
from janome.tokenizer import Tokenizer
t=Tokenizer()
def tokenize(text):
tokens = t.tokenize(",".join(text))
noun = []
for token in tokens:
#Nehmen Sie das Teil heraus
partOfSpeech = token.part_of_speech.split(",")[0]
if partOfSpeech == "Substantiv":
noun.append(token.surface)
if partOfSpeech == "Verb":
noun.append(token.surface)
if partOfSpeech == "Adjektiv":
noun.append(token.surface)
if partOfSpeech == "Adjektiv Verb":
noun.append(token.surface)
return noun
Recommended Posts