Пользователь
0,0
рейтинг
6 февраля 2014 в 00:10

Разработка → Простой скрипт на Python для заучивания английских слов или почему я не использую карточки из песочницы tutorial

На хабре уже не раз поднималась тема изучения английского языка (пруф). Она рассматривалась с разных ракурсов. Кто-то писал, что не зачем учить слова, при изучении иностранного. Кто-то делился способами, коих великое множество, от простых карточек, до целой тетради, исписанной по самое не хочу. В конце концов есть LinguaLeo, так же замечательный сервис, на котором без дополнительной платы можно учить по 10 слов в день. Хотя иногда платить не хочется, а 10 слов кажутся весьма небольшим количество для молодого организма, который познает таинства и прелести иностранной мовы. Тогда возможно этот скрипт вам будет полезен.

К чертям GUI!

Нет. Не вообще к чертям, а в данной задаче. Все что нам требуется это прочитать слово, написать его перевод и нажать клавишу Enter. Довольно простой механизм работы. Так зачем же напрягаться и насиловать ради этого tkinter?

JSON спешит нам на помощь

Тут конечно на любителя. Я использовал JSON. Кому-то по нраву XML. Структура данных будет довольно простая.

{
"catch, caught, caught":"ловить, хватать, успеть",
"fly, flew, flown":"летать, пролетать"
}


Сохраняем подобный «словарь» из двух слов в файл, который мы назовем для примера english.json, а что бы лишний раз не настраивать локаль сохраняем его в кодировке Windows 866 (уверен, что для Linux подойдет UTF-8).

Его сиятельство код

Перво-наперво импортируем модуль sys, и модуль random.

import sys
import random


Далее мы неожиданно для себя определяем классическую функцию main. По замыслу, она сразу же потребует словарь, который будет необходимо указать в параметрах при запуске скрипта.

def main():
	try:
		wordict = eval(open(sys.argv[1]).read()) # открываем словарь
	except:
		print "You have to enter all parameters.\nExample: python wordrepeater.py yourdictionary.json" #вроде бы достаточно информативно?
		raw_input("")


Теперь у нас есть словарь wordict. Дальше нужно сделать два режима прохода по словарю. Первый — скрипт выдает нам английское слово, а мы в ответ один из его переводов. Второй проход прямо противоположный — скрипт нам русское слово, а мы ему английское. Здесь на помощь приходит конструктор словарей.

	mode = raw_input("Choose mode:\n\t1:Word To Translation;\n\t2:Translation To Word.\n>> ");
	if mode == "2": wordict = {wordict[k]:k for k in wordict.keys()} #здесь не хитрым образом ключи словаря меняются местами с их значениями.


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

def keysToValues(dic): # функции потребуется словарь для работы
	wrong = 0 # фиксируем количество ошибок
	keys = dic.keys() # извлекаем список со всеми ключами нашего словаря.
	while True:
		tmpkey = random.choice(keys)  # извлекаем случайное слово из словаря
		print "{0}: {1}".format(len(keys), tmpkey)  # выводим слово на экран. Вместе с ним выводится счетчик оставшихся слов
		value = dic[tmpkey] # запоминаем все значения этого слова 
		if raw_input("Translation: ") in value.split(", "): # пишем наш "правильный" ответ, который сразу же сравнивается с любым из значений
			print "True. {0}\n".format(value)
			keys.remove(tmpkey) # ура! правильно! слово удаляется из списка.
		else:
			wrong += 1
			print "Wrong! {0}\n".format(value) # упс... на одну ошибку больше.
		if len(keys) < 1: # все слова угаданы. В нашем спуске нет ни одного слова.
			raw_input("\n\nNothing\nWrong - {0}".format(wrong))  # здесь будет написано количество ошибок
			sys.exit() # после нажатия Enter, все закончится


Все что осталось сделать — это запустить эту функцию в main, а после запустить main.

	keysToValues(wordict)

if __name__ == "__main__":
	main()


При наличии свободного времени и этого скрипта, получается выучить до 50 (больше я не пробовал) английских слов за вечер. Самое утомительное это заполнять словарь. Но я уверен, что это не утомительней составления карточек.

