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 ~~
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.
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.
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.
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
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)
Wenn Sie mit einem großen Datensatz wie Wikipedia trainieren, kann dies das Gedächtnis verschlingen und fallen. Untersuchung läuft.
Es macht Spaß, über die API der Bibliothek nachzudenken
Recommended Posts