<?xml version="1.0" encoding="utf-8"?> 
<rss version="2.0"
  xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
  xmlns:atom="http://www.w3.org/2005/Atom">

<channel>

<title>Блог Артёма Агасиева: заметки с тегом Word embedding</title>
<link>https://agasiev.com/tags/word-embedding/</link>
<description>Telegram: @aagasiev</description>
<author>Артём Агасиев</author>
<language>ru</language>
<generator>E2 (v3576; Aegea)</generator>

<itunes:owner>
<itunes:name>Артём Агасиев</itunes:name>
<itunes:email></itunes:email>
</itunes:owner>
<itunes:subtitle>Telegram: @aagasiev</itunes:subtitle>
<itunes:image href="" />
<itunes:explicit></itunes:explicit>

<item>
<title>fastText эмбеддинги</title>
<guid isPermaLink="false">53</guid>
<link>https://agasiev.com/all/facebook-fasttext/</link>
<pubDate>Mon, 23 Sep 2019 14:56:38 +0300</pubDate>
<author>Артём Агасиев</author>
<comments>https://agasiev.com/all/facebook-fasttext/</comments>
<description>
&lt;p&gt;&lt;a href="https://fasttext.cc"&gt;fastText&lt;/a&gt; — библиотека для векторного представления слов и классификации текстов от Facebook AI Research.&lt;/p&gt;
&lt;p&gt;Для её сборки, нам потребуется компилятор с поддержкой C++11 (gcc-4.6.3, clang-3.3 и новее):&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;git clone https://github.com/facebookresearch/fastText.git
cd fastText
sudo python3 -m pip install .&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Если у вас установлено несколько компиляторов разных версий, то можно запустить установку, явно указав путь к нужной версии компилятора:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;sudo CC='/usr/bin/gcc-4.9' python3 -m pip install .&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;Используем уже натренированную модель&lt;/h2&gt;
&lt;p&gt;Тренированную модель для русского языка можно скачать &lt;a href="https://github.com/facebookresearch/fastText/blob/master/docs/crawl-vectors.md"&gt;тут&lt;/a&gt;. В архиве занимает 4.2 Гб, распакованная 6.8 Гб:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;wget https://dl.fbaipublicfiles.com/fasttext/vectors-crawl/cc.ru.300.bin.gz
gunzip cc.ru.300.bin.gz&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Использовать можно так:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;from fasttext import load_model

model = load_model(&amp;quot;cc.ru.300.bin&amp;quot;)&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;Тренируем свою модель&lt;/h2&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;from fasttext import train_unsupervised

model = train_unsupervised(
    input=&amp;quot;dataset.txt&amp;quot;, 
    model='skipgram'
)

model.save_model(&amp;quot;skipgram_model.bin&amp;quot;)&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;На Core i7-6700 с датасетом в 20 млн строк, модель обучилась в течении 5 эпох за 35 минут и весила ~1.1 Гб.&lt;/p&gt;
&lt;h2&gt;Используем&lt;/h2&gt;
&lt;p&gt;Для оценки похожести/близости векторов будем использовать &lt;a href="https://ru.wikipedia.org/wiki/Векторная_модель"&gt;косинусное сходство&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;
$$ \mathrm{similarity} = \mathrm{cos(}\theta\mathrm{)} = \dfrac{A \cdot B}{\left\lVert A \right\rVert \cdot \left\lVert B \right\rVert}  $$
&lt;/p&gt;
&lt;p&gt;В коде будет выглядеть так:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;import numpy as np

def similarity(v1, v2):
    n1 = np.linalg.norm(v1)
    n2 = np.linalg.norm(v2)

    if n1 &amp;lt; 1e-6 or n2 &amp;lt; 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))&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Проверяем:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;&amp;gt;&amp;gt;&amp;gt; word_similarity(model, &amp;quot;приветик&amp;quot;, &amp;quot;привет&amp;quot;)
0.7990662

&amp;gt;&amp;gt;&amp;gt; sentence_similarity(model, &amp;quot;сколько тебе лет&amp;quot;, &amp;quot;а лет-то тебе сколько&amp;quot;)
0.85209394&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Про классификацию текста при помощи fastText напишу чуть позже.&lt;/p&gt;
</description>
</item>


</channel>
</rss>