Итоговый результат.

Для большего удобства весь код в одном месте.
import sys
import random

def keysToValues(dic):
	wrong = 0
	right = 0
	keys = dic.keys()
	while True:
		tmpkey = random.choice(keys)
		print "{0}: {1}".format(len(keys), tmpkey)
		#print str(len(keys))+":", tmpkey
		value = dic[tmpkey]
		#answ = raw_input("Translation: ")
		if raw_input("Translation: ") in value.split(", "):
			print "True. {0}\n".format(value) #fjf
			right += 1
			keys.remove(tmpkey)
		else:
			wrong += 1
			print "Wrong! {0}\n".format(value)
		if len(keys) < 1:
			raw_input("\n\nNothing\nRight - {0}. Wrong - {1}".format(right, wrong))
			sys.exit()

def main():
	try:
		wordict = eval(open(sys.argv[1]).read())
	except:
		print "You have to enter all parameters.\nExample: python wordrepeater.py yourdictionary.json"
		raw_input("")
	mode = raw_input("Choose mode:\n\t1:Word To Translation;\n\t2:Translation To Word.\n>> ");
	if mode == "2": wordict = {wordict[k]:k for k in wordict.keys()}
	elif mode == "":
		print "Exit"
		sys.exit()

	keysToValues(wordict)

if __name__ == "__main__":
	main()

@Koshelenok
карма
0,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

