<?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>Блог Артёма Агасиева: заметки с тегом NLP</title>
<link>https://agasiev.com/tags/nlp/</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>


</channel>
</rss>