Ускорьте токенизатор SpaCy - PullRequest
0 голосов
/ 09 апреля 2019

Я использую SpaCy для десятков тысяч документов. В среднем на документ уходит около 5 секунд. Любые предложения о том, как ускорить токенизатор?

Некоторая дополнительная информация:

  • Входные файлы - это текстовые файлы с символами новой строки
  • Средний размер файла - около 400 КБ
  • Токены каждого входного файла записываются в новую строку в выходном файле (хотя я могу изменить это, если это поможет увеличить скорость)
  • Есть 1655 стоп-слов
  • Выходной файл передается в быстрый текст

Вот мой код:

from pathlib import Path, PurePath
from time import time

st = time()
nlp = en_core_web_sm.load(disable = ['ner', 'tagger', 'parser', 'textcat'])
p = Path('input_text/').glob('*.txt')
files = ['input_text/' + x.name for x in p if x.is_file()]

#nlp = spacy.load('en-core-web-sm')

stopwords_file = 'stopwords.txt'

def getStopWords():
    f = open(stopwords_file, 'r')
    stopWordsSet = f.read()
    return stopWordsSet

stopWordsSet = getStopWords()
out_file = 'token_results.txt'
for file in files:
    #print (out_file)
    with open(file, encoding="utf8") as f:
        st_doc = time()
        for line in f:

            doc = nlp(line)

            for token in doc:
                if (not token.text.lower() in stopWordsSet
                    and not token.is_punct and not token.is_space and not token.like_num
                    and len(token.shape_)>1):                    

                    tup = (token.text, '|', token.lemma_)

                    appendFile = open(out_file, 'a', encoding="utf-8")
                    appendFile.write(" " + tup[0])
        print((time() -st_doc), 'seconds elasped for', file)
        appendFile.write('\n')
        appendFile.close()
print((time()-st)/60, 'minutes elasped')

1 Ответ

1 голос
/ 11 апреля 2019
  1. Основная проблема: откройте выходной файл один раз и оставьте его открытым до конца вашего скрипта. Повторное закрытие, повторное открытие и поиск в конце все большего текстового файла будет очень медленным.

  2. Прочитайте стоп-слова в фактический set(). В противном случае вы будете искать каждый токен в длинной строке, содержащей весь файл, который случайно соответствует частичным словам и намного медленнее, чем проверка на членство в наборе.

  3. Используйте nlp.pipe () или для токенизации просто nlp.tokenizer.pipe (), чтобы немного ускорить пространственную часть. С кучей коротких документов с одним предложением это, кажется, не имеет большого значения. Намного быстрее создать один большой документ, чем рассматривать каждую строку как отдельный документ, но то, хотите ли вы сделать это, зависит от того, как структурированы ваши данные. Если вы просто токенизируете, вы можете увеличить максимальный размер документа (nlp.max_length), если вам нужно.

texts = f.readlines()
docs = nlp.tokenizer.pipe(texts)

for doc in docs:
    for token in doc:
        ...
...