Прекратите использовать Google Translator! Создайте собственное приложение с ИИ

Прекратите использовать Google Translator! Создайте собственное приложение с ИИ

В современном глобализированном мире общение с людьми из разных стран и культур становится всё более важным. Однако языковые барьеры часто могут мешать эффективному общению. Хотя Google Translate стал популярным инструментом для преодоления этого разрыва, у него есть свои ограничения, особенно когда речь идёт о точном переводе длинных текстов.

Меня очень раздражает копировать/вставлять небольшую часть текста в Google Translate, ждать результата, копировать в свой файл… копировать, вставлять, повторять… Так почему бы не решить эту проблему?

Также есть опасения по поводу конфиденциальности и безопасности использования сторонних сервисов для перевода конфиденциальной информации. В этой статье мы рассмотрим альтернативное решение для создания собственного приложения для перевода на основе ИИ с использованием Hugging Face. Создав собственное приложение для перевода, вы сможете обеспечить конфиденциальность и безопасность своих данных, а также добиться достаточно точного перевода длинных текстов.

Вот вкратце шаги, которые мы предпримем:

Установка зависимости Создание структуры папок и загрузка языковой модели Тестирование модели Создание интерфейса streamlit
окончательный интерфейс приложения с Streamlit
окончательный интерфейс приложения с Streamlit

Установка зависимости

Нам нужно не так много пакетов: мы хотим получить доступ к моделям Hugging Face, создавать фрагменты длинных текстов и графический интерфейс.

Но сначала, в качестве хорошей практики, давайте создадим виртуальную среду для нашего нового проекта Python. Создайте новый каталог (у меня AI_translator) и запустите инструкцию по созданию venv:

mkdir AI_translator cd AI_translator python3.10 -m venv venv #version 3.10 is reccomended

Чтобы активировать виртуальную среду:

source venv/bin/activate #for mac venv\Scripts\activate #for windows users

С активированным venv:

pip install mkl mkl-include # required for CPU usage on Mac users pip install torch==1.11.0 torchvision==0.12.0 torchaudio==0.11.0 # The core pip install transformers pip install langchain==0.0.173 pip install streamlit pip install streamlit-extras

Если модель, которую вы собираетесь использовать, имеет веса, созданные с помощью Tensorflow (см. следующий раздел), вы также должны установить tensorflow.

pip install tensorflow

Создание структуры папок и загрузка языковой модели

Ядром этого приложения является модель языкового перевода. Я выбрал свой целевой язык (итальянский) и исходный язык текста (английский). Это очень важно: модели перевода обучаются в определённом порядке:

Прекратите использовать Google Translator! Создайте собственное приложение с ИИ

Приведённая выше модель предназначена для переводов: в частности, с английского на корейский. Помните, что в Hugging Face Hub модели перевода обычно работают только для пары и в определенном порядке.

Вы можете найти коллекцию удивительных моделей перевода в репозитории Hugging Face Исследовательской группы языковых технологий Хельсинкского университета.

Здесь 1440 языковых моделей. Мне нужна модель для переводов с английского на итальянский: поэтому мне нужно найти что-то, что заканчивается на en-to-it.

Прекратите использовать Google Translator! Создайте собственное приложение с ИИ

Чтобы показать вам пример модели тензорного потока, я также выберу https://huggingface.co/Helsinki-NLP/opus-mt-tc-big-en-es , предназначенный для перевода испанского с английского.

Прекратите использовать Google Translator! Создайте собственное приложение с ИИ

Как вы можете видеть, эта модель говорит мне, что у нас есть веса, доступные как в PyTorch, так и в Tensorflow.

  • Создайте подпапки model_it и model_es
  • Перейдите на вкладку файлов карты модели и загрузите все файлы, как указано ниже: для итальянской модели загрузите в каталог model_it
# for the italian model from https://huggingface.co/Helsinki-NLP/opus-mt-en-it/tree/main # torch model README.md config.json generation_config.json pytorch_model.bin source.spm target.spm tokenizer_config.json vocab.json

для англо-испанской модели, которую нужно скачать в каталоге model_es :

# for the spanish model from https://huggingface.co/Helsinki-NLP/opus-mt-en-it/tree/main # tensorflow model README.md config.json generation_config.json source.spm special_tokens_map.json target.spm tf_model.h5 tokenizer_config.json vocab.json
Прекратите использовать Google Translator! Создайте собственное приложение с ИИ

Как только все файлы загружены в соответствующие подпапки, всё готово.

Тестирование модели

Заметка: если веса модели в формате .h5, вам необходимо установить tensorflow (как в примере выше)

pip install tensorflow

Помните, что вам нужно указать структуру tensorflow , когда вы вызываете свою модель с помощью from_tf=True. Должно получиться что-то вроде этого:

repo_id = “hcho22/opus-mt-ko-en-finetuned-en-to-kr” model = AutoModelForSeq2SeqLM.from_pretrained(repo_id, from_tf=True)

Создайте новый файл с именем test-en-it.py: мы будем использовать его для проверки функциональности конвейера перевода с моделью pytorch перед тем, как приступить к созданию пользовательского интерфейса.

