Блог Артёма Агасиева

Про всякое.

fastText эмбеддинги

fastText – библиотека для векторного представления слов и классификации текстов от Facebook AI Research.

Для её сборки, нам потребуется компилятор с поддержкой C++11 (gcc-4.6.3, clang-3.3 и новее):

git clone https://github.com/facebookresearch/fastText.git
cd fastText
sudo python3 -m pip install .

Если у вас установлено несколько компиляторов разных версий, то можно запустить установку, явно указав путь к нужной версии компилятора:

sudo CC='/usr/bin/gcc-4.9' python3 -m pip install .

Используем уже натренированную модель

Тренированную модель для русского языка можно скачать тут. В архиве занимает 4.2 Гб, распакованная 6.8 Гб:

wget https://dl.fbaipublicfiles.com/fasttext/vectors-crawl/cc.ru.300.bin.gz
gunzip cc.ru.300.bin.gz

Использовать можно так:

from fasttext import load_model

model = load_model("cc.ru.300.bin")

Тренируем свою модель

from fasttext import train_unsupervised

model = train_unsupervised(
    input="dataset.txt", 
    model='skipgram'
)

model.save_model("skipgram_model.bin")

На Core i7-6700 с датасетом в 20 млн строк, модель обучилась в течении 5 эпох за 35 минут и весила ~1.1 Гб.

Используем

Для оценки похожести/близости векторов будем использовать косинусное сходство:

$$ \mathrm{similarity} = \mathrm{cos(}\theta\mathrm{)} = \dfrac{A \cdot B}{\left\lVert A \right\rVert \cdot \left\lVert B \right\rVert} $$

В коде будет выглядеть так:

import numpy as np

def similarity(v1, v2):
    n1 = np.linalg.norm(v1)
    n2 = np.linalg.norm(v2)

    if n1 < 1e-6 or n2 < 1e-6:
        return 0.0
    else:
        return np.dot(v1, v2) / n1 / n2

def word_similarity(model, w1, w2):
    return similarity(model.get_word_vector(w1), model.get_word_vector(w2))

def sentence_similarity(model, t1, t2):
    return similarity(model.get_sentence_vector(t1), model.get_sentence_vector(t2))

Проверяем:

>>> word_similarity(model, "приветик", "привет")
0.7990662

>>> sentence_similarity(model, "сколько тебе лет", "а лет-то тебе сколько")
0.85209394

Про классификацию текста при помощи fastText напишу чуть позже.

Экспресс пиар

Экспресс-дизайн от студии Артемия Лебедева – просто охуенная штука. Всего за 100000 рублей можно хорошо попиариться на всю страну развеселым логотипом, получить гору трафика на сайт и повысить узнаваемость бренда.

Убиваем сразу три зайца одним выстрелом:

  1. Студия экспериментирует, ищет новые подходы в дизайне за деньги заказчика и не сильно беспокоится о его мнении насчет получившегося результата.
  2. Название студии все время на слуху.
  3. Заказчик получает бурление говн в соцсеточках, с упоминанием названия компании и ссылками на его сайт. А значит будет трафик и рост ссылочной массы, что неплохо повлияет на поисковую выдачу в будущем.

А на сам логотип, в целом, всем плевать.

Aug 10   PR   Дизайн   Лайфхак

Мы вам обязательно перезвоним

На моем сайте есть форма обратной связи, через которую клиенты могут оставить свой телефон. Однако, возникает интересная ситуация – в половине случаев при звонке на указанный номер трубку никто не берет. Мало того, иногда даже сбрасывают звонок. Согласен, все мы бываем заняты. Перезваниваю через какое-то время – эффект тот же.

Стал думать: что тут может быть не так? Идей особо не было, так что вначале воспринял это как специфику рынка. Но потом как-то в облачной АТС закончились деньги, и я решил набрать такой сбрасывающий номер с сотового телефона. И... о чудо! Трубку подняли, разговор успешно состоялся.

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

  1. Сотовый номер с кодом региона абонента
  2. Сотовый номер из любого другого региона
  3. 8-800, 495, 812, 499

Если клиент сам решает позвонить вам, то ситуация меняется: люди любят “официальные” городские номера, в особенности, бесплатный для них 8-800. Так распределились номера в порядке убывания вероятности звонка:

  1. 8-800
  2. 495, 812, 499
  3. Сотовый номер с кодом региона абонента
  4. Сотовый номер из любого другого региона

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

Таким образом, для обратной связи лучше оставлять номер с кодом 8-800 или 495/812, а самому звонить с сотового телефона.

Квадратичные формы и турецкие лиры

Купюра в 10 турецких лир, пожалуй, единственная из всех известных мне, на которых изображен математик и математическая формула.

На денежке, портрет довольно известного турецкого математика Джахита Арфа и одно из его творений – инвариант Арфа квадратичной формы.

$$ Arf (q) = \sum_{i = 1}^{n} q(a_i)q(b_i) \in \Bbb{Z_2}, $$

Биткоин и охранники

В начале 2018 года, в самый разгар криптоистерии, гулял я по дворцу Топкапы в Стамбуле. Проходил мимо группы охранников, которые о чем-то оживленно спорили. Из всего потока незнакомой мне турецкой речи, краем уха выцепил до боли знакомые слова биткоин и эфир, которые звучали чуть ли не чаще слов на языке аборигенов.

И тут мне вспомнилась байка про американского банкира Джона П. Моргана, который 1929 году успел продать практически все свои акции, за несколько дней до начала великой депрессии. Конгрессу, заподозрившему его в инсайдерской торговле и манипуляции рынком, он объяснил свое решение о продаже тем, что чистильщик обуви спросил у него, какие перспективы у акций железнодорожных компаний, которые он купил себе недавно. Вот он и решил, что когда на рынок пришел даже чистильщик обуви, профессионалам на нем больше делать нечего.

Подумав немного, я решил, что если криптоистерика докатилась даже до охранников в Топкапи, то однозначно пора все продавать. Что и сделал в тот же день, когда вернулся в гостиницу, выставив заявку на продажу всей крипты которая у меня была в wex’е. В общем, слил все битки по курсу около $17000 и как показала практика, сделал это в очень правильный момент.

Earlier Ctrl + ↓