<?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>Блог Артёма Агасиева: заметки с тегом fastText</title>
<link>https://agasiev.com/tags/fasttext/</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>Определение языка текста на Python</title>
<guid isPermaLink="false">82</guid>
<link>https://agasiev.com/all/opredelenie-yazyka-teksta-na-python/</link>
<pubDate>Fri, 07 May 2021 17:21:10 +0300</pubDate>
<author>Артём Агасиев</author>
<comments>https://agasiev.com/all/opredelenie-yazyka-teksta-na-python/</comments>
<description>
&lt;p&gt;Для задач NLP бывает полезно предварительно определить язык текста с которым мы сейчас работаем.&lt;/p&gt;
&lt;p&gt;Например, это может пригодиться в случае, если:&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;Какая-то наша модель умеет работать корректно только с определенным набором языков&lt;/li&gt;
&lt;li&gt;Для каждого языка у нас есть отдельная модель&lt;/li&gt;
&lt;li&gt;Текст на разных языках нужно по разному подготавливать: выбрать нужный стеммер или токенайзер — особенно важно для китайского и японского языков.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;В работе я использую для решения этой задачи три библиотеки: &lt;a href="https://github.com/facebookresearch/fastText/"&gt;fastText&lt;/a&gt; от Facebook, &lt;a href="https://github.com/google/cld3"&gt;Compact Language Detector v3&lt;/a&gt; от Google и &lt;a href="https://github.com/Mimino666/langdetect"&gt;langdetect&lt;/a&gt;. У каждой из них свои преимущества и недостатки связанные с размерами моделей, скоростью работы и точностью. Но, в целом, судя по опыту, точнее всего работает именно fastText.&lt;/p&gt;
&lt;p&gt;Для &lt;a href="https://fasttext.cc/docs/en/language-identification.html"&gt;задачи определения языка&lt;/a&gt; у fastText есть две готовые модели: &lt;a href="https://dl.fbaipublicfiles.com/fasttext/supervised-models/lid.176.bin"&gt;побольше, на 126 мб&lt;/a&gt; и &lt;a href="https://dl.fbaipublicfiles.com/fasttext/supervised-models/lid.176.ftz"&gt;поменьше, на 917 кб&lt;/a&gt;. Вторая будет менее точная, но обе поддерживают одинаковое количество языков — 176 штук.&lt;/p&gt;
&lt;p&gt;Качаем обе и посмотрим как с ними работать:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class="shell"&gt;
wget https://dl.fbaipublicfiles.com/fasttext/supervised-models/lid.176.bin
wget https://dl.fbaipublicfiles.com/fasttext/supervised-models/lid.176.ftz
&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;Загружаем обе модели:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class="python3"&gt;
import fastText

model_big = fastText.load_model('./lid.176.bin')
model_small = fastText.load_model('./lid.176.ftz')
&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;Пробуем в работе:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class="python3"&gt;
print(model.predict(["hi"]))
print(model_small.predict(["hi"]))
&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;И получаем довольно странный результат:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class="python3"&gt;
([['__label__ca']], [array([0.5109927], dtype=float32)])
([['__label__en']], [array([0.12450418], dtype=float32)])
&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;Почему так? Библиотека настроена на работу с предложениями, а не с отдельными словами, поэтому точность на очень коротких текстах будет хромать. Хотя, забавно, что маленькая модель сработала тут лучше, чем большая. Попробуем с текстом подлиннее:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class="python3"&gt;
print(model.predict(["hi there, human"]))
print(model_small.predict(["hi there, human"]))
&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;И получаем вполне приемлемый результат:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class="python3"&gt;
([['__label__en']], [array([0.84252757], dtype=float32)])
([['__label__en']], [array([0.83792776], dtype=float32)])
&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;Когда использовать какую модель из двух? Это зависит от желаемой точности и скорости работы. Если важнее точность, то можно использовать большую модель, а если скорость, то маленькую. Главное, если мы применяем определение языка в пайплайне обучения, например, классификатора спама, использовать, по возможности, ту же самую модель и в продакшне. А то итоговое качество может сильно хромать.&lt;/p&gt;
</description>
</item>

<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>