Повышение производительности токенизации текста большого документа с помощью Python + RegEx - PullRequest
1 голос
/ 07 апреля 2020

В настоящее время я пытаюсь обработать большое количество очень больших (> 10 тыс. Слов) текстовых файлов. В моем конвейере данных я определил функцию токенизации gensim как мое узкое место, соответствующая часть предоставлена ​​в моем MWE ниже:

import re
import urllib.request

url='https://raw.githubusercontent.com/teropa/nlp/master/resources/corpora/genesis/english-web.txt'
doc=urllib.request.urlopen(url).read().decode('utf-8')

PAT_ALPHABETIC = re.compile('(((?![\d])\w)+)', re.UNICODE)

def tokenize(text):
    text.strip()
    for match in PAT_ALPHABETIC.finditer(text):
        yield match.group()

def preprocessing(doc):
    tokens = [token for token in tokenize(doc)]
    return tokens

foo=preprocessing(doc)

Вызов функции preprocessing для данного примера занимает примерно 66ms и Я хотел бы улучшить этот номер. Есть ли что-то, что я все еще могу оптимизировать в своем коде? Или проблема с моим оборудованием (ноутбук потребителя середины 2010-х)? Мне было бы интересно также узнать о времени выполнения у людей с более новым оборудованием.

Заранее спасибо

1 Ответ

0 голосов
/ 07 апреля 2020

Вы можете использовать

PAT_ALPHABETIC = re.compile(r'[^\W\d]+')

def tokenize(text):
    for match in PAT_ALPHABETIC.finditer(text):
        yield match.group()

Примечание:

  • \w соответствует буквам, цифрам, символам подчеркивания, некоторым другим пунктуациям и диакритическим знакам соединителя в Python 3.x по умолчанию вам не нужно использовать re.UNICODE или re.U options
  • Чтобы "исключить" (или "вычесть") di git, совпадающее с \w, ((?!\d)\w)+ выглядит излишним, все, что вам нужно сделать, это «преобразовать» \w в эквивалентный класс отрицанных символов [^\W] и добавить туда \d: [^\W\d]+.
  • Обратите внимание на посторонние text.strip(): Строки Python являются неизменяемыми, если вы не присваиваете значение переменной, в text.strip() нет смысла. Поскольку пробелы во входной строке не мешают регулярному выражению, [^\W\d]+, вы можете просто удалить этот text.strip() из своего кода.
...