Извлечение функций из текста стало простой задачей со всеми доступными инструментами, Scikit, Keras, NLTK, scapy, metapy и многие другие могут очень хорошо справиться с этим вопросом, но когда вам приходится иметь дело с огромным количеством текста, что происходит ? Это может занять часы, дни, а иногда, даже после нескольких часов ожидания, у вас заканчивается память или машина зависает.

В общем, то, что эти библиотеки пытаются выполнить, - это обрабатывать все данные одновременно, создавая очень многомерные данные одновременно, что для небольших наборов данных отлично работает, но для реальных данных вы столкнетесь с обработкой и проблемы с памятью, если вы не используете решение для обработки данных партиями и / или несколькими кластерами.

Таким образом, Wordbatch был создан для решения этой проблемы обработки больших объемов данных.

Wordbatch, как следует из названия, работает с большими мини-пакетами текстовых данных. По мере обработки каждого пакета он будет внутренне хранить сгенерированную для него статистику и применять ее к задаче, которую он настроен выполнять, например, к онлайн-взвешиванию IDF.

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

В настоящее время Wordbatch имеет четыре экстрактора функций: WordHash, WordBag, WordVec, WordSeq.

Экстракторы

WordHash

Оболочка вокруг Scikit-Learn HashVectorizer, экстрактор преобразует коллекцию текстовых документов в матрицу вхождений токенов.

Используя его из реализации Wordbatch, вы сможете распараллелить извлечение, значительно увеличив время обработки большого количества наблюдений.

Проведем несколько тестов:

Все тесты будут выполняться как в Scikit, так и в WordBatch для одинакового количества наблюдений и тех же параметров, но WordBatch будет в многопроцессорном режиме с 8 процессорами.

vectorizer = sklearn.feature_extraction.text.HashingVectorizer(preprocessor=normalize_text, decode_error='ignore', n_features=2 ** 23, non_negative=False, ngram_range=(1, 2), norm='l2')
wb = wordbatch.WordBatch(normalize_text, extractor=(WordHash, {"decode_error": 'ignore', "n_features": 2 ** 23, "non_negative": False, "ngram_range": (1, 2), "norm": 'l2'}), procs=8)

* время обработки измеряется в секундах

Тенденция очевидна, поскольку вы увеличиваете количество наблюдений, WordBatch начинает быстрее сходиться и сокращать общее время обработки более чем на 35%.

Если у вас есть большой набор данных для Hash Vectorizer, WordBatch, безусловно, будет быстрее, чем Scikit-Learn.

Эти измерения были выполнены с использованием одной локальной машины с 8 ядрами. Если у вас есть действительно большие данные, вы можете использовать Spark, просто передав сеанс Spark в метод, это может дать на 1000% больше прироста обработки, в зависимости от количества кластеров, используемых Spark.

WordBag

Согласно конструктору метода WordBag похож на WordHash, но с новыми возможностями, которых не было в Scikit до этого момента (поскольку WordHash построен на нем).

В WordBag добавлены следующие новые возможности:

  • IDF (в Scikit есть TfidfVectorizer)
  • Оконное и взвешенное по расстоянию полиномиальное взаимодействие
  • Взвешивание хешированных функций на n-граммовый порядок
  • Дополнительные преобразования для подсчета

WordBag принимает следующие параметры:

  • «Norm», значение по умолчанию - l2
    Это тип нормализации, который вы хотите выполнить, значения: l0, l1 или l2
  • «Tf», значение по умолчанию - «журнал».
    Это частота термина, которая может быть журнальной или двоичной.
  • Двоичное преобразование выполняет метод numpy Sign в данных: https://docs.scipy.org/doc/numpy/reference/generated/numpy.sign.html
  • «Idf», значение по умолчанию - 0,0
    Обратная частота документа для работы с общими весами слов.
  • Он рассчитывается для каждого слова следующим образом:
    Сначала вычислите нормализованный idf: norm_idf = 0 / log (max (0, idf_parameter + doc_count))
    Затем используйте нормализованный idf для вычисления idf idf = log (макс (0, idf_parameter + doc_count / df)) * norm_idf
  • «Hash_ngrams», значение по умолчанию - 0
  • «Hash_ngrams_weights», значение по умолчанию - Нет.
  • «Hash_size», значение по умолчанию - 10000000
    Количество объектов, которые будут сгенерированы.
  • «Hash_polys_window», значение по умолчанию - 0
  • «Hash_polys_mindf», значение по умолчанию 5
  • «Hash_polys_maxdf», значение по умолчанию 0,5.
  • «Hash_polys_weight», значение по умолчанию - 0,1.
  • «Seed», значение по умолчанию - 0

Вот пример реализации WordBag:

wb = wordbatch.WordBatch(normalize_text
                        , extractor=(WordBag, {"hash_ngrams": 2,
                                               "hash_ngrams_weights": [0.5, -1.0],
                                               "hash_size": 2 ** 23,
                                               "norm": 'l2',
                                               "tf": 'log',
                                               "idf": 50.0}
                                     )
                        , procs=8)

* normalize_text - это настраиваемая функция для нормализации

WordSeq

Этот метод предоставляет последовательности слов и целых чисел, которые постоянно используются для моделей долгосрочной краткосрочной памяти в качестве входных данных, например:

Мы определяем максимальную длину и максимальное количество слов, которые будут использоваться, и передаем их в WordSeq:

maxlen = 200
max_words = 20000
wb= wordbatch.WordBatch(normalize_text, max_words=max_words, extractor=(WordSeq, {"seq_maxlen": maxlen}))

