Извлечение функций из текста стало простой задачей со всеми доступными инструментами, 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.
Как и в документе, вы перебираете данные и для каждого экземпляра:
- Создайте вектор признаков
- Вычислить прогноз, используя текущий вектор веса
- Обновите модель
Вот пример того, как использовать его с 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