{
    "version": "https:\/\/jsonfeed.org\/version\/1",
    "title": "Блог Артёма Агасиева: заметки с тегом NLP",
    "_rss_description": "Telegram: @aagasiev",
    "_rss_language": "ru",
    "_itunes_email": "",
    "_itunes_categories_xml": "",
    "_itunes_image": "",
    "_itunes_explicit": "",
    "home_page_url": "https:\/\/agasiev.com\/tags\/nlp\/",
    "feed_url": "https:\/\/agasiev.com\/tags\/nlp\/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": []
            }
        }
    ],
    "_e2_version": 3576,
    "_e2_ua_string": "E2 (v3576; Aegea)"
}