Изучение иностранного языка. Словарный запас

Многие из нас мучительно пытались изучить какой-либо иностранный язык, но далеко не все достигли серьезных результатов. И это после многих лет обучения. Большинство людей, как правило, могут перевести то, что связано с профессиональной деятельностью. Сразу стоит сказать, что «волшебного» способа изучить язык не существует — это долгий и трудоемкий процесс.

Какой словарный запас должен быть для дословного перевода хотя бы 90% текста? Для ответа на этот вопрос создадим программу для формирования необходимого словаря.

Содержание

  1. Описание проекта
    1. Код
    2. Пример использования
  2. Создание словаря по серии книг
  3. Исходный код

Описание проекта

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

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

Общий алгоритм:

  1. Установить текущую локаль;
  2. Из каждого входного файла добавить набор слов в общий словарь с учетом повторений;
  3. Удалить из словаря однобуквенные слова;
  4. Упорядочить слова по убыванию количества повторений;
  5. Удалить из словаря необходимое количество первых позиций (это связано с тем, что чаще всего используются артикли, союзы и т.п.);
  6. Вывести полученный словарь, указав частоту слова и процент знакомых слов текста для текущей позиции;
  7. Вывести ключевые значения процента знакомых слов с соответствующей глубиной изучения словаря.

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

Теперь коротко о каждом пункте.

Код

1. Локаль

Для установки текущей локали, потребуется заголовочный файл locale и одна строка кода:

#include <locale>

...

locale::global( locale( "" ) );

...

2. Словарь

Список файлов для второй подзадачи будем передавать в качестве параметров командной строки. Причем последним параметром будет количество удаляемых позиций для подзадачи 5.

Словарем будет динамический массив следующего вида:

std::vector<Word> dict;

где Word — это структура:

struct Word {
 wstring str;
 int count;
};

Здесь первый параметр — слово, а второй — количество его вхождений в общем тексте.

Для чтения данных будем использовать класс wifstream и функцию getline.

Следует отметить, что каждое слово в словаре будет записано в нижнем регистре. Для перевода строки типа wstring в нижний регистр используется функция towlower, применяемая к каждому символу. Кроме того, для определения символов, относящихся к алфавиту языка, используется функция iswalpha. Все остальные символы заменим на пробелы, что позволит разбить строку на слова с помощью оператора >> класса wistringstream.

3. Удаление однобуквенных слов

Алгоритм удаления слов из одной буквы довольно прост. Всего лишь нужно перебрать массив, проверяя длину слова. Если длина слова равна 1, то удаляем элемент с помощью команды dict.erase(dict.begin()+<номер элемента>). Так как в документации к erase сказано, что все итераторы, указатели и ссылки на элементы, расположенные до позиции удаления, остаются пригодными, номер текущего элемента оставляем прежним. То есть, если мы удалили элемент с индексом 3, то элементы с индексами 0, 1 и 2 по прежнему присутствуют. Причем их порядок и расположение в памяти не изменились. В таком случае индекс 3 будет относиться к следующему элементу за удаленным, либо выходить за пределы массива.

int i=0;
while(i < dict.size()) {
	if(dict[i].str.size() == 1) {
		dict.erase(dict.begin()+i);
	} else i++;
};

4. Сортировка

Для реализации четвертого пункта, а именно — сортировки словаря по частоте слов, используется функция sort(dict.begin(), dict.end(), sortByCount), где sortByCount — это функция сравнения двух элементов типа Word, возвращающая логическое значение:

bool sortByCount(Word&amp; w1, Word&amp; w2) {
    return (w1.count > w2.count);
};

5. Удаление первых позиций

В пятом пункте используется erase, как и в третьем, но с двумя аргументами — началом и концом удаляемого фрагмента массива.

6. Расчет процента знакомых слов

Расчеты в шестом пункте — это простой подсчет процента от общего количества слов.

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

Пример использования

После компиляции получаем исполняемый файл dictionary. Для теста используем небольшой фрагмент из книги The Jungle Book Редьярда Киплинга :

It was seven o’clock of a very warm evening in the Seeonee hills when
Father Wolf woke up from his day’s rest, scratched himself, yawned, and
spread out his paws one after the other to get rid of the sleepy feeling
in their tips. Mother Wolf lay with her big gray nose dropped across her
four tumbling, squealing cubs, and the moon shone into the mouth of the
cave where they all lived

Сохраним данный текст в файле fragment.txt и выполним команду:

./dictionary fragment.txt 0

В результате на экране увидим следующее:

