J'ai fait un kit d'apprentissage pour word2vec / doc2vec / GloVe / fastText

Cet article est le 21e jour du Natural Language Processing # 2 Advent Calendar 2019. Au fait, c'est mon anniversaire aujourd'hui. Veuillez célébrer. ~~ Livre de M, comme fixer une date limite pour les anniversaires ~~

introduction

Dans le monde de l'intégration de mots, BERT a été endémique au cours de la dernière année, et même ELMo est de moins en moins courant. Vous pouvez toujours utiliser des représentations distribuées héritées telles que word2vec et GloVe. De plus, vous voudrez peut-être apprendre avec les données dont vous disposez (du moins pour moi). J'ai donc créé un kit d'apprentissage pour word2vec / doc2vec / GloVe / fastText pour moi-même, donc je vais le publier.

word2vec / doc2vec / fastText peut entraîner le modèle de gensim, GloVe peut entraîner le modèle de mise en œuvre officielle ..

J'ai écrit comment l'utiliser dans le fichier README de chaque paquet, alors j'écrirai ici sur le concept de conception du kit d'apprentissage.

1. Standardisation API des fonctions de formation des modèles

Il existe différentes bibliothèques / packages d'expressions distribuées par mot, Le format supposé du jeu de données est différent pour chaque bibliothèque, Chaque fois que j'écris un script de prétraitement qui le façonne en une forme adaptée à la bibliothèque Le code se salit de plus en plus. Par conséquent, nous avons partagé l'itérateur pour lire l'ensemble de données texte. J'essaye de formater le format de données adapté à chaque bibliothèque dans la fonction.

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

Pour 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 est un itérateur de listes de mots pour chaque document.

2. Autorisez l'apprentissage à partir de n'importe quel jeu de données texte

Préparez une classe abstraite TextDatasetBase qui définit une API de lecture d'ensemble de données. En implémentant la classe de lecture de l'ensemble de données que l'utilisateur souhaite utiliser dans un formulaire qui hérite de cette classe, il est possible de gérer n'importe quel ensemble de données.

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

Exemple de classe d'ensemble de données pour 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)

Je pense que le "DataLoader" de pytorch est environ 200 millions de fois plus sophistiqué que celui-ci, mais c'est ce que j'ai trouvé. Veuillez me faire savoir si vous avez un meilleur design.

Comment utiliser

Installation

Prenez word2vec comme exemple

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

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

Exécution de l'apprentissage

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

Comment utiliser le modèle

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

point important

Lors de l'entraînement avec un grand ensemble de données tel que Wikipedia, il peut consommer de la mémoire et tomber. enquête en cours.

en conclusion

C'est amusant de penser à l'API de la bibliothèque

Recommended Posts

J'ai fait un kit d'apprentissage pour word2vec / doc2vec / GloVe / fastText
[Python] J'ai créé un classificateur pour les iris [Machine learning]
J'ai créé un site d'apprentissage C ++
J'ai créé un docset de tableau de bord pour Holoviews
J'ai fait une bibliothèque pour l'assurance actuarielle
[Mise à jour Ver1.3.1] J'ai créé une bibliothèque de prétraitement de données DataLiner pour l'apprentissage automatique
J'ai créé un fichier de dictionnaire python pour Neocomplete
J'ai fait un algorithme de rechange2 moins cher pour uWSGI
J'ai créé un outil utile pour Digital Ocean
J'ai créé un téléchargeur pour l'expression distribuée par mot
Nous avons créé un produit de prévention du télétravail.
J'ai installé le framework Deep Learning Chainer
Création de l'outil de gestion des utilisateurs Let's Chat
J'ai créé une fenêtre pour la sortie du journal avec Tkinter
J'ai créé un outil de nettoyage pour Google Container Registry
[VSCode] J'ai créé un extrait d'utilisateur pour Python print f-string
J'ai essayé d'utiliser Tensorboard, un outil de visualisation pour l'apprentissage automatique
J'ai créé un moniteur de ressources pour Raspberry Pi avec une feuille de calcul
J'ai essayé de faire un diagnostic de visage AI pour les golfeuses professionnelles ③
J'ai fait un texte Python
Fait une commande pour FizzBuzz
Création d'un outil qui facilite la définition des paramètres des modèles d'apprentissage automatique
J'ai fait un robot discord
J'ai créé Word2Vec avec Pytorch
Python> J'ai créé un code de test pour mon propre fichier externe
J'ai recherché une carte similaire de Hearthstone avec Deep Learning
Création d'un outil CLI client / serveur WebSocket (comme WebSocket version netcat)
J'ai créé beaucoup de fichiers pour la connexion RDP avec Python
J'ai créé un environnement de développement pour Django 3.0 avec Docker, Docker-compose, Poetry
J'ai essayé de créer un outil d'échafaudage pour le framework Web Python Bottle
J'ai créé une bibliothèque de wrapper Python pour l'API de reconnaissance d'images docomo.
J'ai touché PyAuto pendant un moment
J'ai fait un Line-bot avec Python!
J'ai créé un script de traduction basé sur CUI (2)
J'ai fait un wikipedia gacha bot
J'ai fait une loterie avec Python.
J'ai fait un kit de démarrage angulaire
J'ai créé un démon avec Python
J'ai créé un conteneur Docker pour utiliser JUMAN ++, KNP, python (pour pyKNP).
J'ai créé un classificateur de visage Dir en gray en utilisant TensorFlow --⑥ Programme d'apprentissage
J'ai créé un classificateur de visage Dir en gray en utilisant TensorFlow --⑧ Exécution d'apprentissage
J'ai fait GAN avec Keras, donc j'ai fait une vidéo du processus d'apprentissage.
J'ai créé un classificateur de visage Dir en gray en utilisant TensorFlow --⑦ Modèle d'apprentissage
J'ai fait un programme de gestion de la paie en Python!
J'ai touché "Orator" alors j'ai fait une note
J'ai fait un compteur de caractères avec Python
J'ai fait un interlocuteur comme Siri
J'ai fait un script pour afficher des pictogrammes
J'ai fait une carte hexadécimale avec Python
J'ai fait un jeu de vie avec Numpy
J'ai fait un générateur Hanko avec GAN
J'ai créé un outil d'estampage automatique du navigateur.
Après avoir étudié Python3, j'ai créé un Slackbot
J'ai fait un jeu rogue-like avec Python
Créer un environnement de développement pour l'apprentissage automatique
J'ai fait un simple blackjack avec Python
J'ai créé un fichier de configuration avec Python
J'ai fait une application WEB avec Django
Un manuel pour les débutants réalisé par des débutants Python
J'ai fait un simulateur de neurones avec Python