В одном из моих текущих проектов стороны, я просматриваю какой-то текст, смотрящий на частоту слов триплетов. Вначале я использовал словарь по умолчанию для трех уровней. Другими словами, topDict[word1][word2][word3]
возвращает количество раз, когда эти слова появляются в тексте, topDict[word1][word2]
возвращает словарь со всеми словами, которые появляются после слов 1 и 2 и т.д.
Это работает правильно, но очень интенсивно. В моих первоначальных тестах он использовал что-то вроде 20-кратной памяти только для хранения триплетов в текстовом файле, что кажется чрезмерно большим объемом служебных данных памяти.
Мое подозрение в том, что многие из этих словарей создаются с большим количеством слотов, чем на самом деле используются, поэтому я хочу заменить словари чем-то другим, более эффективным с точки зрения памяти при использовании таким образом. Я бы предпочел решение, позволяющее искать ключевые слова по линиям словарей.
Из того, что я знаю о структурах данных, сбалансированное двоичное дерево поиска, использующее что-то вроде red-black или AVL, вероятно, было бы идеальным, но я бы предпочел не реализовывать их самостоятельно. Если возможно, я бы предпочел придерживаться стандартных библиотек python, но я определенно открыт для других альтернатив, если они будут работать лучше всего.
Итак, есть ли у кого-нибудь предложения для меня?
Отредактировано для добавления:
Спасибо за ответы до сих пор. Несколько ответов до сих пор предлагали использовать кортежи, что на самом деле не сильно помогло мне, когда я скомбинировал первые два слова в кортеж. Я не решаюсь использовать все три в качестве ключа, так как я хочу, чтобы было легко найти все третьи слова с учетом первых двух. (т.е. я хочу что-то вроде результата topDict[word1, word2].keys()
).
Текущий набор данных, с которым я играю, - это самая последняя версия Wikipedia For Schools. Например, результаты разбора первой тысячи страниц - это что-то вроде 11 МБ для текстового файла, в котором каждая строка - это три слова, а каждая вкладка подсчитывается. Сохранение текста в формате словаря, который я сейчас использую, занимает около 185 МБ. Я знаю, что будут дополнительные накладные расходы для указателей и еще много чего, но разница кажется чрезмерной.