Навигация
Главная »  Java 

Переводим книги с помощью Яндекс.API


Источник: habrahabr
prineside

Зачем это надо


Однажды мне пришло в голову прочитать одну книгу на родном языке автора, английском. После прочтения нескольких страниц стало понятно, что читать придется долго, так как за каждым незнакомым словом приходилось тянуться за словарем, искать нужную страницу, ломать глаза о множество других слов, похожих на искомое… Да еще и таскать с собой лишних полтысячи страниц. Вот и вздумалось собрать небольшой словарик, именно под эту книгу, в который можно было бы заглянуть в любой ситуации - даже когда нет доступа в Интернет.

Что из этого получится


На выходе мы получим самый обычный .txt - файл, в котором на каждой строчке по алфавиту будут размещены редкие слова из книги и их перевод. Такой словарик можно легко встроить, например, в MIDlet для мобильного телефона, или же непосредственно на сайт.

Почему именно Яндекс.API


В Яндексе все просто: отправил слово - пришел перевод. Не надо регистрировать уникальный ключ, как на Google.translate, да и на большое количество запросов он не жалуется.

Реализация


Для осуществления такой затеи будут созданы следующие файлы:
  • handler.php - скрипт, который будет делать всю черную работу
  • index.html - служит для отображения состояния перевода, а также для управления самим процессом
  • stop.php - скрипт, который остановит выполнение handler.php
handler.php

$v){     # Вынесем в отдельный массив только редкие слова (которых в книге 1-5) if($v<=5){ $rare_words[$w]=$v; } }  $w_total = sizeof($rare_words);			# Посчитаем количество редких слов и запишем его в файл $src = fopen('total.txt','w'); fwrite($src, $w_total); fclose($src);  $src_trns = fopen('translated.txt','a');		# Создадим файл, куда будут помещаться переведенные слова  $cnt=0; foreach($w_a as $w=>$v){     # Начнем перебирать слова  if(!file_exists('flag')){ die();   # Если "файл - выключатель" не существует - прекратим исполнение скрипта }  /* Следующая строка отправляет запрос на translate.yandex в виде обычного GET-запроса, где lang - языки перевода (с английского на русский), text - текст, который нуждается в переводе. */ $arr = json_decode(file_get_contents('http://translate.yandex.net/api/v1/tr.json/translate?lang=en-ru&text='.$w,3), true);  if($w!=$arr['text'][0]){     # Если Яндекс не вернул нам в точности то, что мы отправили ему fwrite($src_trns, $w.'/'.$arr['text'][0]."\n");     # Запишем строку в файл словаря } $cnt++;   # Увеличим счетчик переведенных слов на единицу      $src = fopen('current.txt','w');		# И запишем количество переведенных слов в файл fwrite($src, $cnt); fclose($src);  } fclose($src_trns); unlink('flag');     # После перевода всех слов уберем "выключатель" - это будет свидетельствовать о завершении ?> 
stop.php

 
index.html

               

Результаты


С помощью такого детского велосипеда перевел 5982 слов за 1033 секунды ( в среднем 5.78 слов в секунду ). Это относительно долго, отчасти потому, что я не выдумывал методы для ускорения перевода ( в идеале можно было отправлять несколько запросов одновременно, но мы ведь не хотим обидеть Яндекс ). Данный пример можно использовать для перевода редких слов из книги или статьи, когда целью есть сам результат перевода, а не процесс. Если использовать в этих целях удаленный сервер, то процесс перевода будет происходить и при выключенном компьютере.



 

 Пять уроков масштабирования гибкой разработки на опыте крупного поставщика услуг страхования.
 Выпущены шаблоны Oracle Exalogic Elastic Cloud для быстрого запуска приложений Oracle.
 ESET: Банковский троян Carberp использует новые техники атак на популярные клиенты систем ДБО.
 "Доктор Веб": выборы почти не привлекли внимание спамеров.
 ESET: Обзор информационных угроз мая 2013 года.


Главная »  Java 

© 2018 Team.Furia.Ru.
Частичное копирование материалов разрешено.