вторник, 26 февраля 2013 г.

Очень приятно, что у яндекса есть публичное API для перевода.


Искренне радуюсь, когда такие вещи публичны и общедоступны. В 2009 году у меня было несколько программок, в которых я использовал доступный тогда Google translate API. Однако корпорация добра вскоре закрыла свой сервис, и мои программки сразу же стали бесполезны, ибо они небыли платными и зависеть от платного сервиса не могли.

Сегодня нас радует Яндекс. Спасибо, ребята за очень полезный открытый API. Не закрывайте его пожалуйста!



Вот примитивный микропример перевода с русского:

# -*- coding: utf-8 -*-

import urllib2

from xml.dom import minidom

def detect_lang(text):
    request = r'http://translate.yandex.net/api/v1/tr/detect?text=' + urllib2.quote(text)
    response = urllib2.urlopen(request)
    xml_string = response.read()
    xmldoc = minidom.parseString(xml_string)
    src_direction = xmldoc.getElementsByTagName('DetectedLang')
    return src_direction[0].getAttribute('lang')

def directions():
    request = r'http://translate.yandex.net/api/v1/tr/getLangs'
    response = urllib2.urlopen(request)
    xml_string = response.read()
    xmldoc = minidom.parseString(xml_string)

    directions_nodes_list = xmldoc.getElementsByTagName('string')
    for direction in directions_nodes_list:
        yield direction.firstChild.nodeValue


def translate(direction, text):
    text = urllib2.quote(text)
    request = r'http://translate.yandex.net/api/v1/tr/translate?lang=' + direction + r'&text=' + text
    response = urllib2.urlopen(request)
    xml_string = response.read()
    xmldoc = minidom.parseString(xml_string)
    child = xmldoc.firstChild
    bottom = child
    while True:
        bottom = child.firstChild
        if bottom is None:
            break
        child = bottom
    return child.data

text_to_translate = 'Я очень люблю программирование.'

src_lang = detect_lang(text_to_translate).strip()

for direction in directions():
    if direction[0:2] == src_lang:
        print direction, ':', translate(direction, text_to_translate)


При выполнении этого Python скрипта вы получите такой вывод в консоль:


ru-en : I love programming.
ru-pl : Ja bardzo lubię programowanie.
ru-uk : Я дуже люблю програмування.
ru-de : Ich Liebe Programmierung.
ru-fr : J'aime beaucoup la programmation.
ru-es : Me encanta la programación.
ru-it : Mi piace molto la programmazione.
ru-bg : Аз много обичам програмиране.
ru-cs : Jsem velmi rád programování.
ru-tr : Ben çok seviyorum programlama.
ru-ro : Îmi place foarte mult de programare.
ru-sr : Ја веома волим програмирање.


Это есть перевод с русского на все остальные доступные для этого сервиса направления.

Скрипт упрощенно использует все три доступные на сегодняшний день функции:
  • определяет язык с которого осуществлять перевод (метод detect)
  • получает список всех возможных направлений перевода (метод getLangs)
  • переводит текст на все известные сервису другие языки (метод translate)
Машинный перевод - задача очень интеллектуальная и в домашних условиях может быть сделан только очень примитивный прототип подобного переводчика, так как он требует актуальных хороших корпусов, машинного обучения с использованием MapReduce, и тп. А с этим API частное лицо может создать маленькие и очень полезные утилиты для частных целей. Естественно, если нагрузки становятся значительными, то скорее всего условия будут другими. В случае коммерческого интереса об этом можно спросить у самого яндекса.

Комментариев нет:

Отправить комментарий