2
votes

Lire un grand fichier d'incorporation de mots fastext pré-entraîné en python

Je fais une analyse des sentiments et je souhaite utiliser des incorporations de texte rapide pré-entraînées, mais le fichier est très volumineux (6,7 Go) et la compilation du programme prend du temps.

fasttext_dir = '/Fasttext'
embeddings_index = {}
f = open(os.path.join(fasttext_dir, 'wiki.en.vec'), 'r', encoding='utf-8')
for line in tqdm(f):
    values = line.rstrip().rsplit(' ')
    word = values[0]
    coefs = np.asarray(values[1:], dtype='float32')
    embeddings_index[word] = coefs
f.close()

print('found %s word vectors' % len(embeddings_index))

embedding_dim = 300

embedding_matrix = np.zeros((max_words, embedding_dim))
for word, i in word_index.items():
    if i < max_words:
        embedding_vector = embeddings_index.get(word)
        if embedding_vector is not None:
            embedding_matrix[i] = embedding_vector

Est-ce qu'il y a comment accélérer le processus?


3 commentaires

combien de temps ce code s'exécute-t-il?


Prend environ 8 min. pour lire et traiter le fichier. Même après cela, l'ordinateur reste très lent pendant une longue période


C'est un moment normal pour le script python et cette tâche. Mais vous pouvez l'accélérer en utilisant une autre langue. Cela consomme probablement aussi beaucoup d'erreurs. Essayez de décaper et de supprimer (via del ) les données inutiles ( embeddings_index , lors de leur traitement, etc.)


3 Réponses :


5
votes

Vous pouvez à la place charger les incorporations pré-entraînées avec gensim. Au moins pour moi, c'était beaucoup plus rapide. Vous devez d'abord installer le gensim par pip, puis vous pouvez charger le modèle avec la ligne de code suivante:

from gensim.models import FastText

model = FastText.load_fasttext_format('cc.en.300.bin')

(je ne sais pas si vous avez besoin du fichier .bin pour cela, peut-être le Le fichier .vec fonctionne également.)

Pour obtenir l'incorporation d'un mot avec ce modèle, il suffit d'utiliser model[wordedral .


1 commentaires

Il a besoin du .bin. Je vais essayer ça maintenant



0
votes

Je vous recommande d'utiliser des modèles .bin, mais s'il n'existe pas et que vous n'avez que .vec ou .txt, essayez de paralléliser le processus en utilisant Joblib:

from joblib import Parallel, delayed
from tqdm import tqdm

if __name__ == '__main__':
    embeddings_index = {}

    f = open(os.path.join('D:/multi_lingual', 'wiki.en.align.vec'), 'r', encoding='utf-8')
    def loading(line):
        values = line.rstrip().rsplit(' ')
        word = values[0]
        coefs = np.asarray(values[1:], dtype='float32')
        return word, coefs

    embeddings_index = dict(Parallel(n_jobs=-1)(delayed(loading)(line) for line in tqdm(f)))
    f.close()
    print(len(embeddings_index))

en surveillant barre de progression tqdm, j'ai remarqué le niveau d'amélioration:

sans parallélisation: 10208.44it / s

avec parallélisation: 23155.08it / s

J'utilise 4 cœurs CPUz .. Les résultats ne sont pas totalement précis car j'utilisais le processeur sur d'autres trucs. Peut-être que vous pouvez remarquer de meilleures améliorations.

L'autre point est que je vous recommande après avoir lu les mots requis pour les enregistrer où vous pourrez les charger la prochaine fois au lieu de charger le fichier d'intégration entière à chaque fois.


0 commentaires

0
votes

Vous pouvez également le charger une fois, l'enregistrer sous forme de cornichon, puis charger le cornichon. Le chargement des fichiers pickle est le plus rapide en python.


0 commentaires