import torch from transformers import AutoTokenizer, AutoModelForSeq2SeqLM from transformers import pipeline import datetime #LOCAL MODEL EN-IT #--------------------------------- # Helsinki-NLP/opus-mt-en-it Model_IT = './model_it/' #torch #--------------------------------- # the string to be rtanslated for test English = "Another common struggle that Python programmers face with pip is package installation errors. Some errors may come because the library you are installing requires compiling on your local computer: others can happen when there are issues with the package itself or when there are network or permission issues." from transformers import AutoTokenizer, AutoModelForSeq2SeqLM # INITIALIZE TRANSLATION FROM ENGLISH TO ITALIAN TORCH MODEL tokenizer_tt0it = AutoTokenizer.from_pretrained(Model_IT) model_tt0it = AutoModelForSeq2SeqLM.from_pretrained(Model_IT) #Helsinki-NLP/opus-mt-en-it or #Helsinki-NLP/opus-mt-it-en # instantiate the pipeline for translation TToIT = pipeline("translation", model=model_tt0it, tokenizer=tokenizer_tt0it) #start the translation print("translation in progress") start = datetime.datetime.now() #not used now but useful finaltext = TToIT(English) stop = datetime.datetime.now() #not used now but useful elapsed = stop - start print(f'Translation generated in {elapsed}...') print(finaltext[0]['translation_text']) print(f"Translated number {len(English.split(' '))} of words")

Объяснение кода

Мы импортируем ядро взаимодействия модели: pytorch и библиотеку трансформеров. Затем мы устанавливаем контрольную точку для локальной загруженной модели, сохраняя её путь Model_IT = ‘./model_it/’.

Строка для перевода хранится в переменной English. Затем мы инициализируем вызов библиотеки преобразования для токенизатора, модели и конвейера, который мы хотим выполнить: обратите внимание, что мы передаём путь (переменная model_IT) как для токенизатора, так и для модели. Конвейер создаётся с помощью:

TToIT = pipeline("translation", model=model_tt0it, tokenizer=tokenizer_tt0it)

Если мы запустим код, мы увидим что-то вроде этого:

Прекратите использовать Google Translator! Создайте собственное приложение с ИИ

Объяснение кода тензорного потока

Создайте новый файл с именем test-en-es.py: мы будем использовать его для проверки функциональности конвейера перевода с моделью тензорного потока, прежде чем приступить к созданию пользовательского интерфейса. Код для файла приведён ниже (пояснения будут следовать): единственное изменение в вызове модели:

import tensorflow from transformers import AutoTokenizer, AutoModelForSeq2SeqLM from transformers import pipeline import datetime #LOCAL MODEL EN-ES #--------------------------------- # Helsinki-NLP/opus-mt-tc-big-en-es #--------------------------------- Model_ES = './model_es/' # tensorflow #--------------------------------- English = "Another common struggle that Python programmers face with pip is package installation errors. Some errors may come because the library you are installing requires compiling on your local computer: others can happen when there are issues with the package itself or when there are network or permission issues." from transformers import AutoTokenizer, AutoModelForSeq2SeqLM # INITIALIZE TRANSLATION FROM ENGLISH TO ENGLISH with TENSORFLOW MODEL tokenizer_tt0es = AutoTokenizer.from_pretrained(Model_ES) print(' Initializing AI Model & pipeline...') model_tt0es = AutoModelForSeq2SeqLM.from_pretrained(Model_ES, from_tf=True) #Helsinki-NLP/opus-mt-en-it or #Helsinki-NLP/opus-mt-it-en print("pipeline") TToES = pipeline("translation", model=model_tt0es, tokenizer=tokenizer_tt0es) start = datetime.datetime.now() #not used now but useful print('Translation in progress...') finaltext = TToES(English) stop = datetime.datetime.now() #not used now but useful elapsed = stop - start print(f'Translation generated in {elapsed}...') print('*'*50) print(finaltext[0]['translation_text']) print('*'*50) print(f"Translated number {len(English.split(' '))} of words")

ПРИМЕЧАНИЕ: как видите, к вызову модели был добавлен только один параметр (from_tf=True): это будет очень полезно, когда вы захотите поэкспериментировать с другими моделями Hugging Face.

model_tt0es = AutoModelForSeq2SeqLM.from_pretrained(Model_ES, from_tf=True) #Helsinki-NLP/opus-mt-en-it or #Helsinki-NLP/opus-mt-it-en

Создание интерфейса Streamlit

Создайте новый файл с именем st-yourTranslationApp.py: он будет включать базовый графический веб-интерфейс с использованием Streamlit.

Streamlit — это библиотека для создания веб-приложений с данными без необходимости знать какие-либо интерфейсные технологии, такие как HTML и CSS. Если вы хотите узнать больше, ознакомьтесь с документацией здесь.

