Pull to refresh

Comments 24

Если уж заморачиваться с кэшем, то я бы лично заглянул в cntlst, а то собирать кэш по уже обработанным словам — только память жрать (и потакать плохим стилистам :-)).
Простите, но я не совсем поняла что такое cntlst
Если распаковать словари, в папке dict (рядом с index.* и *.exc) лежит файл с частотностью словоупотреблений. Называется cntlist:
$ ls dict
adj.exc  cntlist      cousin.exc  data.adv   data.verb  index.adj  index.noun   index.verb     noun.exc     sents.vrb  verb.Framestext
adv.exc  cntlist.rev  data.adj    data.noun  dbfiles    index.adv  index.sense  log.grind.3.1  sentidx.vrb  verb.exc
Я посмотрела этот файл — там идут три параметра на каждой строке. Первый параметр — количество повторений в семантически связанных текстах, второй параметр — смысловой ключ и третий параметр — смысловое число. Нам, получается первый и последний параметры неинтересны, остается только второй, он содержит лемму + часть речи, закодированную в число+другие ключи. Как все это можно применить именно к кэшу?
Просто при старте добавлять в кэш первые 100 позиций из этого файла :-). Это мне кажется более осмысленным, чем хранить кэш по обработанным словам.
Спасибо за совет:)
Рискну показаться сексистом, но респект девушке-программисту за хорошую статью!

В нашей отрасли девушек, увы, не хватает…
Подскажите, а то не совсем понятно чем можно *.dict.dz распаковать. Архиватор «dzip» ругается на неправильный формат архива.
Наверное, питон не является для Вас основным языком.
Я сам не программирую на нем, но и мне заметно, что стиль написание значительно ближе к Java/C#/PHP чем к питону
С++, начинающий уровень
А нет top-1000 слов на основе ваших книг? Думаю, они везде будут примерно одинаковы. Хотелось бы посмотреть на готовый файлик в excel-формате, а лучше в google docs.
Топ 1000 не будет одинаковым, он существенно будет зависеть от распарсенного материала. На самом деле RetroGuy написал постом ниже, слова это просто слова, и их действительно сложно учить без контекста. Я создавала свои скрипты не для поиска наиболее часто встречающихся слов. Мне нужно было получить значение все слов из конкретных текстов, которые мне задавал читать мой преподаватель английского. Но если бы я задалась целью учить слова по частоте, я бы взяла базы отсюда, там есть корпус из 5,000 лемм. Вот, пожалуй их бы перевела с помощью StarDict. Но задач таких я никогда не ставила. Когда я писала статью, я хотела рассказать прежде всего о WordNet и StarDict, а частотный словарь это так, поиграться…
Кода-то сам делал нечто подобное. Решил всеръез занятся английским, начал читать книги. А потом думаю, а почему бы мне не вычислить самые частоиспользуемые слова, чтобы учить только их? Дальше мысль развилась, и я решил взять десяток книг, вычислить пересечение множеств слов этих книг, а потом отсортировать по упорядоченности. Открывая результирующий файлик, я с радостью потирал руких — хаха, сейчас я выучу все эти слова и буду понимать английскую речь…

Я сильно разочаровался, т.к в итоге увидел ряд из тысячи слов типа tree, box, house, book, desk, wall, dog, can, bad, good, get…

Потом, через некоторое время я осознал, что такой «автоматизированный» способ выборки слов не сильно помогает в освоении языка. Слова надо запоминать непосредственно во фразах, по контексту, в сочетании с другими словами и общей структурой предложения. Я уж не говорю о разных значениях одних и тех же слов :) Яркий пример — словосочетание secure a button, которое переводится как застегнуть пуговицу. Если бы я встретил эти слова в автоматической выборке, даже не обратил бы на них внимание. А в тексте я не сразу понял, почему это вдруг главный герой вдруг ни с того ни с сего решил защищать кнопку, после того как надел пальто. Пришлось разобраться. :)

В общем, немало тогда шишек набил. Соберусь как-нибудь, напишу статью :)
Согласен. Мой опыт тоже говорит: читать, читать и ещё раз читать. Желательно с толковым словарём (En->En).
Немного замечаний:
* в nltk wordnet работает без обращения к серверам;
* в nltk код из ветки 2and3 под Python3.3 работает (не все, но wordnet работает);
* у collections.Counter есть метод most_common;
* в aot для английского языка лемматизация работает тоже на основе wordnet (только словари упакованы в формат, который позволяет держать все в памяти и делать быстрые выборки).
Спасибо за замечания. по правде сказать, я думала, что aot использует свои базы, а он оказывается перегоняет в свой формат WordNet. Понятно, будем знать, что все пути ведут к WordNet. Про метод most_common я знала, но мне хотелось сортировать и по ключу и по значению, и поэтому я и использовала двойную сортировку. Про nltk если честно, я не стала разбираться, как я в статье написала, я просто посмотрела исходники самого WordNet, там простой и алгоритм и правила.
Верно ли я понял, что слово commander-in-chief не будет правильно нормализовано описанной выше версией нормализатора из-за наличия предлога in, который не будет нормализован?
Поняли не совсем верно. Составное слово, в котором есть тире, тоже нормализуется. Если в слове есть тире, слово делится на части, нормализуется каждое слово по отдельности, а потом опять соединяется через тире. То есть в слове commander-in-chief будут нормализованы по отдельности три слова (commander, in, chief )
Посмотрите файл Lemmatizer.py, там есть метод, в котором все это и происходит:
def GetLemma(self, word)
GetLemma как я понял вызывается последовательно для [verb, noun, adj, adverb]. Предлогов среди них нет и GetLemma для «in» вернет None. Нет?
Есть. Я подебажила немного, при нормализации слова «in» оно найдется в индексном словаре ворднета index.adj
Занятно, что предлог записали в прилагательные. Ясно, буду знать.
Кстати, при чтении idx файла нельзя вызывать decode(«utf-8») для каждого байта, иначе декодер вываливается с ошибкой на первом же мультибайтном символе. Нужно побайтно прочитать всю последовательность до '\0' в бинарную строку и только затем вызвать decode для всей строки.
В остальном спасибо за статью, очень приятно было читать ваш код.
Спасибо за совет про кодировку, теперь в следующий раз точно про это не забуду.
Only those users with full accounts are able to leave comments. Log in, please.