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 ~~
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.
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.
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.
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
python train_text_dataset.py -o $OUTPUT_PATH --dictionary-path=$DIC_PATH --corpus-path=$CORPUS_PATH --size=100 --window=8 --min-count=5
model_path = "model/word2vec.gensim.model"
model = Word2Vec.load(model_path)
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.
C'est amusant de penser à l'API de la bibliothèque