Что ж, вы должны каким-то образом переосмыслить и перестроить способ хранения ваших данных или, другими словами, реализовать «ортодоксальную» версию вашего «инвертированного индекса».
Ваше узкое место - это "на лету" расчет частоты документа (DF) для терминов. Было бы разумно, чтобы это было динамичным, поэтому каждый раз, когда вы обновляете свой корпус (собрание документов), выполняйте некоторую обработку и обновляйте DF для каждого термина в документе (и, конечно, сохраняйте результаты в постоянном режиме , иначе база данных и т.д ..).
Единственная структура, которая вам нужна - это вложенный словарь, подобный этому
{ "term1" : { "DF" : x, "some_doc_id" : tf , "some_other_doc_id" : tf, etc } ,
"term2" : ...
etc..
}
корректно обновляется каждый раз, когда вы «кормите» свой корпус.
И, конечно же, держите где-нибудь свой корпус ...
В качестве хобби и части своей работы я внедряю небольшую поисковую систему с поддержкой Redis. Вы можете получить и другие идеи. Взгляните здесь .