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

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

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

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

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

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

Установка зависимости
Создание структуры папок и загрузка языковой модели
Тестирование модели
Создание интерфейса streamlit
Прекратите использовать Google Translator! Создайте собственное приложение с ИИ
окончательный интерфейс приложения с 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.

  1. Создайте подпапки model_it и model_es
  2. Перейдите на вкладку файлов карты модели и загрузите все файлы, как указано ниже: для итальянской модели загрузите в каталог 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:

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

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

+1
2
+1
3
+1
0
+1
0
+1
0

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *