Python + Keras + LSTM: делаем переводчик текстов за полчаса
В предыдущей части я рассматривал создание несложной распознавалки текста, основанной на нейронной сети. Сегодня мы применим аналогичный подход, и напишем автоматический переводчик текстов с английского на немецкий.
Для тех, кому интересно как это работает, подробности под катом.
Примечание: данный проект использования нейронной сети для перевода исключительно учебный, поэтому вопрос «зачем» не рассматривается. Просто для интереса. Я не ставлю целью доказать что тот или иной метод лучше или хуже, просто интересно было проверить, что получится. Метод, используемый ниже, разумеется, упрощенный, но надеюсь никто и не надеется, что мы напишем второй Lingvo за полчаса.
Сбор данных
В качестве исходного датасета был использован найденный в сети файл, содержащий английские и немецкие фразы, разделенные табуляцией. Набор фраз выглядит примерно так:
Файл содержит 192тыс строк и имеет размер 13МБайт. Загружаем текст в память и разбиваем данные на два блока, для английских и немецких слов.
Также мы перевели все слова в нижний регистр и убрали знаки препинания.
Следующим шагом мы должны подготовить данные для нейронной сети. Сеть не знает что такое слова, и работает исключительно с цифрами. К счастью для нас, в keras уже встроен класс Tokenizer, который заменяет слова в предложениях их цифровыми кодами.
Его использование просто проиллюстрировать примером:
Фраза «to be or not to be» будет заменена массивом [1 2 3 4 1 2 0 0], где как не сложно догадаться, 1=to, 2=be, 3=or, 4=not. Эти данные мы уже можем подавать на нейросеть.
Обучение нейронной сети
Наши данные в цифровом виде готовы. Разобьем массив на два блока для входных (английские строки) и выходных (немецкие строки) данных. Также подготовим отдельный блок для валидации процесса обучения.
Теперь мы можем создать модель нейронной сети и запустить её обучение. Как можно видеть, нейронная сеть содержит слои LSTM, имеющие ячейки памяти. Хотя возможно, заработало бы и на «обычной» сети, желающие могут проверить самостоятельно.
Само обучение выглядит примерно так:
Процесс, как можно видеть, не быстрый, и занимает порядка получаса на Core i7 + GeForce 1060 для набора из 30тыс строк. По окончании обучения (его нужно сделать всего один раз) модель сохраняется в файл, и дальше её можно использовать повторно.
Для получения перевода воспользуемся функцией predict_classes, на вход которой подадим несколько несложных фраз. Функция get_word используется для обратного преобразования слов в числа.
Результаты
Теперь собственно, самое любопытное — результаты. Интересно посмотреть, как обучается нейронная сеть и «запоминает» соответствия между английскими и немецкими фразами. Я специально взял 2 фразы попроще и 2 посложнее, чтобы увидеть разницу.
«the weather is nice today» — «das ist ist tom»
«my name is tom» — «wie für tom tom»
«how old are you» — «wie geht ist es»
«where is the nearest shop» — «wo ist der»
«the weather is nice today» — «das haus ist bereit»
«my name is tom» — «mein heiße heiße tom»
«how old are you» — «wie alt sind sie»
«where is the nearest shop» — «wo ist paris»
Виден некий прогресс. Первая фраза совсем невпопад. Во второй фразе нейросеть «выучила» глагол heißen (называться), но «mein heiße heiße tom» все равно некорректно, хотя о смысле уже можно догадаться. Третья фраза уже правильная. В четвертой правильная первая часть «wo ist», но nearest shop почему-то было заменено на paris.
«the weather is nice today» — «das ist ist aus»
«my name is tom» — ««tom» ist mein name»
«how old are you» — «wie alt sind sie»
«where is the nearest shop» — «wo ist der»
Как можно видеть, вторая фраза стала правильной, хотя конструкция выглядит несколько непривычно. Третья фраза правильная, ну а 1я и 4я фразы пока так и не были «выучены». На этом я с целью экономии электроэнергии закончил процесс.
Заключение
Как можно видеть, в принципе это работает. Хотел бы я с такой скоростью запоминать новый язык 🙂 Конечно, результат пока что не идеален, но обучение на полном наборе в 190тыс строк заняло бы не один час.
Для желающих поэкспериментировать самостоятельно, исходный код под спойлером. Программа теоретически может использовать любую пару языков, не только английский и немецкий (файл должен быть в кодировке UTF-8). Вопрос качества перевода тоже остается открытым, здесь есть что потестировать.
Сам словарь слишком большой, чтобы приаттачить к статье, ссылка в комментариях.
Пишем консольный переводчик для *nix на Python
Здравствуйте. Наверняка Вам встречались незнакомые английские слова или фразы, и Вам постоянно приходилось лезть в браузер, открывать сайт с онлайн переводчиком и переводить, при этом думая как хорошо было бы, если это было реализовано бы в виде софта под *nix.
Под операционные системы семейства Windows существует уже давно много переводчиков, а вот для unix систем, лично я, пока не встречал.
На старт!
И так начнём, писать мы будем на языке программирования python. Он есть практически во всех *nix системах.
Для написания переводчика, нам понадобится одна библиотека не входящая в стандартный набор python’a — simplejson. Скачать её можно на официальном сайте.
После того как скачали, можете либо установить в систему, либо положить папку simplesjon расположенную в архиве рядом с нашим исполняемым python файлом.
Раздобыли simplejson? Теперь создадим файл translate.py и перейдём от теории к практике.
Программировать можно в чём угодно, хоть в nano, но я предпочитаю редактор Geany.
Библиотеку мы трогать не будем, поэтому переходим к файлу translate.py:
Делаем импорт необходимых нам библиотек:
Самая главная и единственная функция
На всякий случай опубликую весь код целиком:
На этом разработка программной части закончена. Можете проверить и запустить файл таким образом:
python translate.py en привет — переведёт текст на английский
python translate.py ru hello — переведёт текст на русский
«Но это же не удобно» — скажите вы. Действительно, набирать такую большую команду запуска в консоли действительно затруднительно.
Решение
Возьмём папку с проектом и переместим её какую нибудь директорию например в /usr/share
и получится у нас /usr/share/translate
Затем в вашем BINDIR’e (у меня на debian — /usr/bin) создадим 2 файла, en и ru:
Сожержимое файла /usr/bin/ru:
Сожержимое файла /usr/bin/en:
Итого:
В нашей системе теперь появилось 2 новые команды: en и ru соответственно.
Теперь пользоваться стало на много удобнее: en текст для перевода или же ru текст для перевода
Можно заюзать еще вот так:
Минусы:
Практически у любой программы есть свои минусы: у этой — это отсутствие локальной базы данных, весь перевод осуществляется через интернет. Но в век интернет-технологий, когда интернет в каждом доме — я думаю это не проблема.
Спасибо за внимание.
UPD: Я никому не навязываю своё мнение, я показал как реализовал это я
How to translate text with python
Use different famous translators (E.g google translator and more) with python.
Introduction
In this tutorial, we will explore different possibilities to translate a text or word using python. From my experience, this is very helpful if you want to automate the translation of many paragraphs, sentences or words.
Furthermore, you can have a backend worker, which receives new data constantly and can either return a request with the translation or store different translations in a database (this is very useful in NLP tasks).
One of the reasons to choose Python apart from the clear syntax and the extensive library is the great community that works extensively on the development of the language itself or extending the functionality with third party modules.
Precisely, one of the modules that makes it straightforward to translate texts is the deep_translator, which provides support for multiple famous translators.
Overview
Installation
It is recommended to install the package using pip. Briefly, to install the stable release, run this command in your terminal:
This is the preferred method to install deep_translator, as it will always install the most recent stable release. If you don’t have pip installed, this Python installation guide can guide you through the process.
Google Translator
The google translator is already integrated in the deep_translator package and can be directly used by importing it. Then, an instance is created, where the source and target language are given as arguments. The translate method can be used afterwards to return the translated text.
In the code below, the value auto is used to let google translator detect which language is used as the source language and the target value is given as an abbreviation, which stands for german in this case.
Furthermore, you can translate from a text file. This is also straightforward and can be achieved easily by updating the previous code. I also wanted to indicate here that the source and target languages can be passed by names instead of abbreviations.
Now what if you have sentences in different languages and you want to translate all of them to the same target language. The following code demonstrate how you can do this
Ok great! Now let’s explore other translators.
PONS is one of Germany’s leading language publishers. It is mostly famous for translating single words or small sentences. It has a rich database of words and can even outperform google translate when it comes to translating words and getting synonyms.
Luckily, the deep_translator also support PONS. The following code demonstrates how to use it. The API looks like the previous one with only small changes
Furthermore, you can get all synonym or suggestions that pons returns
Linguee
The Linguee translator is an online bilingual concordance that provides an online dictionary for a number of language pairs, including many bilingual sentence pairs. Same as previous translators, this functionality is integrated in the deep_translator package.
Same as the Pons translator, you can get all synonyms and additional suggestions by setting the return_all argument
Mymemory
The mymemory translator is the world’s largest Translation Memory and it is 100% free to use. It has been created collecting TMs from the European Union, United Nations and aligning the best domain specific multilingual websites.
The last version of deep-translator supports mymemory translations. The following code demonstrates how to use it
Conclusion
Перевод текста с помощью Google Translate API в Python
На самом деле вы можете многое сделать с помощью Google Translate API, начиная от определения языков и заканчивая простым переводом текста, настройкой исходного и целевого языков и переводом целых списков текстовых фраз. В этой статье вы узнаете, как работать с Google Translate API на языке программирования Python.
Установка Google Translate API
Прежде чем вы сможете работать с Google Translate API в Python, вам нужно будет установить его. Существует два разных способа установки API. Первый способ прост. Просто зайдите в терминал и используйте pip для установки API, как и для любой другой библиотеки Python. Для этого введите в своем терминале следующую команду:
Нажмите Enter и модуль Python для Google Translate API будет установлен в вашей системе.
Теперь, когда вы установили API, мы увидим его в действии с помощью нескольких примеров.
Список поддерживаемых языков
Google Translate API поддерживает множество языков. Чтобы вывести список всех поддерживаемых языков, запустите следующий скрипт:
При выполнении вышеприведенный фрагмент кода перечислит имена всех поддерживаемых языков вместе с их сокращенной записью. Вот как будет выглядеть вывод:
Основное использование
Давайте напечатаем все вышеперечисленные атрибуты и посмотрим, что мы получим
В приведенном выше примере мы не указали исходный язык. Поэтому Google Translate API пытается определить исходный язык. Аналогично, мы также не указали ни одного языка назначения, и поэтому API перевел исходный язык на язык по умолчанию, английский. Но что, если вы хотите указать исходный и целевой языки?
Указание исходного и целевого языков
На самом деле, очень легко указать язык назначения и исходный язык в Google Translate API. Вот код, который вы будете использовать для передачи только исходного языка:
Вы также можете передать исходный и целевой языки одновременно:
Давайте теперь переведем финское предложение на французский, а затем напечатаем исходный и целевой языки, а также переведенный текст. На этот раз мы укажем исходный и целевой языки.
Приведенный выше фрагмент кода даст следующий результат.
Перевод списка фраз
Давайте создадим список строк, содержащих некоторые фразы из французского языка.
Теперь пришло время вызвать метод translate() и передать в качестве параметров список, исходный язык и язык назначения.
Следующий результат будет отображаться на экране.
Перевод текстовых документов
Вы также можете проверить, находится ли файл в режиме «чтения», используя свойство mode :
Вот вывод содержимого файла:
Убедитесь, что у вас есть вышеуказанный контент в вашем текстовом файле, если вы хотите следовать нашему примеру.
Вывод должен выглядеть следующим образом:
Чтобы записать переведенный текст в тот же файл или другой текстовый файл, вы просто откроете файл в режиме записи («w»). Затем вам нужно вызвать метод write() и передать ему переведенный текст, как показано ниже:
В приведенном выше примере мы использовали менеджер контекста with для автоматического открытия и закрытия потока записи. Во-вторых, мы открыли файл в режиме записи. Наконец, мы использовали метод write() для записи переведенной строки в новый файл.
Вывод
Перевод строк в Python с помощью Text Blob
В этом уроке мы будем использовать Text Blob с Python для выполнения перевода строк и слов на различные языки.
Вступление
Перевод текста-это сложная компьютерная задача, которую с каждым годом становится все легче и легче решать. Крупные компании, такие как Google, активно работают над улучшением своих услуг по переводу текстов, что позволяет остальным из нас свободно ими пользоваться.
Помимо их большого личного использования, эти сервисы могут быть использованы разработчиками через различные API. Эта статья о Text Blob который использует один из таких API для выполнения перевода текста.
Что такое TextBlob?
Внутренне/| TextBlob полагается на API Google Translate. Это означает, что для выполнения переводов требуется активное подключение к Интернету.
Установка TextBlob
Использование TextBlob
Использование TextBlob прост и понятен. Мы просто импортируем его, назначаем строку конструктору и затем переводим ее с помощью функции translate() :
Иногда мы можем захотеть определить язык, чтобы решить, нуждается ли текст в переводе вообще. Для определения языка некоторого текста используется функция Text Blob ‘s detect_language() :
Примеры перевода и точность
Перевод предложения С английского на хинди
В качестве нашего первого примера мы увидим, насколько хорошо английский язык переведен на хинди:
В результате получается следующее:
Перевод русской поэзии на хорватский язык
Давайте посмотрим, как TextBlob управляет поэзией. Ниже приводится произведение русского поэта Владимира Маяковского, сначала на русском, а затем на английском языках:
Мы скормим оригинальное стихотворение на кириллице Text Blob и посмотрите, как хорошо он переводится на хорватский. Поскольку и русский, и хорватский, и славянский языки, перевод ожидается относительно хорошим:
Запустив приведенный выше код, мы получим следующий вывод (отформатированный для удобства):
Перевод Массива немецких слов на английский язык
В некоторых случаях у нас не будет полных предложений для перевода. У нас может быть список или массив слов. Их гораздо легче перевести, так как нет контекста, который потенциально мог бы изменить перевод:
В результате получается:
Перевод еды с английского на французский
Наконец, давайте переведем английское слово на французский:
Французский перевод/| яблоко|/. Приятного аппетита!
Вывод
Перевод – интересная, но сложная компьютерная задача. Глубокое обучение и другие методы искусственного интеллекта становятся все более эффективными в понимании языка и выполнении автоматического перевода. Text Blob – это один из инструментов, доступных разработчикам, который может быть использован для выполнения таких автоматизированных языковых переводов.
Такой подход имеет много преимуществ, однако не все переводы совершенны. Эти методы все еще развиваются, и если вы нуждаетесь в качественном переводе большой важности, всегда лучше проконсультироваться с профессиональным переводчиком.