[PYTHON] Ich habe ein Lernkit für word2vec / doc2vec / GloVe / fastText erstellt

Dieser Artikel ist der 21. Tag von Natural Language Processing # 2 Adventskalender 2019. Übrigens habe ich heute Geburtstag. Bitte feiern Sie. ~~ Ms Buch, wie das Setzen einer Frist für Geburtstage ~~

Einführung

In der Welt der Worteinbettung war BERT im vergangenen Jahr weit verbreitet, und selbst ELMo wird immer seltener. Möglicherweise möchten Sie weiterhin verteilte Legacy-Darstellungen wie word2vec und GloVe verwenden. Außerdem möchten Sie vielleicht mit den Daten lernen, die Sie haben (zumindest für mich). Also habe ich ein Lernkit für word2vec / doc2vec / GloVe / fastText für mich erstellt, damit ich es veröffentlichen kann.

word2vec / doc2vec / fastText kann das Modell von [gensim] trainieren (https://radimrehurek.com/gensim/), GloVe kann das Modell von [offizieller Implementierung] trainieren (https://nlp.stanford.edu/projects/glove/) ..

Ich habe in der README-Datei jedes Pakets geschrieben, wie man es verwendet, daher werde ich hier über das Designkonzept des Lernkits schreiben.

1. API-Standardisierung von Modellschulungsfunktionen

Es gibt verschiedene Bibliotheken / Pakete mit wortverteilten Ausdrücken. Das angenommene Format des Datensatzes ist für jede Bibliothek unterschiedlich. Immer wenn ich ein Vorverarbeitungsskript schreibe, das es in eine für die Bibliothek geeignete Form bringt Der Code wird immer schmutziger. Daher haben wir den Iterator zum Lesen des Textdatensatzes freigegeben. Ich versuche, das für jede Bibliothek in der Funktion geeignete Datenformat zu formatieren.

def train_*****_model(
    output_model_path,
    iter_docs,
    **kwargs
)

Für word2vec:

def train_word2vec_model(
    output_model_path,
    iter_docs,
    size=300,
    window=8,
    min_count=5,
    sg=1,
    epoch=5
):
    """
    Parameters
    ----------
    output_model_path : string
        path of Word2Vec model
    iter_docs : iterator
        iterator of documents, which are raw texts
    size : int
        size of word vector
    window : int
        window size of word2vec
    min_count : int
        minimum word count
    sg : int
        word2vec training algorithm (1: skip-gram other:CBOW)
    epoch : int
        number of epochs
    """

iter_docs ist ein Iterator von Wortlisten für jedes Dokument.

2. Ermöglichen Sie das Lernen aus einem beliebigen Textdatensatz

Bereiten Sie eine abstrakte Klasse "TextDatasetBase" vor, die eine Datensatz-Lese-API definiert. Durch Implementieren der Leseklasse des Datensatzes, den der Benutzer in einer Form verwenden möchte, die diese Klasse erbt, ist es möglich, jeden Datensatz zu verarbeiten.

class TextDatasetBase(ABC):
    """
    a bass class for text dataset
    
    Attributes
    ----------
    """
    @abstractmethod
    def iter_docs(self):
        """
        iterator of documents
        
        Parameters
        ----------
        """
        yield None

Beispiel einer Datensatzklasse für MARD

class MARDDataset(TextDatasetBase):
    def __init__(self, word_tokenizer):
        self.root_path = None
        self.word_tokenizer = word_tokenizer

    def iter_docs(self, dataset_path):
        """
        get iterator of texts in one document
        
        Parameters
        ----------
        dataset_path: string
            path to dataset
        """
        self.root_path = Path(dataset_path)
        reviews_json_fn = self.root_path / "mard_reviews.json"
        with open(reviews_json_fn, "r") as fi:
            for line in fi:
                review_dict = json.loads(line, encoding="utf-8")
                title = review_dict["reviewerID"]
                text = review_dict["reviewText"]
                yield self.word_tokenizer.tokenize(text)

Ich bin der Meinung, dass der "DataLoader" von pytorch etwa 200 Millionen Mal ausgefeilter ist als dieser, aber das habe ich mir ausgedacht. Bitte lassen Sie mich wissen, wenn Sie ein besseres Design haben.

Wie benutzt man

Installation

Nehmen Sie als Beispiel word2vec

git clone [email protected]:stfate/word2vec-trainer.git
cd word2vec-trainer

git submodule init
git submodule update
pip install -r requirements.txt

Ausführung des Lernens

python train_text_dataset.py -o $OUTPUT_PATH --dictionary-path=$DIC_PATH --corpus-path=$CORPUS_PATH --size=100 --window=8 --min-count=5

Verwendung des Modells

model_path = "model/word2vec.gensim.model"
model = Word2Vec.load(model_path)

wichtiger Punkt

Wenn Sie mit einem großen Datensatz wie Wikipedia trainieren, kann dies das Gedächtnis verschlingen und fallen. Untersuchung läuft.

abschließend

Es macht Spaß, über die API der Bibliothek nachzudenken

Recommended Posts

Ich habe ein Lernkit für word2vec / doc2vec / GloVe / fastText erstellt
[Python] Ich habe einen Klassifikator für Iris erstellt [Maschinelles Lernen]
Ich habe eine C ++ - Lernseite erstellt
Ich habe ein Dash-Docset für Holoviews erstellt
Ich habe eine Bibliothek für versicherungsmathematische Versicherungen erstellt
[Ver1.3.1 Update] Ich habe DataLiner erstellt, eine Datenvorverarbeitungsbibliothek für maschinelles Lernen.
Ich habe eine Python-Wörterbuchdatei für Neocomplete erstellt
Ich habe einen Ersatz2-Algorithmus für uWSGI billiger gemacht
Ich habe ein nützliches Tool für Digital Ocean erstellt
Ich habe einen Downloader für wortverteilte Ausdrücke erstellt
Wir haben ein Peeping-Prevention-Produkt für die Telearbeit entwickelt.
Ich habe den Deep Learning Framework Chainer installiert
Lassen Sie uns Chat-Benutzerverwaltungstool gemacht
Ich habe mit Tkinter ein Fenster für die Protokollausgabe erstellt
Ich habe ein Reinigungstool für Google Container Registry erstellt
[VSCode] Ich habe ein Benutzer-Snippet für Python-Druck-F-String erstellt
Ich habe versucht, Tensorboard zu verwenden, ein Visualisierungstool für maschinelles Lernen
Ich habe einen Ressourcenmonitor für Raspberry Pi mit einer Tabelle erstellt
Ich habe versucht, eine Gesichtsdiagnose-KI für professionelle Golferinnen zu erstellen ③
Ich habe einen Python-Text gemacht
Befehl für FizzBuzz erstellt
Erstellt ein Tool, mit dem Sie bequem Parameter für Modelle des maschinellen Lernens festlegen können
Ich habe einen Zwietrachtbot gemacht
Ich habe Word2Vec mit Pytorch gemacht
Python> Ich habe einen Testcode für meine eigene externe Datei erstellt
Ich suchte mit Deep Learning nach einer ähnlichen Karte von Hearthstone
Erstelltes WebSocket Client / Server-CLI-Tool (wie WebSocket Version Netcat)
Ich habe viele Dateien für die RDP-Verbindung mit Python erstellt
Ich habe eine Entwicklungsumgebung für Django 3.0 mit Docker, Docker-Compose und Poetry erstellt
Ich habe versucht, ein Gerüstwerkzeug für Python Web Framework Bottle zu erstellen
Ich habe eine Python-Wrapper-Bibliothek für die Docomo-Bilderkennungs-API erstellt.
Ich berührte PyAutoIt für einen Moment
Ich habe einen Line-Bot mit Python gemacht!
Ich habe ein CUI-basiertes Übersetzungsskript erstellt (2)
Ich habe einen Wikipedia Gacha Bot gemacht
Ich habe mit Python eine Lotterie gemacht.
Ich habe ein Angular Starter Kit gemacht
Ich habe mit Python einen Daemon erstellt
Ich habe einen Docker-Container erstellt, um JUMAN ++, KNP, Python (für pyKNP) zu verwenden.
Ich habe mit dem Lernprogramm TensorFlow --⑥ einen Dir en grey face-Klassifikator erstellt
Ich habe mit TensorFlow --⑧ Learning Execution einen Dir en Grey Face Classifier erstellt
Ich habe GAN mit Keras gemacht, also habe ich ein Video des Lernprozesses gemacht.
Ich habe mit dem TensorFlow --⑦ Lernmodell einen Dir en grey Gesichtsklassifikator erstellt
Ich habe ein Pay-Management-Programm in Python erstellt!
Ich berührte "Orator" und machte mir eine Notiz
Ich habe mit Python einen Zeichenzähler erstellt
Ich habe einen Gesprächspartner wie Siri gemacht
Ich habe ein Skript erstellt, um Piktogramme anzuzeigen
Ich habe mit Python eine Hex-Map erstellt
Ich habe ein Lebensspiel mit Numpy gemacht
Ich habe einen Hanko-Generator mit GAN gemacht
Ich habe ein automatisches Stempelwerkzeug für den Browser erstellt.
Nachdem ich Python3 studiert hatte, machte ich einen Slackbot
Ich habe mit Python ein schurkenhaftes Spiel gemacht
Erstellen einer Entwicklungsumgebung für maschinelles Lernen
Ich habe mit Python einen einfachen Blackjack gemacht
Ich habe mit Python eine Einstellungsdatei erstellt
Ich habe eine WEB-Bewerbung bei Django gemacht
Ein Lehrbuch für Anfänger von Python-Anfängern
Ich habe mit Python einen Neuronensimulator erstellt