суббота, 4 декабря 2010 г.

Экспорт словаря из LinguaLeo

Предыстория


Несколько месяцев назад я серьёзно решил повысить свой уровень английского языка. В помошники выбрал замечательный сайт LinguaLeo.ru. И в дополнение установил на свой Android не менее замечательную программу AnyMemo
Кратко расскажу о них. 
Концепция LinguaLeo: просматриваем аутентичный контент, кликаем по неизвестным словам, они переводятся и добавляются в словарь. Потом заучиваем эти слова в специальных упражнениях.
AnyMemo - карточки для заучивания. Показывается слово, по клику появляется перевод. От того, насколько легко мы его вспомнили, зависит время, через которая карточка будет показана вновь.


Каждый из этих помошников имеет свой недостаток. 
Для AnyMemo необходимо самому создавать словари с карточками для заучивания, а это мне делать лень. 
В LinguaLeo я считаю недостатком то, что слово, пройдя через 3 этапа упражнения, считается выученным и остается в словаре, не возвращаясь на повторение. 


Вот поэтому я решил как-то их синхронизировать.


Собственно процесс



Экспорта словаря в LinguaLeo нет. Решено было написать скрипт на Python, который бы получал список слов из LinguaLeo и преобразовывал его к виду, пригодному для AnyMemo.
Стоит отметить, что LinguaLeo не переводит слова сам, а использует для этого Google. И подумав, я не стал парсить страницу LinguaLeo, а просто скопировал список слов в текстовый файл. И сначала хотел перевести его в скрипте при помощи translate.google.ru. Благо, Google предоставляет API к нему и есть даже несколько библиотек для использования Google Translate в Python. Но потом мне захотелось, чтобы в перевод попадало не одно значение, а несколько. Это может www.google.ru/dictionary. Но беда - для него нет открытого API :( Тогда я ставил просьбу  здесь, а сам перешел по ссылке On Google's Unofficial Dictionary API . Дальше дело техники.


Листинг скрипта, написанного на скорую руку
Copy Source | Copy HTML
  1. # -*- coding: utf-8 -*-
  2.  
  3. import re, urllib, codecs
  4.  
  5. import simplejson as json
  6.  
  7. class UrlOpener(urllib.FancyURLopener):
  8.  
  9.     version = "py-gdictionary/1.0"
  10.  
  11. base_uri = "http://www.google.com/dictionary/json"
  12.  
  13. def translate(phrase, src='uk', to='en'):
  14.  
  15.     data = urllib.urlencode({'callback': 'callbacks.id100', 'restrict': 'tr,pr', 'sl': src, 'tl': to, 'q': phrase})
  16.  
  17.     resp = UrlOpener().open('%s?%s' % (base_uri, data)).read()
  18.  
  19.     resp = resp.replace('callbacks.id100(', '')
  20.     resp = resp.replace(',200,null)', '')
  21.  
  22.     try:
  23.  
  24.         resp = json.loads(resp);
  25.  
  26.         if 'primaries' in resp:
  27.             resp = resp['primaries'][ 0]['entries']
  28.             result = ""
  29.             for e1 in resp:
  30.                 result += '<b>'+e1['labels'][ 0]['text']+'</b><br />'
  31.                 for e2 in e1['entries']:
  32.                     result += e2['terms'][ 0]['text']+'<br />'
  33.         else:
  34.             result = resp['translations'][ 0]
  35.  
  36.         return result
  37.  
  38.     except:
  39.         return ""
  40.  
  41. output = codecs.open('anymemodict.txt', encoding='utf-8', mode='w')
  42.  
  43. for phrase in open('leodict.txt'):
  44.     eng_ver = translate(phrase, src='en', to='ru')
  45.     output.write(phrase.strip('\n') + "    "+eng_ver+'\n')
  46.  
  47. output.close()

Пример карточки
Вопрос:
English
Ответ:
noun
английский язык
англичане
adjective
английский
verb
переводить на английский язык

Скрипт получился более широкого применения и по сути просто переводит список слов, записывая результат в файл, пригодный для конвертирования во многие программы вроде AnyMemo.

6 комментариев:

  1. Полезная статья. Благодарю. Мне, как человеку, знакомому с программированием, это оказалось кстати. :) Только вот вопрос. Вы входной текстовый файл со словами из LinguaLeo вручную создавали? Или все-таки какой-то экспорт был?

    ОтветитьУдалить
  2. Скопировал из браузера. Сейчас способ уже не актуален, на сайте lingualeo появилась версия словаря для печати, удобно просто спарсить её.

    ОтветитьУдалить
  3. Намного эффективнее не просто учить слова, а читать книги, статьи, те же вебсайты на английском. Нужно читать материал, который интересен. Слова (нужные) сами будут запоминаться.

    ОтветитьУдалить
  4. если можно для чайников- как запустить скрипт или хотя бы по каким ключювым словам искать (а то навскидку нашел, что скрипт надо размещать на сервере). Спасибо.

    ОтветитьУдалить
  5. С помощью интерпретатора Python, без сервера. Однако, опасаюсь, что скрипт устарел и уже бесполезен.

    ОтветитьУдалить
  6. Lingualeo отличная школа. Как еще один вариант, для изучения английского языка, можно рассмотреть еще школу английского языка EnglishPapa. В школе есть бесплатный пробный урок, занятия можно проходить онлайн, преподаватель направляет, помогает и подстраивается под ваш график. Попробуйте.

    ОтветитьУдалить