[PYTHON] Verwenden wir den verteilten Ausdruck von Wörtern schnell mit fastText!

In diesem Artikel erfahren Sie, wie Sie mit fastText eine verteilte Darstellung von ** gestochen scharfen ** Wörtern erhalten. Ich habe es in der Hoffnung geschrieben, dass es mit dem Artikel vom Vortag verknüpft werden kann.

Was ist fastText?

fastText ist eine Methode, um die von Facebook angekündigte verteilte Darstellung von Wörtern (numerisch ausgedrückte Wörter) zu erhalten. Basis ist das bekannte Word2Vec (CBOW / Skip-Gram). Word2Vec ist noch neu, daher ist keine Erklärung erforderlich.

Artikel: Anreichern von Wortvektoren mit Unterwortinformationen

Der Unterschied zwischen Word2Vec und fastText besteht darin, wie ein Vektor genommen wird. Durch die Integration eines Mechanismus, der als Unterwörter bezeichnet wird, werden Wörter, die nahe beieinander liegen, beispielsweise in Form einer Verwendung, zusammengeführt.

In Word2Vec waren Go and Go völlig andere Wörter. Aber fastText berücksichtigt dies und macht go und go als dieselbe Komponente sinnvoll. Natürlich wirst du stark gegen unbekannte Wörter sein!

Für Details empfehlen wir das Papier und die folgenden Materialien.

Lass uns mit FastText spielen

Der Zweck dieser Zeit ist es, "mit Python und FastText schnell mit verteilten Wortausdrücken zu spielen".

Umgebung

e? Können Sie Python nicht einmal schnell vorstellen? Verwenden wir Google Colaboratory. (Im Folgenden colab)

colab ist die stärkste kostenlose Umgebung, in der jeder mit einem Google-Konto problemlos Python und GPU verwenden kann.

Knackiger und schneller Text

Für die Verwendung von fastText ist ein Lernmodell erforderlich. Sie können die Daten selbst sammeln und trainieren, aber hier verwenden wir das trainierte Modell.

Geschultes Modell: Das geschulte Modell von fastText wurde veröffentlicht - Qiita

Werfen Sie das Modell einfach in Google Drive. Da es eine große Sache ist, entpacken wir es vom Laufwerk, einschließlich Anweisungen zur Verwendung von colab!

Eine Halterung ist erforderlich, um das Innere des Laufwerks mit Colab zu berühren. Sie können dies tun, indem Sie den folgenden Code ausführen. Wenn Sie jedoch auf die Schaltfläche "Laufwerk einbinden" klicken, sollten Sie denselben Code erhalten. Führen Sie ihn daher aus.

from google.colab import drive
drive.mount('/content/drive')

Greifen Sie danach auf die URL zu, melden Sie sich beim Konto an und Sie sehen den Autorisierungscode. Kopieren Sie ihn einfach und fügen Sie ihn mit colab ein. Einfach.

Alles was Sie tun müssen, ist das Modell zu entpacken!

%cd /content/drive/My Drive/data
!unzip vector_neologd.zip

Geben Sie als Pfad den Speicherort des trainierten Modells an, das Sie auf das Laufwerk hochgeladen haben.

Lassen Sie uns nach ähnlichen Wörtern suchen.


import gensim

model = gensim.models.KeyedVectors.load_word2vec_format('model.vec', binary=False)

model.most_similar(positive=['Verarbeitung natürlicher Sprache'])

Ergebnis.

[('Natürliche Sprache verstehen', 0.7600098848342896),
 ('Natürliche Sprache', 0.7503659725189209),
 ('Computerlinguistik', 0.7258570194244385),
 ('Automatische Programmierung', 0.6848069429397583),
 ('Text Mining', 0.6811494827270508),
 ('Computer Sprache', 0.6618390083312988),
 ('Metaprogrammierung', 0.658093273639679),
 ('Web Programmierung', 0.6488876342773438),
 ('Morphologische Analyse', 0.6479052901268005),
 ('Korpuslinguistik', 0.6465639472007751)]

Es macht überraschend Spaß, herumzuspielen.


model.most_similar(positive=['Freund'], negative=['Freundschaft'])
[('Bekanntschaft', 0.4586910605430603),
 ('Zuhause', 0.35488438606262207),
 ('Bekanntschaft', 0.329221248626709),
 ('häufig', 0.3212822675704956),
 ('Verwandtschaft', 0.31865695118904114),
 ('Bekanntschaft', 0.3158203959465027),
 ('Zuhause', 0.31503963470458984),
 ('Einladung', 0.302945077419281),
 ('Häufig', 0.30250048637390137),
 ('Kollege', 0.29792869091033936)]

