Как перевести набор текстовых и/или XML-страниц с помощью нескольких API языкового перевода.

Часто мы сталкиваемся с проблемой, когда либо мы не можем понять кусок критического текста, либо нам необходимо предоставить информацию носителям другого языка. Хотя инструменты онлайн-перевода доступны, не всегда есть возможность получить к ним доступ, или может быть лучше предоставить статическую переведенную страницу для наших клиентов.

В этом руководстве мы рассмотрим различные доступные API-интерфейсы перевода, как их использовать в Python и как мы можем использовать BeutifulSoup для перевода текста на веб-страницах HTML или в документах XML.

Установка библиотеки

Для нашего перевода мы используем библиотеку translate-api python. Это обеспечивает эффективный интерфейс для множества доступных API-интерфейсов перевода.

pip install translators --upgrade

Выбор переводчика

Начнем с выбора переводчика. Хотя Google Translate часто используется по умолчанию, доступно несколько более точных:

Стоит отметить, что более специализированные переводчики также поддерживают профессиональное поле для своих переводов — это гарантирует, что перевод будет соответствовать переводу, полученному из документов (корпуса) в указанном поле.

Два примера приведены ниже и предоставлены с использованием аргумента «professional_field» при указании запроса.

baidu: ('common','medicine','electronics','mechanics')
caiyun: ("medicine","law","machinery")

Создание запроса

Теперь мы выбрали API перевода, мы загружаем наш скрипт и обращаемся к нему следующим образом.

import translators as ts
ts.<api_name>(..)                          # e.g. ts.google

Выбор языка

Есть ряд языков, между которыми мы можем переводить. Чтобы проверить, интересуют ли нас два, мы можем выбрать наш транслятор и выполнить следующую команду:

Обратите внимание на знак подчеркивания перед именем переводчика!

ts._<translator_name>.language_map # e.g. ts._google.language_map

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

В случае с Google мы также можем посмотреть страницу языковой поддержки ниже:



Просмотр параметров

Если мы решим использовать Google API для нашего перевода, мы можем использовать функцию справки: help(ts.google) чтобы решить, какие аргументы нам нужны. Наиболее распространенные из них перечислены ниже.

  • query_text: это строка по умолчанию, которую мы переводим.
  • from_language: по умолчанию используется «авто» и используется апокалипсис для «угадывания» языка.
  • to_language: по умолчанию все переводы выполняются на английский (en)
  • время ожидания: количество времени, которое мы хотим подождать, прежде чем он сдастся. По умолчанию нет (не указано)
  • sleep_seconds: при выполнении нескольких запросов может быть целесообразно разделить их, чтобы предотвратить переполнение сервера и их отклонение.

Перевод отдельной фразы

Начнем с обычной тестовой фразы «Лиса перепрыгнула через ленивую собаку» и переведем ее на валлийский (cy):

phrase = 'The quick brown fox jumps over the lazy dog.'
ts.google(phrase, from_language='en', to_language='cy')

Это возвращает:«Mae’r llwynog brown cyflym yn neidio dros y ci diog».

Поскольку я не говорю по-валлийски, я могу проверить смысл перевода, переведя его обратно:

phrase = "Mae'r llwynog brown cyflym yn neidio dros y ci diog."
ts.google(phrase)

Мы получаем перевод, очень похожий на исходную строку: «Быстрая коричневая лиса перепрыгивает через ленивую собаку».

Примечание. Как и в случае с китайским шепотом, существуют определенные языковые нюансы, которые часто теряются при переводе. Это означает, что мы вряд ли получим точную исходную фразу.

Пакетный перевод

Для нескольких абзацев мы можем разделить наши данные на группы и перебирать их, используя понимание списка. Это полезно для больших документов, так как у Google есть ограничение в 5000 символов.

В качестве примера возьмем пару строк из «Автостопом по галактике» Дугласа Адама:

corpus = ["On display? I eventually had to go down to the cellar to find them.",
"That's the display department.",
"With a flashlight.",
"Ah, well the lights had probably gone.",
"So had the stairs.",
"But look, you found the notice didn't you?",
"Yes, said Arthur, yes I did. It was on display in the bottom of a locked filing cabinet stuck in a disused lavatory with a sign on the door saying 'Beware of the Leopard'"]

Теперь мы можем перевести их по очереди, используя:

welsh = [ts.google(phrase, from_language='en', to_language='cy') for phrase in corpus]

Перевод фрейма данных

В случае, если наша информация содержится во фрейме данных pandas, мы выбираем отдельный столбец и применяем к нему функцию перевода:

import pandas as pd
df = pd.DataFrame(corpus, columns = ['text'])
df['welsh_text'] = df['text'].apply(lambda x: ts.google(x, from_language='en', to_language='cy'))

Перевод страницы: HTML/XML

Часто это не так просто, как наличие текстового документа, который нам нужно перевести. Например, у нас может быть информация на веб-сайте, которая должна быть доступна для другой страны или группы. В такой ситуации мы можем использовать BeutifulSoup для извлечения наших элементов и замены их на месте.

Монтаж

Для этого устанавливаем Beautiful Soup 4:

pip install bs4


Образец HTML-шаблона

Используя некоторые из более ранних переводов, мы случайным образом выделяем набор элементов переводов на валлийский язык из выдержки из руководства «Автостопщики».

html = '''
<html>
<head>
<title>That is the display section.</title>
</head>
<body>
<p>So got the stairs.</p>
<p>Yes, said Arthur, yes I did. It was displayed at the bottom of the locked filing cabinet stuck in a dormant toilet with a sign on the door saying 'Be wary of the leopard'</p></body>
</html>
'''

Сценарий Beautiful Soup

Начнем с определения того, какие элементы содержат наш текст. В этом примере это только поля абзаца и заголовка, однако вместо этого они могут быть отмечены с использованием атрибутов или классов.

Затем мы читаем код (наш суп), извлекаем эти элементы, используем свойство Navigatable String и применяем replace_with вместо нашего перевода.

from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'html.parser')
elements = ['p','title']
for i in soup.findAll(elements):
   i.string.replace_with(ts.google(i.string,from_language='cy',    to_language='en'))
print(soup)

Выполнение этого возвращает исходный документ с переведенными элементами p и title:

<html>
<head>
<title>That is the display section.</title>
</head>
<body>
<p>So got the stairs.</p>
<p>Yes, said Arthur, yes I did. It was displayed at the bottom of the locked filing cabinet stuck in a dormant toilet with a sign on the door saying 'Be wary of the leopard'</p></body>
</html>

Заключение

В этом руководстве мы рассмотрели использование нескольких API-интерфейсов языкового перевода через Python и способы перевода текста в фрейме данных. Наконец, мы рассмотрели возможность использования Beautiful Soup для извлечения текста из XML-шаблона и создания перевода на месте. Надеюсь, этот урок поможет сделать текст более доступным.