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.
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.
Der Zweck dieser Zeit ist es, "mit Python und FastText schnell mit verteilten Wortausdrücken zu spielen".
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.
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)]
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)
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.
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.
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.
@ Takashi1029!
Recommended Posts