Use saved searches to filter your results more quickly
Cancel Create saved search
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window.
Reload to refresh your session.
Нейронный машинный перевод с английского на русский язык с помощью модели «Трансформер»
ManiaCello/en-ru-onmt
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Switch branches/tags
Branches Tags
Could not load branches
Nothing to show
Could not load tags
Nothing to show
Name already in use
A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Cancel Create
- Local
- Codespaces
HTTPS GitHub CLI
Use Git or checkout with SVN using the web URL.
Work fast with our official CLI. Learn more about the CLI.
QTranslate — удобный Переводчик Любого текста на экране
Sign In Required
Please sign in to use Codespaces.
Launching GitHub Desktop
If nothing happens, download GitHub Desktop and try again.
Launching GitHub Desktop
If nothing happens, download GitHub Desktop and try again.
Launching Xcode
If nothing happens, download Xcode and try again.
Launching Visual Studio Code
Your codespace will open once ready.
There was a problem preparing your codespace, please try again.
Latest commit
Git stats
Files
Failed to load latest commit information.
Latest commit message
Commit time
README.md
Обученная модель «Трансформер» для перевода с английского на русский язык
В данном репозитории представлена обученная модель «Трансформер» для выполнения нейронного машинного перевода с английского на русский язык и инструкция к её использованию. Для обучения была выбрана реализация модели из системы OpenNMT-py.
- Описание модели
- Обучающая выборка
- BLEU
- Системные требования
- Установка
- Перевод
- Благодарности
- Список источников
Реализация модели взята из системы OpenNMT-py. Обучение производилось на протяжении 20 эпох со следующими параметрами:
layers: 6 rnn_size: 512 # (rnn_size — неудачное название параметра d_model в OpenNMT) word_vec_size: 512 transformer_ff: 2048 heads: 8 dropout: 0.1 normalization: tokens accum_count: 2 batch_size: 5000 batch_type: tokens optim: adam adam_beta2: 0.998 decay_method: noam warmup_steps: 7300 learning_rate: 2 max_grad_norm: 0 param_init: 0 param_init_glorot: True label_smoothing: 0.1
Полный список параметров и команда для запуска обучения приведены в каталоге train .
- src (en): 62490
- tgt (ru): 62892
В репозитории имеется три варианта модели:
Как сделать программу переводчик с нуля.
- models/transformer_epoch_20.pt — модель, обученная на протяжении 20 эпох;
- models/transformer_epoch_20R.pt — оптмизированный по требуемой памяти вариант первой модели, может быть использован только для перевода, но не для продолжения обучения;
- models/transformer_avg_last_10.pt — модель с усреднёнными весами последних 10 чекпоинтов.
Обучающая выборка была составлена из нескольких наборов параллельных корпусов, представленных на сайте OPUS (за исключением корпуса Yandex):
- TED2013 — 100 тысяч предложений из субтитров к видеозаписям конференции TED 2013;
- News-Commentary v11 — 200 тысяч предложений из новостных субтитров. Данная выборка ежегодно публикуется конференцией WMT для обучения моделей машинного перевода;
- Wikipedia v1.0 — 600 тысяч предложений из статей Википедии;
- EUbookshop v2 — 50 тысяч предложений из статей, изданных отделом публикаций Европейского Союза;
- OpenSubtitiles v2018 — 27.4 миллиона предложений из субтитров к фильмам и сериалам с сайта OpenSubtitiles;
- ParaCrawl v1 — 12.1 миллиона предложений из текстов, извлечённых веб-пауком проекта ParaCrawl;
- Yandex Corpus v1.3 — 1 миллион предложений, случайным образом выбранных из экспериментальных корпусов, собранных компанией Яндекс в 2011-2013 годах из параллельных документов, найденных в Интернете в автоматическом режиме. Корпус предоставляется Яндексом бесплатно после прохождения регистрации.
Общий объём обучающей выборки после проведения фильтрации составил 6.17 миллионов предложений.
Выборка была токенизирована с помощью скрипта tokenizer.perl системы Moses и сегментирована с помощью инструмента Subword-NMT (60000 операций слияния).
Выборку в двоичном формате можно загрузить по ссылке.
- оценка BLEU для модели models/transformer_epoch_20.pt составляет 32.7.
- оценка BLEU для модели models/transformer_avg_last_10.pt составляет 33.2;
Оценки были вычислены с помощью инструмента SacreBLEU на детокенизированном тексте с флагом -lc (регистронезависимая оценка).
- четырёхядерный процессор;
- 4 ГБ оперативной памяти;
- операционная система семейства Linux.
- Установить OpenNMT-py (инструкция)
- Клонировать данный репозиторий:
git clone https://github.com/ManiaCello/en-ru-onmt cd en-ru-onmt
- Загрузить модель (ссылка) и поместить её в каталог models .
- При переводе с помощью предлагаемого автором скрипта translate.sh открыть его с помощью блокнота и в разделе «параметры» задать параметры WORK_DIR, ONMT_DIR, GPU, CPU_THREADS, BATCH
- При использовании API системы OpenNMT-py перейти в её репозиторий и запустить скрипт setup.py .
cd OpenNMT-py python setup.py install
Способы обращения к системе OpenNMT-py
Для выполнения перевода из командной строки может быть использован скрипт translate.py системы OpenNMT-py. При необходимости встраивания функции перевода в другую программу можно использовать API системы на языке Python. Пример его использования есть в вышеупомянутом скрипте. OpenNMT-py также имеет REST-сервер, позволяющий сторонним программам обращаться к ней за переводом посредством WebAPI, но, к сожалению, его использование для данной модели затруднено отсутствием поддержки инструментов Moses и Subword-NMT (впрочем, при необходимости процесс модификации сервера вряд ли составит много труда).
Формат входных и выходных данных модели
Модель работает с данными в следующем формате:
- в одной строке содержится одно предложение для перевода;
- предложения токенизированы с помощью скрипта tokenizer.perl;
- предложения сегментированы с помощью скрипта apply_bpe.py (модель — bpe_model.en.txt ).
Это означает, что исходные данные и перевод, полученный на выходе модели, требуют дополнительной обработки. Полный цикл перевода проиллюстрирован скриптом translate.sh и состоит из 3 этапов:
- токенизация и сегментация исходного предложения с помощью инструментов tokenizer.perl и apply_bpe.py ;
- перевод с помощью системы OpenNMT-py;
- десегментация и детокенизация полученного перевода с помощью инструментов sed и detokenizer.perl
В случаях, когда необходимо перевести более одного предложения за раз, может понадобиться также разделение текста на предложения и представление их в виде «одно предложение на строку». В данной инструкции этот момент не рассматривается. Упомянем только, что он может быть реализован, например, при помощи библиотеки NLTK.
Пусть предложения, которые нужно перевести, содержатся в файле data/gramma.en.txt .
При переводе из командной строки можно использовать скрипт translate.sh (предварительно требуется задать параметры в разделе «параметры» текста скрипта). Пример его использования приведен в файле example.sh :
./translate.sh data/gramma.en.txt data/gramma.ru.txt
Первый параметр — путь к файлу с данными для перевода, второй — путь к файлу, в котрый нужно сохранить перевод.
Далее рассмотрим примеры основных этапов перевода, которые включает данный скрипт.
Обработка входных данных
Этап включает токенизацию и сегментацию данных (порядок важен!).
Токенизация — это разделение предложения на токены, которыми являются слова, знаки препинания и неалфавитные символы. Все токены отделяются друг от друга символом пробела.
Для токенизации используется скрипт tools/tokenizer.perl :
mkdir .tmp tools/tokenizer.perl -l en -threads 8 < data/gramma.en.txt >.tmp/gramma.en.tok.txt
Параметр threads задаёт количество потоков, используемых при токенизации, и позволяет существенно ускорить этот процесс.
Пример предложения до токенизации:
She might snort up steam, snuff out fire!
She might snort up steam , snuff out fire !
После токенизации выборка должна быть сегментирована методом subword segmentation. Сегментация применяется при обучении моделей нейронного машинного перевода для решения проблемы ограниченного словаря.
Проблема заключается в том, что при фиксированном размере словаря, который требуют нейросетевые модели, слова не попавшие в него представляются одним токеном ( ). Метод subword segmentation предлагает разделение редко встречающихся слов на части, в расчёте на то, что уникальных частей намного меньше, чем уникальных слов, и части, попав в словарь, позволят модели перевести слово целиком. Метод оказывается действенным даже в тех случаях, когда слово вообще не встречалось в обучающей выборке, то есть даёт возможность делать «предположения» о переводе неизвестного слова.
Для сегментации используется скрипт tools/apply_bpe.py :
tools/apply_bpe.py -c tools/bpe_model.en.txt < .tmp/gramma.en.tok.txt >.tmp/gramma.en.seg.txt
bpe_model.en.txt — модель сегментации, полученная на использованной обучающей выборке.
Пример предложения до сегментации:
She might snort up steam , snuff out fire !
Для перевода из командной строки система OpenNMT-py имеет скрипт translate.py.
Пример его использования:
cd OpenNMT-py ./translate.py -model /home/algernon/en-ru-onmt/models/transformer_avg.pt -src .tmp/gramma.en.seg.txt -output .tmp/gramma.ru.seg.txt —gpu 0 —batch_size 200 —beam_size 4 —alpha 0.6 —length_penalty avg —verbose /home/algernon/en-ru-onmt/translate.log
Параметры beam_size, alpha, length_penalty можно взять из скрипта translate.sh . Остальные требуют описания:
- src — путь к файлу с входными данными;
- output — путь к файлу, куда должен быть сохранён перевод;
- gpu — номер процессора, на котором должен быть выполнен перевод. При переводе на CPU следует указать значение «-1». При использовании GPU номера имеющихся процессоров можно узнать с помощью команды nvidia-smi .
- batch_size — размер пакета (число предложений, обрабатываемых за один шаг). Значение «200» подходит для GPU с 16 ГБ памяти. При появлении ошибок о нехватке памяти значение параметра следует уменьшить.
Перевод на выходе модели является токенизированным и сегментированным.
Для десегментации используется инструмент sed :
Для детокенизации используется скрипт tools/detokenizer.perl :
tools/detokenizer.perl -l ru < .tmp/gramma.ru.tok.txt >data/gramma.ru.txt
Автор выражает благодарность компании Aligned Research Group за предоставленные вычислительные мощности для обучения нейронной сети.
Источник: github.com
Как создать программу для перевода слов
создание полноценного языка нереально.
вот как иллюстрация к созданию языка.
Лингвистические правила перевода для каждой пары языков, разные. Вам нужно в совершенстве знать правила обоих языков |
Ключевое слово в исходном ТЗ мой новый язык и мой родной язык значит вся лингвистика сохраняется или удаляется(склонения/спряжения/согласования) меняются только слова (словарь).
Здесь конечно не поспоришь
Забить базу простых соответствий для словаря в 25 000 слов, в одиночку? Это просто не реально. Если в день забивать по 100 слов (а больше, просто одному человеку не по силам), на это уйдёт 250 дней. Учитывая то, что в году примерно 240 рабочих дней. И заметьте, это при 8-и часовом рабочем дне. |
Но большой язык часто бывает и ненужен. Эллочка обходилась 30 словами. Словарь Эллочки в вики
А это уже вполне реально.
программа — запись алгоритма на языке понятном транслятору
Последний раз редактировалось evg_m; 22.03.2013 в 09:25 .
Источник: www.programmersforum.ru
Перевод текста с помощью Google Translate API в Python
Если вы не прятались под скалой, вы, вероятно, много раз использовали Google Translate. Всякий раз, когда вы пытаетесь перевести слово или предложение с определенного языка на другой, именно API Google Translate предоставляет вам желаемые результаты в фоновом режиме. Хотя вы можете переводить что угодно, просто перейдя на веб-страницу Google Translate, вы также можете интегрировать Google Translate API в свои веб-приложения или программы для ПК. Самое лучшее в API — это то, что он чрезвычайно прост в настройке и использовании.
На самом деле вы можете многое сделать с помощью Google Translate API, начиная от определения языков и заканчивая простым переводом текста, настройкой исходного и целевого языков и переводом целых списков текстовых фраз. В этой статье вы узнаете, как работать с Google Translate API на языке программирования Python.
Установка Google Translate API
Прежде чем вы сможете работать с Google Translate API в Python, вам нужно будет установить его. Существует два разных способа установки API. Первый способ прост. Просто зайдите в терминал и используйте pip для установки API, как и для любой другой библиотеки Python. Для этого введите в своем терминале следующую команду:
pip install googletrans
Нажмите Enter и модуль Python для Google Translate API будет установлен в вашей системе.
Если вы установили дистрибутив Python для Anaconda, вы можете установить API с помощью Anaconda Prompt. В этом конкретном методе вы замените в приведенной выше команде pip на conda , как показано в следующем фрагменте кода:
conda install googletrans
Теперь, когда вы установили API, мы увидим его в действии с помощью нескольких примеров.
Список поддерживаемых языков
Google Translate API поддерживает множество языков. Чтобы вывести список всех поддерживаемых языков, запустите следующий скрипт:
import googletrans print(googletrans.LANGUAGES)
В приведенном выше примере вы используете ключевое слово import для импорта модуля googletrans . Впоследствии вы можете перечислить все названия языков, напечатав атрибут LANGUAGES модуля googletrans .
При выполнении вышеприведенный фрагмент кода перечислит имена всех поддерживаемых языков вместе с их сокращенной записью. Вот как будет выглядеть вывод:
Основное использование
Основное использование Google Translate API — это, конечно, перевод слов или предложений с одного языка на другой. Для этого мы должны импортировать класс Translator из модуля googletrans .
from googletrans import Translator
Далее вы должны создать объект класса Translator .
translator = Translator()
Как только объект класса Translator создан, вы передадите текст на исходном языке в качестве параметра методу translate() объекта класса Translator() , как показано ниже:
result = translator.translate(‘Mitä sinä teet’)
В приведенном выше сценарии мы передаем финский текст методу translate() .
Метод translate() возвращает объект, содержащий информацию о переводе текста, источника и назначения языков и произношения текста. По умолчанию метод translate() возвращает английский перевод текста, переданного ему. В нашем случае объект, возвращаемый методом translate() , сохраняется в переменной result .
Объект, возвращаемый методом translate() , имеет следующие атрибуты:
- src : Исходный язык
- dest : Язык назначения, установленный на английский (en)
- origin : Оригинальный текст, в нашем примере это Mitä sinä teet
- text : Переведенный текст, в нашем случае это будет «what are you doing?»
- pronunciation : Произношение переведенного текста
Давайте напечатаем все вышеперечисленные атрибуты и посмотрим, что мы получим
print(result.src) print(result.dest) print(result.origin) print(result.text) print(result.pronunciation)
fi en Mitä sinä teet What are you doing What are you doing
Выходные данные показывают, что исходный язык — финский (fi), а язык назначения — английский (en). Переведенное предложение можно распечатать через атрибут text .
В приведенном выше примере мы не указали исходный язык. Поэтому Google Translate API пытается определить исходный язык. Аналогично, мы также не указали ни одного языка назначения, и поэтому API перевел исходный язык на язык по умолчанию, английский. Но что, если вы хотите указать исходный и целевой языки?
Указание исходного и целевого языков
На самом деле, очень легко указать язык назначения и исходный язык в Google Translate API. Вот код, который вы будете использовать для передачи только исходного языка:
result = translator.translate(‘Mikä on nimesi’, src=’fi’)
Чтобы добавить только целевой язык, вы должны добавить атрибут dest , за которым следует код языка:
result = translator.translate(‘Mikä on nimesi’, dest=’fr’)
Вы также можете передать исходный и целевой языки одновременно:
result = translator.translate(‘Mikä on nimesi’, src=’fi’, dest=’fr’)
Давайте теперь переведем финское предложение на французский, а затем напечатаем исходный и целевой языки, а также переведенный текст. На этот раз мы укажем исходный и целевой языки.
from googletrans import Translator translator = Translator() result = translator.translate(‘Mikä on nimesi’, src=’fi’, dest=’fr’) print(result.src) print(result.dest) print(result.text)
Приведенный выше фрагмент кода даст следующий результат.
fi fr Quel est votre nom
Перевод списка фраз
Также можно перевести список текстовых фраз с помощью Google Translate API. Основной процесс такой же, как описано выше. Вам просто нужно передать список, содержащий фразы, в качестве параметра метода translate() . Это полезно для того, чтобы пакет фраз переводился отдельно, но все в одном вызове API.
Давайте создадим список строк, содержащих некоторые фразы из французского языка.
sentences = [‘Bienvenu’, ‘Comment allez-vous’, ‘je vais bien’]
Теперь пришло время вызвать метод translate() и передать в качестве параметров список, исходный язык и язык назначения.
result = translator.translate(sentences, src=’fr’, dest=’sw’)
В приведенном выше сценарии исходный язык — французский, а язык назначения — суахили.
Метод translate() возвращает список объектов, если вы передаете список фраз к нему. Каждый объект в списке, возвращаемый методом translate() , соответствует каждой фразе в списке ввода, который должен быть переведен. Лучший способ найти перевод каждой входной фразы в списке — это перебрать список выходных объектов. Затем вы можете использовать text , origin , src и другие атрибуты отдельных объектов, чтобы увидеть перевод отдельных фраз в списке ввода.
В приведенном ниже сценарии мы перебираем список объектов, возвращаемых методом translate() , а затем печатаем источник и переведенный текст:
for trans in result: print(f’ -> ‘)
Следующий результат будет отображаться на экране.
Bienvenu -> karibu Comment allez-vous -> Vipi wewe je vais bien -> Niko sawa
Перевод текстовых документов
Вы также можете переводить текстовые документы через Google Translate API. Все, что вам нужно сделать, это прочитать текстовый файл в Python, используя метод open , прочитать текст и передать его в метод translate() .
Первый шаг — открыть файл в режиме «чтения»:
f = open(‘C:\Users\Khurram\Desktop\test.txt’, ‘r’)
Вы также можете проверить, находится ли файл в режиме «чтения», используя свойство mode :
if f.mode == ‘r’:
Далее вы можете использовать метод f.read() для чтения содержимого файла. Содержимое файла может быть сохранено в любой переменной. В нашем случае имя переменной будет contents .