Python: Vektordarstellung in natürlicher Sprache

Vektordarstellung des Dokuments

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.

Vektordarstellung des Dokuments

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.

BOW count Ausdruck

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, 

Gewichtung mit BOW tf-idf (Theorie)

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.

image.png

image.png

image.png

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.

Gewichtung nach BOW tf-idf (Implementierung)

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.

image.png

image.png

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.  ]]

cos Ähnlichkeit

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."

image.png

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]))

Vektordarstellung von Wörtern

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)"

Glob-Modul

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"]

mit Aussage

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.

Korpus herausnehmen

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])

Word2Vec (Implementierung)

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)))

Klassifizierung von japanischem Text

Klassifizierung von japanischem Text

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"

Fit-Funktion

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.

image.png

Kategorisieren Sie Korpuskategorien nach zufälligen Wäldern

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"

Upgrade-Genauigkeit

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

Python: Vektordarstellung in natürlicher Sprache
Python: Verarbeitung natürlicher Sprache
[Python] Vektoroperation
3. Verarbeitung natürlicher Sprache durch Python 2-1. Netzwerk für das gleichzeitige Auftreten
3. Verarbeitung natürlicher Sprache durch Python 1-1. Word N-Gramm
3. Verarbeitung natürlicher Sprache durch Python 2-2. Koexistenznetzwerk [mecab-ipadic-NEologd]
[Python] Ich habe mit der Verarbeitung natürlicher Sprache ~ Transformatoren ~ gespielt
Einführung in die Python-Sprache
RNN_LSTM2 Verarbeitung natürlicher Sprache
Natürliche Ordnung in Python
Erstellen einer Umgebung für die Verarbeitung natürlicher Sprache mit Python
[Übung] Erstellen Sie eine Watson-App mit Python! # 3 [Klassifizierung der natürlichen Sprache]
100 Sprachverarbeitungsklopfen mit Python 2015
Python ist eine Sprache für Erwachsene
100 Sprachverarbeitung Knock Kapitel 2 (Python)
Verarbeitung natürlicher Sprache 1 Morphologische Analyse
[Python] Versuchen Sie, Ramen-Shops durch Verarbeitung natürlicher Sprache zu klassifizieren
Verarbeitung natürlicher Sprache 3 Wortkontinuität
Verarbeitung natürlicher Sprache 2 Wortähnlichkeit
Japanische Verarbeitung natürlicher Sprache mit Python3 (4) Emotionsanalyse durch logistische Regression
Dockerfile mit den notwendigen Bibliotheken für die Verarbeitung natürlicher Sprache mit Python
Warum ist der verteilte Ausdruck von Wörtern für die Verarbeitung natürlicher Sprache wichtig?
Studieren Sie die Verarbeitung natürlicher Sprache mit Kikagaku
Matrixdarstellung mit Python-Standardeingabe
100 Sprachverarbeitungsklopfen mit Python (Kapitel 1)
100 Sprachverarbeitung Knock Kapitel 1 in Python
Verarbeitung natürlicher Sprache für vielbeschäftigte Menschen
[Verarbeitung natürlicher Sprache] Vorverarbeitung mit Japanisch
Natürliche Sprache: Word2Vec Part3 - CBOW-Modell
Natürliche Sprache: Word2Vec Part1 - Japanischer Korpus
100 Sprachverarbeitungsklopfen mit Python (Kapitel 3)
Einführung in Protobuf-c (C-Sprache ⇔ Python)
Künstliche Sprache Logivan und Verarbeitung natürlicher Sprache (Verarbeitung künstlicher Sprache)
Sprachverarbeitung 100 knock-86: Wortvektoranzeige
[Sprachverarbeitung 100 Schläge 2020] Kapitel 7: Wortvektor
10 Funktionen von "Sprache mit Batterie" Python
100 Sprachverarbeitung Knock 2020 Kapitel 7: Word Vector
Python-Anfänger versucht 100 Sprachverarbeitung klopfen 2015 (05 ~ 09)
Natürliche Sprache: Doc2Vec Part2 --Dokumentklassifizierung
[Python] Konvertiert natürliche Zahlen in Ordnungszahlen
Python, um von einer anderen Sprache zu wechseln
100 Sprachverarbeitung Knock Kapitel 1 von Python
Vorbereitung zum Starten der Verarbeitung natürlicher Sprache
Installationszusammenfassung des Analysators für die Verarbeitung natürlicher Sprache
Natürliche Sprache: Word2Vec Part2 - Skip-Gramm-Modell
Natürliche Sprache: ChatBot Part1-Twitter API Corpus
Rufen Sie die c-Sprache von Python aus auf (python.h)
Python-Anfänger versucht 100 Sprachverarbeitung klopfen 2015 (00 ~ 04)
3. Verarbeitung natürlicher Sprache mit Python 1-2. So erstellen Sie einen Korpus: Aozora Bunko