Загрузка fragment.txt …
Всего слов: 60
the ………………….6, 8%
of …………………..3, 12%
in …………………..2, 15%
his ………………….2, 18%
wolf …………………2, 20%
her ………………….2, 23%
and ………………….2, 26%
tips …………………1, 27%
mother ……………….1, 29%
their ………………..1, 30%
four …………………1, 31%
feeling ………………1, 33%
lay ………………….1, 34%
with …………………1, 36%
sleepy ……………….1, 37%
big ………………….1, 38%
rid ………………….1, 40%
gray …………………1, 41%
nose …………………1, 43%
get ………………….1, 44%
dropped ………………1, 45%
across ……………….1, 47%
one ………………….1, 48%
tumbling ……………..1, 50%
squealing …………….1, 51%
cubs …………………1, 52%
moon …………………1, 54%
shone ………………..1, 55%
into …………………1, 56%
mouth ………………..1, 58%
cave …………………1, 59%
where ………………..1, 61%
they …………………1, 62%
all ………………….1, 63%
lived ………………..1, 65%
up …………………..1, 66%
was ………………….1, 68%
seven ………………..1, 69%
clock ………………..1, 70%
very …………………1, 72%
warm …………………1, 73%
evening ………………1, 75%
seeonee ………………1, 76%
hills ………………..1, 77%
when …………………1, 79%
father ……………….1, 80%
woke …………………1, 81%
to …………………..1, 83%
from …………………1, 84%
day ………………….1, 86%
rest …………………1, 87%
scratched …………….1, 88%
himself ………………1, 90%
yawned ……………….1, 91%
spread ……………….1, 93%
out ………………….1, 94%
paws …………………1, 95%
it …………………..1, 97%
after ………………..1, 98%
other ………………..1, 100%
20 % - 5 слов
25 % - 7 слов +2
30 % - 10 слов +3
35 % - 14 слов +4
40 % - 17 слов +3
45 % - 21 слов +4
50 % - 24 слов +3
55 % - 28 слов +4
60 % - 32 слов +4
65 % - 35 слов +3
70 % - 39 слов +4
75 % - 42 слов +3
80 % - 46 слов +4
85 % - 50 слов +4
86 % - 51 слов +1
87 % - 52 слов +1
88 % - 53 слов +1
89 % - 54 слов +1
90 % - 55 слов +1
91 % - 56 слов +1
92 % - 57 слов +1
93 % - 58 слов +1
94 % - 59 слов +1
95 % - 60 слов +1

Последний список показывает процент переводимого объема текста и достаточное для этого количество слов. Из результата видно, что артикль the встречается чаще любых других слов. Его можно исключить из словаря, указав 1 вместо 0 в параметрах командной строки. Это количество удаляемых первых позиций словаря.

Чтобы сохранить сгенерированный словарь например в файл out.txt, допишите « > out.txt» в конце командной строки:

./dictionary fragment.txt 0 > out.txt

Создание словаря по серии книг

Все книги, использованные в данном примере, взяты с ресурса http://gutenberg.org/ , поскольку хранятся в открытом доступе. Вот весь список:

  • Alice’s Adventures in Wonderland, by Lewis Carroll
  • The Legend of Sleepy Hollow, by Washington Irving
  • The Strange Case Of Dr. Jekyll And Mr. Hyde, by Robert Louis Stevenson
  • A Christmas Carol, by Charles Dickens
  • A Tale of Two Cities, by Charles Dickens
  • A Modest Proposal, by Jonathan Swift
  • Anthem, by Ayn Rand
  • Pride and Prejudice, by Jane Austen
  • The Scarlet Letter, by Nathaniel Hawthorne
  • The Narrative of the Life of Frederick Douglass, by Frederick Douglass
  • Dracula, by Bram Stoker
  • The Importance of Being Earnest, by Oscar Wilde
  • The Prince, by Nicolo Machiavelli
  • A Doll’s House, by Henrik Ibsen
  • Metamorphosis, by Franz Kafka
  • Beowulf
  • Ambrotox and Limping Dick, by Oliver Fleming

Загрузив указанные книги в формате txt и выполнив команду «./dictionary *.txt 0 > result» в папке с книгами, получим следующее:

Формирование словаря английских слов на основе серии книг с подсчетом частоты повторений каждого слова
Начало файла result

Таким образом, в 17-и книгах оказалось 25498 уникальных слов. Чаще всего встречается the50544 раза. Из полученных данных следует, что выучив первые 8 слов, вы сможете «понять» 20% текста. Конечно, о реальном понимании речь не идет. Просто 20% встречаемых в тексте слов будут вам знакомы.

Процент "понимания" текста и соответствующее количество слов по списку
Содержимое файла result

Таким образом, чтобы перевести 70% текста, нужно изучить первые 449 позиций текущего словаря. Для 75% потребуется 719 позиций, что на 270 больше, чем в предыдущем случае.

Как нетрудно увидеть, самыми употребляемыми оказались артикли, предлоги, союзы и т.д.. Все они в совокупности составляют около 30% текста, но вряд ли, изучив их, вы приблизитесь к сопоставимому уровню понимания написанного.

Для улучшения ситуации удалим из словаря первые 20 позиций, что соответствует 30%. Выполним для этого команду «./dictionary *.txt 20 > result1«. На выходе имеем новый словарь с более реальными требованиями к количеству изучаемых слов:

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

Исходный код

Скачать

Добавить комментарий

Ваш e-mail не будет опубликован.