Определение языка текста на Python
Для задач NLP бывает полезно предварительно определить язык текста с которым мы сейчас работаем.
Например, это может пригодиться в случае, если:
- Какая-то наша модель умеет работать корректно только с определенным набором языков
- Для каждого языка у нас есть отдельная модель
- Текст на разных языках нужно по разному подготавливать: выбрать нужный стеммер или токенайзер — особенно важно для китайского и японского языков.
В работе я использую для решения этой задачи три библиотеки: fastText от Facebook, Compact Language Detector v3 от Google и langdetect. У каждой из них свои преимущества и недостатки связанные с размерами моделей, скоростью работы и точностью. Но, в целом, судя по опыту, точнее всего работает именно fastText.
Для задачи определения языка у fastText есть две готовые модели: побольше, на 126 мб и поменьше, на 917 кб. Вторая будет менее точная, но обе поддерживают одинаковое количество языков — 176 штук.
Качаем обе и посмотрим как с ними работать:
wget https://dl.fbaipublicfiles.com/fasttext/supervised-models/lid.176.bin
wget https://dl.fbaipublicfiles.com/fasttext/supervised-models/lid.176.ftz
Загружаем обе модели:
import fastText
model_big = fastText.load_model('./lid.176.bin')
model_small = fastText.load_model('./lid.176.ftz')
Пробуем в работе:
print(model.predict(["hi"]))
print(model_small.predict(["hi"]))
И получаем довольно странный результат:
([['__label__ca']], [array([0.5109927], dtype=float32)])
([['__label__en']], [array([0.12450418], dtype=float32)])
Почему так? Библиотека настроена на работу с предложениями, а не с отдельными словами, поэтому точность на очень коротких текстах будет хромать. Хотя, забавно, что маленькая модель сработала тут лучше, чем большая. Попробуем с текстом подлиннее:
print(model.predict(["hi there, human"]))
print(model_small.predict(["hi there, human"]))
И получаем вполне приемлемый результат:
([['__label__en']], [array([0.84252757], dtype=float32)])
([['__label__en']], [array([0.83792776], dtype=float32)])
Когда использовать какую модель из двух? Это зависит от желаемой точности и скорости работы. Если важнее точность, то можно использовать большую модель, а если скорость, то маленькую. Главное, если мы применяем определение языка в пайплайне обучения, например, классификатора спама, использовать, по возможности, ту же самую модель и в продакшне. А то итоговое качество может сильно хромать.