Прекратите использовать Google Translator! Создайте собственное приложение с ИИ
Прекратите использовать Google Translator! Создайте собственное приложение с ИИ
В современном глобализированном мире общение с людьми из разных стран и культур становится всё более важным. Однако языковые барьеры часто могут мешать эффективному общению. Хотя Google Translate стал популярным инструментом для преодоления этого разрыва, у него есть свои ограничения, особенно когда речь идёт о точном переводе длинных текстов.
Меня очень раздражает копировать/вставлять небольшую часть текста в Google Translate, ждать результата, копировать в свой файл… копировать, вставлять, повторять… Так почему бы не решить эту проблему?
Также есть опасения по поводу конфиденциальности и безопасности использования сторонних сервисов для перевода конфиденциальной информации. В этой статье мы рассмотрим альтернативное решение для создания собственного приложения для перевода на основе ИИ с использованием Hugging Face. Создав собственное приложение для перевода, вы сможете обеспечить конфиденциальность и безопасность своих данных, а также добиться достаточно точного перевода длинных текстов.
Вот вкратце шаги, которые мы предпримем:
Установка зависимости
Создание структуры папок и загрузка языковой модели
Тестирование модели
Создание интерфейса 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
Создание структуры папок и загрузка языковой модели
Ядром этого приложения является модель языкового перевода. Я выбрал свой целевой язык (итальянский) и исходный язык текста (английский). Это очень важно: модели перевода обучаются в определённом порядке:
Приведённая выше модель предназначена для переводов: в частности, с английского на корейский. Помните, что в Hugging Face Hub модели перевода обычно работают только для пары и в определенном порядке.
Вы можете найти коллекцию удивительных моделей перевода в репозитории Hugging Face Исследовательской группы языковых технологий Хельсинкского университета.
Здесь 1440 языковых моделей. Мне нужна модель для переводов с английского на итальянский: поэтому мне нужно найти что-то, что заканчивается на en-to-it.
Чтобы показать вам пример модели тензорного потока, я также выберу https://huggingface.co/Helsinki-NLP/opus-mt-tc-big-en-es , предназначенный для перевода испанского с английского.
Как вы можете видеть, эта модель говорит мне, что у нас есть веса, доступные как в 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
Как только все файлы загружены в соответствующие подпапки, всё готово.
Тестирование модели
Заметка: если веса модели в формате .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)
Если мы запустим код, мы увидим что-то вроде этого:
Объяснение кода тензорного потока
Создайте новый файл с именем 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:
Я надеюсь, что данная статья была для вас интересной и полезной!