Обнаружение языка является хорошо развитой областью обработки естественного языка (NLP) в машинном обучении, поэтому в литературе и в Интернете доступно несколько алгоритмов и API. Тем не менее, запуск некоторых из этих алгоритмов на малом количестве памяти и быстродействующем процессоре может создать немало проблем, особенно для разработчиков, пытающихся создать свои собственные или модифицировать существующие коды. Мне удалось собрать очень простой, но эффективный алгоритм, который работает довольно хорошо и имеет очень высокую точность. Дойдите до конца, и вы получите детектор языка, настроенный и работающий менее чем за день, и, более того, он не требует больших вычислительных затрат.

АЛГОРИТМ

Здесь я дам краткий обзор алгоритма и углублюсь в код в следующем разделе. Алгоритм использует данные из Параллельного корпуса материалов Европейского парламента за 1996–2011 годы на веб-странице Philipp Koehn. ZIP-файл с данными можно скачать здесь. Данные извлекаются, но поступают в несколько файлов txt для каждого языка, поэтому цикл for используется для компиляции и преобразования всех файлов txt в один файл csv для каждого языка.

Следующий фрагмент кода касается предварительной обработки данных для удаления специальных символов и цифр из набора данных. Затем строится гистограмма количества предложений для каждого языка. Затем набор данных разбивается на обучающие тесты и проходит через конвейер scikit-learn с помощью countVectorizer, tfidfTransformer для преобразования текстов в массивы и обучения с моделью логистической регрессии. Выводится матрица точности и путаницы модели.

КОД

Мы смотрим на код от А до Я, ссылка на блокнот находится в конце этого блога. Первый фрагмент кода связан с импортом необходимых библиотек и модулей для обработки данных…

Следующие строки кода касаются извлечения данных из файла .tar…

Данные извлекаются в папку с именем txt, в этой папке есть папки для каждого языка, помеченные аббревиатурами языков. В каждой языковой папке есть несколько текстовых файлов, поэтому мы создаем словарь, в котором названия языков используются в качестве ключей, а языковые аббревиатуры — в качестве значений.

Замените путь на то, где находится извлеченный файл на вашем ПК. Список всех папок в папке txt сохраняется как каталоги. Далее идут строки кода для компиляции и преобразования всех файлов txt в один файл csv для каждого языка, и это занимает примерно 2 часа.

Строки с 16 по 19 предназначены для обработки ошибок декодирования, возникающих для определенных языков. Следующие строки относятся к предварительной обработке данных, она занимает около 10 минут.

Однако для обучения было выбрано только 70 000 предложений для каждого языка из-за ограничения памяти. Здесь можно быстро просмотреть данные, построив гистограмму всех распределений данных.

Набор данных перемешивается и разделяется на обучение и тестирование, которые проходят через конвейер, включающий векторизацию, преобразование Tfidf в массивы и обучение набора данных на модели логистической регрессии.

Здесь видно, что на обучение модели на 70 000 предложений для 21 языка с точностью 99,6% ушло около часа 10 минут! Чтобы проверить истинные и ложные положительные и отрицательные результаты, я запускаю матрицу путаницы для прогнозов по сравнению с истинными значениями, и ниже видно, что модель работает достаточно хорошо с точки зрения истинных и ложных положительных и отрицательных результатов.

Код можно найти здесь, поделитесь своими мыслями и опытом после запуска этого кода в разделе комментариев ниже. Спасибо