Комментарии (40)

  • +4
    Мне кажется, что многие слова еще заучиваются на этапе составления словаря.
  • 0
    Слова и фразы можно взять здесь: ilearner.ru
    • 0
      Спасибо. Попробую воспользоваться.
      • 0
        Попробуйте тогда и мой способ. Учить слова, которые не используешь — бесполезно и рано или поздно, они всё же вылетают из головы. Чтобы максимально эффективно выучить слово, нужно знать как и где оно используется.
        Первым делом, я нашёл сайт, на котором можно смотреть любимые сериалы, и плеер которого позволяет переводить слова по наведению мышкой (я выбрал ororo.tv).
        Затем, качаем субтитры на сезон, пишем скрипт (я писал на bash), который составит список наиболее встречающихся слов ( от 4 — 8 букв). Скрипт выдает на stdout слово и спрашивает: " Знаете -1, Нет — пробел". Если слово мне неизвестно, оно записывается в отдельный файл.
        Все слова вручную забиваем на LinguaLeo и тренеруем. ( Вручную потому, что у них нет API )
        Смотрим любимый сериал. Многие слова повторяются очень часто. Какой у сериала будет уклон — такие и слова.
        Слова заседают в голове надолго.

        По поводу LinguaLeo:
        А почему не заплатить 600 рублей за год ( у них там почти каждый месяц акции ) и не мучится с фрикадельками? Не такая уж и большая цена за столь полезный сервис. Я заплатил и с удовольствием пользуюсь.
        • 0
          Ну вообщем-то примерно так же, я выбираю слова нового сезона Симпсонов или из зарубежной литературы. Для тренировки изученного использую lang-8.com
          • 0
            Нууууу… У Вас более верный подход. А я поступаю как лентяй… То есть, если собирать все слова автоматом, а не руками, то совершенно не учитываются фразовые глаголы и устойчивые выражения. У меня в планах создать два словаря с такими сочетаниями, которые наиболее часто употребляются. И сначала анализировать строку на вхождение таких выражений, а потом разбивать по словам и сортировать по частоте.
        • 0
          а по поводу lingualeo: не могу в данный момент похвастаться наличием хорошего интернета, поэтому он не совсем удобен для меня.
        • 0
          Тоже использую LinguaLeo. Устраивает, но сайт у них кривенький.
          Для лучшего запоминания действительно контекст играет большую роль. Книги по методу Ильи Франка аналогично работают — быстро читаете книгу на английском, встречая одинаковые слова в разных контекстах. Всё само по себе в голове откладывается. Если закреплять на LinguaLeo — вобще отлично.
          • +1
            А говоря «закреплять», что вы имеете в виду? Есть два словарных запаса:
            1. Пассивный — т.е. пойму слово, если услышу или встречу в тексте
            2. Активный — т.е. смогу использовать сам, когда понадобится как-то выразить мысль

            Даже в родном языке пассивный словарный запас в разы превосходит активный.
            • 0
              Ах, вот как это называется, спасибо :) Интуитивно-то я догадывался, что словарный запас не один (не просто же так, например, легко читать техническую документацию, но сложно самому написать технический документ).

              Может быть, вы сможете подсказать методы увеличения активного словарного запаса? Понятное дело, тренировками. А какими? :)
              • +2
                Я как раз сейчас нахожусь в процессе создания сервиса по изучению иностранных языков (начинаю с английского), который как раз таки будет сфокусирован на расширении активного словарного запаса, так как я идентифицировал проблему современных методов (в частности — LinguaLeo) в развития пассивного словарного запаса. В итоге получается как у собаки — «все понимаю, а сам сказать ничего не могу».

                Мой метод простой (я по нему кучу языков выучил) — старайтесь мысленно переводить ваши собственные разговоры, а также разговор окружающих на изучаемый язык, и если не знаете какие-то слова — выписывайте их — в мобильный или просто блокнот. Тренируйте слова в течение трех дней перед сном в течение 10-20 минут (чтобы мозг и во сне их распихивал по ассоциативным сетям) и где-то с эффективностью в 80% (20% слов по моему субъективному опыту почему-то запоминаются сложнее) примерно через месяц вы будете в состоянии свободно говорить все то, что говорите по-русски, на изучаемом языке, т.е., в моем определении, бегло на нем говорить.

                По данному методу активный словарный запас почти что равняется пассивному — идеал эффективности изучения.
                • +1
                  Замечал за собой, что иногда пытаюсь поговорить (мысленно) с самим собой на английском :) Придумываю какую-то ситуацию и прокручиваю в голове диалог — какой он мог бы быть.

                  Большое спасибо!

                  А сервис такого рода будет очень интересен.
              • +2
                Чтобы научиться плавать, нужно плавать.
                Чтобы закрепить слово в активном словаре, нужно его использовать.

                То есть — придумать 10 разных предложений с этим словом. И вдумчиво произнести каждое. Если неправильный глагол — ещё по 10 с каждой формой.

                Лучше по 20.

                Хинт: если у слова несколько значений — работайте только с одним.

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

                Карточки в этом плане практически бесполезны. Они попросту тренируют не ту деятельность. В итоге Вы прекрасно будете знать, как по-английски «летать», «обещать», «возвращаться», но при попытке сказать «он улетел, но обещал вернуться» зависнете.
                • 0
                  Не совсем согласен: существуют по сути три разных вида деятельности: чтение, говорение, восприятие на слух. Они тренируются друг от друга практически независимо. «Пассивное» повторение карточек мне кажется очень эффективным для чтения (а что, читать вам неинтересно?) и даже для аудирования. Да, для говорения это слабовато, но говорение — всего лишь треть головоломки.

                  Для меня было откровением, как много новых слов я узнал, читая иностранные книги, хотя язык слушал довольно много, и сам говорил достаточно активно. А всё потому, что в письменной речи встречается огромное количество слов, которых нет в устной. Скорее всего, вы эти слова никогда не употребите и не услышите.
                  • 0
                    А скажите, на каком основании Вам пассивное заучивание карточек кажется эффективным для чтения?

                    Я не иронизирую, мне в самом деле интересно. Может, Вы в теме — потому что я-то не очень. Я только знаю, что для меня карточки не работают, и встречал объяснение, что они не могут работать ни для кого.

                    На мой взгляд, заучивание карточек тренирует навык «сказать перевод английского слова, услышав русское» — и всё. Для чтения этот навык настолько же бесполезен, как и для разговора.

                    При этом чтение — в самом деле полезнейшее дело. Но чтение именно чтением и тренируется. И карточка опять оказывается не туда — потому что она а) даёт перевод, который всегда приблизителен (ну-ка сумейте точно перевести глагол, например, to appreciate — любой русский глагол будет давать только часть смысла английского), при этом б1) либо грузит тебя ненужными значениями слова, либо б1) время от времени не даёт тебе нужного.

                    Даже если постараться применить этот навык при чтении, получится примерно так. Прочитали английское предложение — перевели все слова на русский — вспомнили карточку со словом, которое нас путает — построили перевод всех слов — поняли смысл предложения.

                    Это неплодотворный способ читать.
                    • +1
                      Согласен, вне контекста фраза «зубрить карточки» кажется странной. Мой способ вовсе не «пассивен», я работаю следующим образом.

                      Читаю иностранную книгу (ну или смотрю фильм). Попутно создаю новые карточки. При этом не пытаюсь забивать туда все переводы слова, стараюсь ограничиваться тем переводом, который актуален в конкретном контексте (ну если перевода всего два-три, беру все).

                      Конечно, если знания языка позволяют, пытаюсь брать не перевод на русский, а текст из толкового словаря на языке оригинала. Кстати, для английского языка в Оксфордском словаре специально выделено подмножество из примерно трёх тысяч слов для объяснений. Освоив «оксфордский минимум», вы гарантированно прочтёте любую статью из Оксфордского толкового словаря.

                      Далее, желательно начать повторять карточки пока воспоминания о прочитанном/услышанном ещё свежи. Тогда глядя на карточку, я не просто вспоминаю слово или читаю перевод, я пытаюсь вспомнить тот контекст, в котором слово встретилось. Ну и по ассоциации, конечно, запоминается лучше.

                      Банальная зубрёжка в стиле «перевод -> оригинал на карте» тоже небесполезна, если речь идёт о базовом-пребазовом наборе слов (но это тоже немало, 1-2 тысячи слов так можно освоить: названия животных, механизмов, числа, окружающий мир).

                      Кстати, чем ещё хороши книги (особенно толстые): в них неизбежно повторяются одни и те же слова. Либо автор их любит, либо просто возникают описания одних и тех же героев или лиц. Ну, скажем, Лестрейд в «Шерлоке Холмсе» постоянно фигурирует как «ferret-like» или что-то в этом роде, так что «ferret» волей-неволей запомнится уже на третьем рассказе.

                      По поводу «плодотворного способа читать» — на самом деле это больное место. Я много раз слышал, что читать со словарём «неплодотворно», но мне кажется, что в целом это всё равно самый плодотворный способ, если аккуратно повышать сложность читаемых текстов, чтобы не приходилось нырять в словарь на каждой фразе по пять раз.

                      Можно пользоваться параллельными текстами («метод Франка»), но в общем случае это как кино с субтитрами: когда перед глазами удобный альтернативный канал, основной канал автоматически отрубается.
                      • 0
                        А-а-а-а, так во-о-о-от Вы про что :).
                        Конечно, при таком подходе карточки будут работать — если Вы контекст вспоминаете.

                        Про плодотворный способ читать — словарь есть костыли. Идеал — читаем предложение на другом языке и понимаем его без перевода на родной. Иногда так не получается, когда мы не знаем слово. Приходится лезть в словарь — и даже в таком случае лучше слазать в толковый.

                        Я описал совершенно другой способ чтения :). Когда каждое слово мысленно переводится, а потом вот из этого мы пытаемся склеить смысл.
                    • +2
                      И ещё: несколько учителей традиционной школы независимо друг от друга сказали мне одну и ту же вещь (и я склонен с ней согласиться). Попугайское повторение эффективно, хоть в Европе эта идея сейчас крайне непопулярна.

                      То есть тупо вызубрить короткий текст и повторить наизусть несколько раз — полезно.
                      Потому что всё равно мы говорим выученными языковыми паттернами, сами мы практически ничего не выдумываем.

                      И вот такое банальное записывание паттернов в контексте в итоге «выстреливает».
                      • 0
                        Паттернов — да.
                        Но не отдельных слов.
                        Особо полезно в этом плане песенки учить.

                        Что-то у меня ощущение, что я с Вами не спорю совершенно :).
                        • 0
                          Да, тут не спор, а обмен опытом :)

                          Перевод иногда необходим, когда толковый словарь не помогает. Например, если открыть толковый словарь и прочесть, что такое sparrow или elm, понимания не прибавится. Ну да, поймёшь, что первое птица, а второе дерево, но не более того.

                          Вообще всё сложно. Я сейчас более-менее активно работаю с тремя иностранными языками, все на разном уровне (английский практически свободно, финский на среднем уровне, но читаю куда лучше, чем говорю, японский на самом базовом).

                          И в каждом случае нужен совершенно отдельный подход, потому что стоят разные задачи. Чем больше изучаю, тем меньше понимаю, что работает, а что не работает. Да и начальный этап у меня каждый раз был построен по-разному.
                          • 0
                            Просто интереса ради, а почему именно эти два (помимо английского) языка?
                            • 0
                              Тривиально: 7 лет в Финляндии, затем 4 года в Японии, а язык изучать всё некогда :)

                              Ну финский немного подучил, жалко терять навыки, а японский вот между делом пытаюсь шлифовать помаленьку.

                              На самом деле эта деятельность затягивает, начинаешь получать удовольствие от процесса и от новых знаний/умений. Кроме того, это реально интересные языки, да и после английского изучать такое — это как Хаскелл после Паскаля.
            • 0
              Да, пожалуй таки пассивный. Понимать понимаю, но изъясняюсь на английском кривовато.
              Идея ваша интересная, сам однажды задумывался о таком, но быстро бросал, поскольку не знал очень много слов.

              По проекту: когда релиз? Будет ли проект открытым? Нужны ли тестеры?
              • 0
                Тестеры нужны. Проект будет открытым и в бесплатной версии позволяющим полноценно изучать язык, т.е. деньги хочу брать с тех, кот любит сравнивать себя с другими или VIP финтифлюшки.
                Релиз MVP планирую в марте и развивать дальше по фидбэку энтузиастов и тестеров. Дневник создания сервиса веду тут.
  • +3
    Учу слова с помощью Anki Droid + собственного словаря для него, который делал так:
    1) нагуглил список 5000 самых употребляемых слов, забил их в csv
    2) Скриптом powershell брал очередное слово, ломился за переводом в словари mail.ru, парсил страницу, выдирал аудиозапись, перевод и примеры использования, заносил в тот же csv
    3) Профит. Можно еще изображение с гугла грузить, но не вижу для себя смысла. На основе получившейся csv сделал словарь с 4 видами карточек.

    В анки не хватает упражнений типа ввода слов, но и так годится.
    • 0
      Не могли бы выложить словарик? Как раз сегодня в очередной раз установил Anki и не нашёл словарей, которые были там раньше.
      • +2
        Конечно.
        Только примите во внимание, что я делал словарь для себя, и вам может понадобиться его немного подкорректировать:
        dl.dropboxusercontent.com/u/46655288/English5000.apkg
  • +2
    fi-osd.sh:
    #!/bin/sh
    
    export DISPLAY=:0
    
    test -r ~/fi/running || exit
    
    /usr/games/fortune ~/fi | aosd_cat -n 'LMSans14 20' -B white -b 255 -R black -s 0 -d 10 -u 7000 2>&1 > /dev/null

    ~/fi/fi:
    %
    auto - car
    %
    bussi - bus
    %
    ei - no
    %
    harmaa - grey
    %
    huone - room
    %
    ...
    

    ~/fi/Makefile:
    all: fi.dat
    
    %.dat: %
    	strfile $< $@


    Перед запуском выгенерить ~/fi/fi.dat мейком, скрипт прописать в юзерский кронтаб.
    • 0
      Да, на вопрос «почему мейком» ответ таков: потому что изначально там было более одного словаря, а файл с процентами генерился из простого текстового списка через правило с sed -e s,^,%\\n, -e 's, \\n ,\n,' < $< > $@, но для наглядности я это выкусил из мейкфайла.
  • 0
    Для запоминания слов ассоциативный метод очень хорош. Правда большой геморрой качественно ассоциации сделать. Если бесплатно, можно в голове их придумывать. За небольшую денежку — есть сервисы: langs.crankbrain.com.
  • 0
    Есть еще Mnemosyne, для осуществления интервальных повторений mnemosyne-proj.org
    Пользуюсь давно, словари составляю сам, удобно
  • +1
    wordict = eval(open(sys.argv[1]).read())

    Вам следовало бы использовать модуль json вместо функции eval.
  • +3
    Автор глубоко заблуждается: «Все что нам требуется это прочитать слово, написать его перевод и нажать клавишу Enter.»
    К сожалению, требуется гораздо больше. Выучить 50 слов за вечер не так уж и трудно, а вот вспомнить хотя бы 30 из них через две недели — вот задача.

    Я сам долгое время пользовался бумажными карточками (потому что высоких технологий и так хватает, а вот тёплое и шуршащее бесценно), но в итоге пришёл к тому, что при серьёзном подходе к делу без технологий spaced repetitions не обойтись.

    Здесь я тоже сначала сделал себе коробку Лейтнера из молочного пакета, но в конце концов пересел на Anki, чего и прочим желаю. Ну, необязательно на Anki, есть ещё Supermemo, например.

    Вот когда у вас в базе будет хотя бы 2-3 тысячи слов, которые вы помните неодинаково хорошо, так сразу осознаете ошибку.
    • 0
      Через 6 минут обязательно попробую.

      Выучить 50 слов за вечер не так уж и трудно, а вот вспомнить хотя бы 30 из них через две недели


      но я нигде не утверждал что после одного вечера на изученные слова можно забить
      • +1
        Проблема в том, что через некоторое время вы будете неодинаково хорошо помнить различные карточки, и перебирать тысячу-другую слов ради сотни плохо выученных задолбает.

        То есть вы начнёте сортировать карточки на «помню хорошо» и «помню плохо».
        А потом сообразите, что карточки «помню хорошо» надо повторять хотя бы раз в 2-3 месяца, пока они не запомнятся окончательно, а «помню плохо» стоит долбать каждые два-три дня, чтобы они запомнились.

        И вот так шаг за шагом вы подойдёте к идее spaced repetition, которая реализована в Анки и Супермемо. Более того, если почитать об используемых там алгоритмах, программа окажется совсем непростой. Потому что там довольно хитрые формулы воплощены, почерпнутые из когнитивной психологии.

        Короче говоря, от простых соображений вроде «нужны карточки» и «слова надо повторять» до эффективного изучения языка, где тысячи слов (а если изучается не один язык, а несколько, умножаем соответственно), лежит настоящая пропасть.
  • 0
    wordict = eval(open(sys.argv[1]).read())
    

    Есть же специальный модуль json, json.load().
  • 0
    Комментарий по сути: «fly» это «лететь». «Пролетать» он становится при добавлении предлога «by». В этом, наверное, основное отличие английского от русского — что у нас делается приставками, у них — предлогами. Если это учесть при изучении языка будет гораздо легче.
  • 0
    Спустя годы изучения английского при помощи нашей системы образования, репетиторов, сервисов в интернете, программ для смартфонов, standalone приложений для ПК и прочих поделок, я пришёл к выводу, что нет ничего лучше ежедневного просмотра 1-2 серии любимого сериала на английском языке с субтитрами. Если к сериалам душа не лежит, можно смотреть Ted Talks или интересующие курсы на edx, coursera.

    Именно погружение на час ежедневно в английскую среду даёт ощутимый результат.
  • 0
    Самое утомительное это заполнять словарь.

    Может кому пригодится: в качестве оболочки для словарей использую GoldenDict. Его последняя версия умеет запоминать историю (много-много, у меня стоит 1024 слова) и экспортировать ее в файл. Можно накропать скриптик, который будет делать словари из этой истории. Смысл в том, чтобы учить слова, перевод которых вы когдато искали.
  • 0
    to:
    Я использовал JSON. Кому-то по нраву XML. Структура данных будет довольно простая.

    Самое утомительное это заполнять словарь.


    есть YAML, в том числе и для Python — pyyaml

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.