{
    "version": "https:\/\/jsonfeed.org\/version\/1",
    "title": "Блог Артёма Агасиева: заметки с тегом fastText",
    "_rss_description": "Telegram: @aagasiev",
    "_rss_language": "ru",
    "_itunes_email": "",
    "_itunes_categories_xml": "",
    "_itunes_image": "",
    "_itunes_explicit": "",
    "home_page_url": "https:\/\/agasiev.com\/tags\/fasttext\/",
    "feed_url": "https:\/\/agasiev.com\/tags\/fasttext\/json\/",
    "icon": "https:\/\/agasiev.com\/user\/userpic@2x.jpg?1529202066",
    "author": {
        "name": "Артём Агасиев",
        "url": "https:\/\/agasiev.com\/",
        "avatar": "https:\/\/agasiev.com\/user\/userpic@2x.jpg?1529202066"
    },
    "items": [
        {
            "id": "82",
            "url": "https:\/\/agasiev.com\/all\/opredelenie-yazyka-teksta-na-python\/",
            "title": "Определение языка текста на Python",
            "content_html": "<p>Для задач NLP бывает полезно предварительно определить язык текста с которым мы сейчас работаем.<\/p>\n<p>Например, это может пригодиться в случае, если:<\/p>\n<ol start=\"1\">\n<li>Какая-то наша модель умеет работать корректно только с определенным набором языков<\/li>\n<li>Для каждого языка у нас есть отдельная модель<\/li>\n<li>Текст на разных языках нужно по разному подготавливать: выбрать нужный стеммер или токенайзер — особенно важно для китайского и японского языков.<\/li>\n<\/ol>\n<p>В работе я использую для решения этой задачи три библиотеки: <a href=\"https:\/\/github.com\/facebookresearch\/fastText\/\">fastText<\/a> от Facebook, <a href=\"https:\/\/github.com\/google\/cld3\">Compact Language Detector v3<\/a> от Google и <a href=\"https:\/\/github.com\/Mimino666\/langdetect\">langdetect<\/a>. У каждой из них свои преимущества и недостатки связанные с размерами моделей, скоростью работы и точностью. Но, в целом, судя по опыту, точнее всего работает именно fastText.<\/p>\n<p>Для <a href=\"https:\/\/fasttext.cc\/docs\/en\/language-identification.html\">задачи определения языка<\/a> у fastText есть две готовые модели: <a href=\"https:\/\/dl.fbaipublicfiles.com\/fasttext\/supervised-models\/lid.176.bin\">побольше, на 126 мб<\/a> и <a href=\"https:\/\/dl.fbaipublicfiles.com\/fasttext\/supervised-models\/lid.176.ftz\">поменьше, на 917 кб<\/a>. Вторая будет менее точная, но обе поддерживают одинаковое количество языков — 176 штук.<\/p>\n<p>Качаем обе и посмотрим как с ними работать:<\/p>\n<pre class=\"e2-text-code\"><code class=\"shell\">\r\nwget https:\/\/dl.fbaipublicfiles.com\/fasttext\/supervised-models\/lid.176.bin\r\nwget https:\/\/dl.fbaipublicfiles.com\/fasttext\/supervised-models\/lid.176.ftz\r\n<\/code>\n<\/pre>\n<p>Загружаем обе модели:<\/p>\n<pre class=\"e2-text-code\"><code class=\"python3\">\r\nimport fastText\r\n\r\nmodel_big = fastText.load_model('.\/lid.176.bin')\r\nmodel_small = fastText.load_model('.\/lid.176.ftz')\r\n<\/code>\n<\/pre>\n<p>Пробуем в работе:<\/p>\n<pre class=\"e2-text-code\"><code class=\"python3\">\r\nprint(model.predict([\"hi\"]))\r\nprint(model_small.predict([\"hi\"]))\r\n<\/code>\n<\/pre>\n<p>И получаем довольно странный результат:<\/p>\n<pre class=\"e2-text-code\"><code class=\"python3\">\r\n([['__label__ca']], [array([0.5109927], dtype=float32)])\r\n([['__label__en']], [array([0.12450418], dtype=float32)])\r\n<\/code>\n<\/pre>\n<p>Почему так? Библиотека настроена на работу с предложениями, а не с отдельными словами, поэтому точность на очень коротких текстах будет хромать. Хотя, забавно, что маленькая модель сработала тут лучше, чем большая. Попробуем с текстом подлиннее:<\/p>\n<pre class=\"e2-text-code\"><code class=\"python3\">\r\nprint(model.predict([\"hi there, human\"]))\r\nprint(model_small.predict([\"hi there, human\"]))\r\n<\/code>\n<\/pre>\n<p>И получаем вполне приемлемый результат:<\/p>\n<pre class=\"e2-text-code\"><code class=\"python3\">\r\n([['__label__en']], [array([0.84252757], dtype=float32)])\r\n([['__label__en']], [array([0.83792776], dtype=float32)])\r\n<\/code>\n<\/pre>\n<p>Когда использовать какую модель из двух? Это зависит от желаемой точности и скорости работы. Если важнее точность, то можно использовать большую модель, а если скорость, то маленькую. Главное, если мы применяем определение языка в пайплайне обучения, например, классификатора спама, использовать, по возможности, ту же самую модель и в продакшне. А то итоговое качество может сильно хромать.<\/p>\n",
            "date_published": "2021-05-07T17:21:10+03:00",
            "date_modified": "2021-05-07T17:21:04+03:00",
            "_date_published_rfc2822": "Fri, 07 May 2021 17:21:10 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "82",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": []
            }
        },
        {
            "id": "53",
            "url": "https:\/\/agasiev.com\/all\/facebook-fasttext\/",
            "title": "fastText эмбеддинги",
            "content_html": "<p><a href=\"https:\/\/fasttext.cc\">fastText<\/a> — библиотека для векторного представления слов и классификации текстов от Facebook AI Research.<\/p>\n<p>Для её сборки, нам потребуется компилятор с поддержкой C++11 (gcc-4.6.3, clang-3.3 и новее):<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">git clone https:\/\/github.com\/facebookresearch\/fastText.git\r\ncd fastText\r\nsudo python3 -m pip install .<\/code><\/pre><p>Если у вас установлено несколько компиляторов разных версий, то можно запустить установку, явно указав путь к нужной версии компилятора:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">sudo CC='\/usr\/bin\/gcc-4.9' python3 -m pip install .<\/code><\/pre><h2>Используем уже натренированную модель<\/h2>\n<p>Тренированную модель для русского языка можно скачать <a href=\"https:\/\/github.com\/facebookresearch\/fastText\/blob\/master\/docs\/crawl-vectors.md\">тут<\/a>. В архиве занимает 4.2 Гб, распакованная 6.8 Гб:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">wget https:\/\/dl.fbaipublicfiles.com\/fasttext\/vectors-crawl\/cc.ru.300.bin.gz\r\ngunzip cc.ru.300.bin.gz<\/code><\/pre><p>Использовать можно так:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">from fasttext import load_model\r\n\r\nmodel = load_model(&quot;cc.ru.300.bin&quot;)<\/code><\/pre><h2>Тренируем свою модель<\/h2>\n<pre class=\"e2-text-code\"><code class=\"\">from fasttext import train_unsupervised\r\n\r\nmodel = train_unsupervised(\r\n    input=&quot;dataset.txt&quot;, \r\n    model='skipgram'\r\n)\r\n\r\nmodel.save_model(&quot;skipgram_model.bin&quot;)<\/code><\/pre><p>На Core i7-6700 с датасетом в 20 млн строк, модель обучилась в течении 5 эпох за 35 минут и весила ~1.1 Гб.<\/p>\n<h2>Используем<\/h2>\n<p>Для оценки похожести\/близости векторов будем использовать <a href=\"https:\/\/ru.wikipedia.org\/wiki\/Векторная_модель\">косинусное сходство<\/a>:<\/p>\n<p>\r\n$$ \\mathrm{similarity} = \\mathrm{cos(}\\theta\\mathrm{)} = \\dfrac{A \\cdot B}{\\left\\lVert A \\right\\rVert \\cdot \\left\\lVert B \\right\\rVert}  $$\r\n<\/p>\n<p>В коде будет выглядеть так:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">import numpy as np\r\n\r\ndef similarity(v1, v2):\r\n    n1 = np.linalg.norm(v1)\r\n    n2 = np.linalg.norm(v2)\r\n\r\n    if n1 &lt; 1e-6 or n2 &lt; 1e-6:\r\n        return 0.0\r\n    else:\r\n        return np.dot(v1, v2) \/ n1 \/ n2\r\n\r\ndef word_similarity(model, w1, w2):\r\n    return similarity(model.get_word_vector(w1), model.get_word_vector(w2))\r\n\r\ndef sentence_similarity(model, t1, t2):\r\n    return similarity(model.get_sentence_vector(t1), model.get_sentence_vector(t2))<\/code><\/pre><p>Проверяем:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">&gt;&gt;&gt; word_similarity(model, &quot;приветик&quot;, &quot;привет&quot;)\r\n0.7990662\r\n\r\n&gt;&gt;&gt; sentence_similarity(model, &quot;сколько тебе лет&quot;, &quot;а лет-то тебе сколько&quot;)\r\n0.85209394<\/code><\/pre><p>Про классификацию текста при помощи fastText напишу чуть позже.<\/p>\n",
            "date_published": "2019-09-23T14:56:38+03:00",
            "date_modified": "2019-09-23T14:56:08+03:00",
            "_date_published_rfc2822": "Mon, 23 Sep 2019 14:56:38 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "53",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": []
            }
        }
    ],
    "_e2_version": 3576,
    "_e2_ua_string": "E2 (v3576; Aegea)"
}