import streamlit as st import torch from transformers import AutoTokenizer, AutoModelForSeq2SeqLM from transformers import pipeline from langchain.text_splitter import CharacterTextSplitter import datetime import os import sys ############# Displaying images on the front end ################# st.set_page_config(page_title="Your AI translation App", page_icon='♾️', layout="centered", #or wide initial_sidebar_state="expanded", menu_items={ 'Get Help': 'https://docs.streamlit.io/library/api-reference', 'Report a bug': "https://www.extremelycoolapp.com/bug", 'About': "# This is a header. This is an *extremely* cool app!" }, ) # Helsinki-NLP/opus-mt-en-it Model_IT = './model_it/' #torch model checkpoint

С приведённым выше кодом все основные операции импорта выполнены, а общая настройка страницы с потоковым освещением завершена.

ПРИМЕЧАНИЕ: Не забудьте импортировать тензорный поток, если ваша модель имеет формат .h5 .

### HEADER section st.title("Your AI powered Text Translator 💬 ") st.header("Translate your English text to Italian") #st.image('Headline.jpg', width=750) English = st.text_area("Paste here the English text...", height=300, key="original") col1, col2, col3 = st.columns([2,5,2]) btn_translate = col2.button("✅ Start Translation", use_container_width=True, type="primary", key='start')

Базовая структура выполнена здесь: обратите внимание, что я создал 3 столбца и указал соотношение 3. Поскольку я хочу, чтобы кнопка располагалась по центру, мы вызываем виджеты в столбце 2 и указываем расширение его ширины до ширины столбцов.

col1, col2, col3 = st.columns([2,5,2]) #col1 2/9, col2 5/9, col3 2/9 btn_translate = col2.button("✅ Start Translation", use_container_width=True, type="primary", key='start')

Конвейер перевода будет вызываться только при нажатии кнопки btn_translate .

if btn_translate: if English: Model_IT = './model_it/' #torch with st.spinner('Initializing pipelines...'): st.success(' AI Translation started', icon="🆗") from langchain.text_splitter import CharacterTextSplitter # TEXT SPLITTER FUNCTION FOR CHUNKING text_splitter = CharacterTextSplitter( separator = "\n\n", chunk_size = 300, chunk_overlap = 0, length_function = len, ) # CHUNK THE DOCUMENT st.success(' Chunking text...', icon="🆗") texts = text_splitter.create_documents([English]) #print('[bold red] Inizialize AI toknizer...') from transformers import AutoTokenizer, AutoModelForSeq2SeqLM # INITIALIZE TRANSLATION FROM ENGLISH TO ITALIAN tokenizer_tt0it = AutoTokenizer.from_pretrained(Model_IT) st.success(' Initializing AI Model & pipeline...', icon="🆗") model_tt0it = AutoModelForSeq2SeqLM.from_pretrained(Model_IT) #Helsinki-NLP/opus-mt-en-it or #Helsinki-NLP/opus-mt-it-en #print("pipeline") TToIT = pipeline("translation", model=model_tt0it, tokenizer=tokenizer_tt0it) # ITERATE OVER CHUNKS AND JOIN THE TRANSLATIONS finaltext = '' start = datetime.datetime.now() #not used now but useful print('Translation in progress...') for item in texts: line = TToIT(item.page_content)[0]['translation_text'] finaltext = finaltext+line+'\n' stop = datetime.datetime.now() #not used now but useful elapsed = stop - start st.success(f'Translation completed in {elapsed}', icon="🆗") print(f'Translation generated in {elapsed}...') st.text_area(label="Translated text in Italian:", value=finaltext, height=350) st.markdown(f'Translation completed in **{elapsed}**') st.markdown(f"Translated number **{len(English.split(' '))}** of words") else: st.warning("You need some text to be translated!", icon="⚠️")

Объяснение кода

2 вложенных оператора if проверяют условие нажатия кнопки (if btn_translate) и присутствия английского текста для перевода (if English:). После этого мы используем text-splitter, чтобы разбить любой длинный текст на более мелкие части, чтобы не переполнить максимальное количество токенов.

Вызов конвейера такой же, как и в тестовом коде из предыдущего раздела, за исключением необходимости итераций. Мы разделили текст на части, поэтому нам нужно получить результат конвейера перевода для каждой части, а затем объединить их:

# ITERATE OVER CHUNKS AND JOIN THE TRANSLATIONS finaltext = '' start = datetime.datetime.now() #not used now but useful print('Translation in progress...') for item in texts: line = TToIT(item.page_content)[0]['translation_text'] finaltext = finaltext+line+'\n'

Наконец, мы можем отобразить в виджете text_area финальный текст нашего перевода:

st.text_area(label="Translated text in Italian:", value=finaltext, height=350)

Теперь вы можете копировать и вставлять очень длинный текст и получать перевод с помощью вашего приложения AI с открытым исходным кодом.

Вот пример с текстом, взятым из статьи Теда Бауэра на Medium:

вставленная текстовая статья
вставленная текстовая статья
нажатие кнопки, чтобы начался перевод
нажатие кнопки, чтобы начался перевод
получение результата за 37 секунд
получение результата за 37 секунд

Я надеюсь, что данная статья была для вас интересной и полезной!

Начать дискуссию