И использовать его, чтобы преобразовать наш ввод, чтобы он был предсказуем.

self.model.predict(np.array(self.wb.transform(texts)))

WordVec

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

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

Способ использования этого метода следующий:

wb = wordbatch.WordBatch(normalize_text,
                        extractor=(Hstack,[
                            (WordVec,{"wordvec_file": "../../../data/word2vec/glove.twitter.27B.100d.txt.gz",
                                      "normalize_text": normalize_text, "encoding": "utf8"}),
                            (WordVec, {"wordvec_file": "../../../data/word2vec/glove.6B.50d.txt.gz",
                                       "normalize_text": normalize_text, "encoding": "utf8"})]))

Затем вы используете функцию transform () для преобразования текста и отправки его в обучаемый / прогнозируемый

texts= self.wb.fit_transform(texts, reset= False)

Список экстракторов может быть определен. Например, последовательности векторных слов могут быть спроецированы в векторы для каждого документа и объединены с векторами из других внедрений векторных слов. [1]

Модели

WordBatch не только предоставляет средства извлечения и преобразования функций, он поставляется с четырьмя базовыми моделями онлайн-обучения для регрессии и классификации по одной метке.

Все четыре модели созданы для работы в многопроцессорных архитектурах с регуляризацией L1 и L2.

FTRL (следуйте за регулярным лидером)

Линейная модель Proximal-FTRL - одна из наиболее часто используемых моделей конкуренции Kaggle, созданная Google (http://www.eecs.tufts.edu/~dsculley/papers/ad-click-prediction.pdf), это реализован в оптимизированном для Cython языке и является одной из самых быстрых доступных версий модели FTRL.

Как и в документе, вы перебираете данные и для каждого экземпляра:

  1. Создайте вектор признаков
  2. Вычислить прогноз, используя текущий вектор веса
  3. Обновите модель

Вот пример того, как использовать его с WordBatch:

clf= FTRL(alpha=1.0, beta=1.0, L1=0.00001, L2=1.0, D=2 ** 23, iters=1, inv_link="identity")

Модель использует следующие параметры и значения по умолчанию:

  • альфа = 0,1,
  • бета = 1.0,
  • L1=1.0,
  • L2=1.0,
  • D=2**25,
  • init = 0.0,
  • iters = 10,
  • e_clip = 1.0,
  • потоки = 0,
  • inv_link = «сигмовидная»,
  • bbias_term = 1,
  • семя = 0,
  • подробный = 1

FM_FTRL (Машины факторизации)

Машина хешированной факторизации с Follow The Regularized Leader и факторные эффекты, оцененные с помощью адаптивного SGD.

clf = FM_FTRL(D=2 ** 25, D_fm= 4, iters=1, inv_link="identity", threads= multiprocessing.cpu_count()//2)

Модель использует следующие параметры и значения по умолчанию:

  • альфа = 0,02,
  • бета = 0,01, # ~ альфа / 2
  • L1=0.0001,
  • L2=0.1,
  • D=2**25,
  • alpha_fm = 0,03,
  • L2_fm= 0.005,
  • init_fm = 0,01,
  • D_fm=20,
  • weight_fm = 10.0,
  • e_noise = 0,0001,
  • e_clip = 1.0,
  • iters = 5,
  • inv_link = «личность»,
  • bbias_term = 1,
  • потоки = 0,
  • use_avx = 1,
  • семя = 0,
  • подробный = 1

NN_Relu_H1

Нейронная сеть с 1 скрытым слоем и активациями выпрямленного линейного модуля, оцененная с помощью адаптивного SGD.

Прогнозирование и оценка многопоточны по скрытому слою.

Модель использует следующие параметры и значения по умолчанию:

  • двойная альфа = 0,1,
  • двойной L2 = 0,001,
  • интервал D = 2 ** 25,
  • int D_nn = 30,
  • двойной init_nn = 0,01,
  • двойной e_noise = 0,0001,
  • двойной e_clip = 1.0,
  • беззнаковые целые числа = 4,
  • inv_link = «личность»,
  • int thread = 0,
  • int seed = 0,
  • int verbose = 1

NN_Relu_H2

Нейронная сеть с 2 скрытыми слоями и активациями выпрямленного линейного модуля, оцененная с помощью адаптивного SGD.

Прогнозирование выполняется в многопоточном режиме по 2-му скрытому слою, оценка - по выходам 1-го скрытого слоя.

Модель использует следующие параметры и значения по умолчанию:

  • двойная альфа = 0,1,
  • двойной L2 = 0,00001,
  • интервал D = 2 ** 25,
  • int D_nn = 12,
  • int D_nn2 = 4,
  • двойной init_nn = 0,01,
  • двойной e_noise = 0,001,
  • двойной e_clip = 1.0,
  • беззнаковое целое число = 3,
  • inv_link = «личность»,
  • int thread = 0,
  • int seed = 0,
  • int verbose = 1

Адаптивный оптимизатор SGD работает как Adagrad во всех моделях, которые его используют, но объединяет адаптивные скорости обучения между скрытыми узлами, используя ту же функцию. Это делает обучение более надежным и требует меньше памяти. [1]

Чтобы завершить этот технический обзор, мы рассмотрели все экстракторы и модели, присутствующие в текущей версии WordBatch.

В настоящее время пакетная обработка стала обязательной для любого масштабируемого решения.

Наборы данных будут становиться все больше и больше, поэтому потребность в библиотеках с несколькими процессорами станет более очевидной, чем когда-либо.

ССЫЛКИ

[1] Wordbatch https://github.com/anttttti/Wordbatch