Чтение большого предварительно обученного файла встраивания текста в python - PullRequest
0 голосов
/ 19 января 2019

Я занимаюсь анализом настроений и хочу использовать предварительно обученные встраивания fasttext, однако файл очень большой (6,7 ГБ), и программа компилируется очень долго.

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

Есть ли способ ускорить процесс?

Ответы [ 2 ]

0 голосов
/ 26 апреля 2019

Я рекомендую вам использовать модели .bin, но если он не существует и у вас есть только .vec или .txt, попробуйте распараллелить процесс, используя 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))

, отслеживая прогресс tqdmБар, я заметил количество улучшений:

без распараллеливания: 10208.44it / s

с распараллеливанием: 23155.08it / s

Яиспользуя 4 ядра CPUz .. Результаты не совсем точны, потому что я использовал процессор для других вещей.Может быть, вы можете заметить лучшие улучшения.

Другой момент, я рекомендую вам после прочтения необходимых слов сохранить их, чтобы вы могли загрузить их в следующий раз вместо загрузки всего файла вложений каждый раз.

0 голосов
/ 19 января 2019

Вместо этого вы можете загрузить предварительно обученные вложения с помощью gensim. По крайней мере, для меня это было намного быстрее. Сначала вам нужно установить gensim в pip, а затем вы можете загрузить модель со следующей строкой кода:

from gensim.models import FastText

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

(Я не уверен, нужен ли вам для этого файл .bin, возможно, файл .vec также работает.)

Чтобы получить вложение слова с этой моделью, просто используйте model[word].

...