Knusprig? fastText

Es war so knackig, dass ich meinen Wortschatz weiterhin einschränken und das Gleiche tun würde. Es ist eine Option, dass es auch eine solche Methode gibt.

Dieses Mal werden wir uns mit japanischem Text befassen, aber im Gegensatz zu Englisch wird jedes Wort nicht durch Leerzeichen geteilt, sodass die Vorverarbeitung zuerst durchgeführt werden muss (separates Schreiben).

Die Implementierung basiert auf Learn while make! Deep Learning von PyTorch.

Hier verwenden wir Janome.

!pip install janome

Schreiben wir es auf.

from janome.tokenizer import Tokenizer

j_t = Tokenizer()

def tokenizer_janome(text):
    return [tok for tok in j_t.tokenize(text, wakati=True)]

Sie können mit janome schnell schreiben, aber lassen Sie uns eine einfache Vorverarbeitung durchführen.

import re
import unicodedata
import string


def format_text(text):
    text = unicodedata.normalize("NFKC", text)
    table = str.maketrans("", "", string.punctuation  + """ ,. ・")
    text = text.translate(table)

    return text


def preprocessing(text):
    """
Funktion zur Vorverarbeitung
    """
    text.translate(str.maketrans({chr(0xFF01 + i): chr(0x21 + i) for i in range(94)}))  #Vollwinkel → Halbwinkel

    text = text.lower()  #Großbuchstaben → Kleinbuchstaben

    text = re.sub('\r', '', text)
    text = re.sub('\n', '', text)
    text = re.sub(' ', '', text)
    text = re.sub(' ', '', text)

    text = re.sub(r'[0-9 0-9]', '', text)  #Entfernen von Nummern
    text = re.sub(r'[!-/:-@[-`{-~]', '', text)  #Entfernen von Symbolen halber Breite
    text = re.sub(r'/[!-/:-@[-`{-~、-~ "" ・]', '', text)  #Entfernen von Symbolen voller Breite
    text = format_text(text)  #Entfernen von Symbolen voller Breite

    return  text


def tokenizer_with_preprocessing(text):
    text = preprocessing(text)
    text = tokenizer_janome(text)
    
    return text

Wie ich im Kommentar geschrieben habe, habe ich einige Vorverarbeitungen durchgeführt. Natürlich ändert sich das, was Sie in der Vorverarbeitung tun müssen, je nach Aufgabe und Zweck.

Versuchen wir, einen geeigneten Satz einzufügen.


text = 'Dieses Mal möchte ich einen verteilten Ausdruck mit fastText erhalten! !! !!?'
print(tokenizer_with_preprocessing(text))

Ergebnis.

['diesmal', 'Ist', 'fasttext', 'Zu', 'Verwenden', 'Hand', 'Verteilt', 'Ausdruck', 'Zu', 'Erworben', 'Shi', 'Wollen']

Klingt so, als würde es funktionieren.

Verwenden Sie dann torchtext, um die Arbeit zu vereinfachen. Weitere Informationen zu torchtext finden Sie unter Einfache und tiefe Verarbeitung natürlicher Sprache mit torchtext-Qiita.


import torchtext

max_length = 25
TEXT = torchtext.data.Field(sequential=True, tokenize=tokenizer_with_preprocessing,
                            use_vocab=True, lower=True, include_lengths=True,
                            batch_first=True, fix_length=max_length)
LABEL = torchtext.data.Field(sequential=False, use_vocab=False)

train_ds, val_ds, test_ds = torchtext.data.TabularDataset.splits(
    path='./tsv/', train='train.tsv',
    validation='val.tsv', test='test.tsv', format='tsv',
    fields=[('Text', TEXT), ('Label', LABEL)])

Wir haben train.tsv / test.tsv / val.tsv vorbereitet. Dies ist eine tsv-Datei, indem der Text von "What is fastText" in diesem Artikel in drei Teile geteilt wird. Dies ist auch ein detaillierter Link oben, daher empfehle ich das.

from torchtext.vocab import Vectors

vectors = Vectors(name='model.vec')

#Erstellen Sie eine vektorisierte Version des Wortschatzes
TEXT.build_vocab(train_ds, vectors=vectors, min_freq=1)

#Überprüfen Sie den Vokabularvektor
print(TEXT.vocab.vectors.shape)  #52 Wörter werden durch einen 300-dimensionalen Vektor dargestellt
TEXT.vocab.vectors

#Überprüfen Sie die Reihenfolge der Wörter im Wortschatz
TEXT.vocab.stoi

Nachdem wir fertig sind, berechnen wir die Ähnlichkeit jedes Wortes im Vokabular. Mal sehen, ob drei Wörter "Wort" ähnlich sind.


import torch.nn.functional as F

tensor_calc = TEXT.vocab.vectors[TEXT.vocab.stoi['Wort']]

#Kosinusähnlichkeit
print("Papier-", F.cosine_similarity(tensor_calc, TEXT.vocab.vectors[TEXT.vocab.stoi['Papier-']], dim=0))
print("Wort", F.cosine_similarity(tensor_calc, TEXT.vocab.vectors[TEXT.vocab.stoi['Wort']], dim=0))
print("Vektor", F.cosine_similarity(tensor_calc, TEXT.vocab.vectors[TEXT.vocab.stoi['Vektor']], dim=0))

Ergebnis.

Papiertensor(0.3089)
Worttensor(0.3704)
Vektortensor(0.3265)

Für diejenigen, die mehr tun wollen

Es gibt verschiedene Artikel über fastText, wenn auch nicht so viele wie Word2Vec, daher werde ich diejenigen vorstellen, die ich besonders empfehle (Referenzen) und abschließen.

Dokumentklassifizierung mit fastText

Postscript-Speicherort. Ich habe bereits verschiedene Artikel vorgestellt, aber die folgenden kürzlich veröffentlichten Artikel sind die am meisten empfohlenen. Es gibt einen Vergleich mit Watson im Titel, aber es gibt einen fastText-Code, der mit Google colab funktioniert. Klicken Sie also einfach auf. Die Erklärung des Trainingsdatenformats ist ebenfalls höflich, und ich denke, es ist eine gute Idee, einen Blick auf den Artikel und den Code zu werfen.

Betten Sie andere Wörter als fastText ein

Wenn Sie neuere Worteinbettungen kennenlernen möchten, werden wahrscheinlich viele herauskommen, wenn Sie mit ELMo oder BERT googeln. Je neuer die Modelle sind, desto schwieriger wird es natürlich.

nächstes Mal?

@ Takashi1029!

Recommended Posts

Verwenden wir den verteilten Ausdruck von Wörtern schnell mit fastText!
Verwenden wir die API des allgemeinen Fensters für Regierungsstatistiken (e-Stat).
Zerstören Sie den Zwischenausdruck der Sweep-Methode mit Python
Verwenden wir die Python-Version des Confluence-API-Moduls.
Verwenden wir die offenen Daten von "Mamebus" in Python
Berechnen Sie das Produkt von Matrizen mit einem Zeichenausdruck?
Lassen Sie uns den Befehl pünktlich mit dem Bot der Zwietracht ausführen
Berühren wir die API der Netatmo Weather Station mit Python. #Python #Netatmo
Stellen wir uns die Anzahl der mit Matplotlib mit dem Coronavirus infizierten Personen vor
Verwenden wir usercustomize.py anstelle von sitecustomize.py
Verwenden wir Tomotopie anstelle von Gensim
Verwenden Sie die Vorschaufunktion mit aws-cli
Lassen Sie uns den Gewinner des Bingo bestimmen
Richten Sie die Größe der Farbleiste an der Matplotlib aus
Lassen Sie uns die Hyperparameter des Modells mit scikit-learn abstimmen!
Lösen wir das Portfolio mit kontinuierlicher Optimierung
[Einführung in Python] Verwenden wir foreach mit Python
Lesen wir die RINEX-Datei mit Python ①
Die dritte Nacht der Runde mit für
Die zweite Nacht der Runde mit für
Untersuchen wir den Mechanismus von Kaijis Chinchirorin
Zählen Sie die Anzahl der Zeichen mit Echo
Simulieren wir den Übergang der Infektionsrate in Bezug auf die Bevölkerungsdichte mit Python
Lernen Sie mit Jubatus die Trends von Feature-Wörtern in Texten kennen und kategorisieren Sie Ihre Eingabetexte
Lassen Sie uns mit Python Receive spielen und den Text des Eingabeformulars speichern / anzeigen
Lassen Sie uns den Bevölkerungsübergang von Matsue City, Präfektur Shimane, mit offenen Daten überprüfen
Zeichnen wir die Spannung des Digitalmultimeters 34461A des Messgeräts Keysight mit Circuit Python