Я начинаю с коллекции C
целевых наборов. Каждый набор содержит слова (или строки без пробелов). Перебирая предложения, я могу рассматривать предложение как наблюдаемый набор слов D
. Моя проблема в том, что для каждого предложения я хочу найти все наборы S
в C
, такие что D
содержит S
. Другими словами, я хочу найти все наборы слов в C
, для которых все их слова входят в предложение.
Например, рассмотрим следующее содержимое для C
:
{fell, ate}
{cat, snail, tiger}
{tree, bush, jalepeno}
{pen, paperclip, stapler}
Теперь, если я увижу предложение «Дерево упало на куст, потому что оно съело джалепено», я хотел бы вернуть следующие два сета.
{fell, ate}
{tree, bush, jalepeno}
Это похоже на три. Тем не менее, это только похоже, потому что я не совпадаю по всем словам в предложении, а скорее любое подмножество. Одна из идей состояла в том, чтобы представить коллекцию C
в виде трёхподобной структуры данных с Map[String, PseudoTrie]
на каждом уровне и следовать по нескольким путям через нее, пока я перебираю слова в предложении в отсортированном порядке.
Я так понимаю, это похоже на поисковый запрос. Тем не менее, это нормально, если мне нужно перебрать все предложения, если вычисления для каждого предложения быстрые. Перебор каждого набора в C
и выполнение содержимого выполняется слишком медленно.
UPDATE
Я думал, что люди могут быть заинтересованы в некоторых результатах, которые я получил. Эти сроки составляют 100000 предложений, и каждый целевой набор C
в D
содержит около 4 или 5 слов.
Оригинальное приложение. Переберите все целевые наборы и посмотрите, содержатся ли они в предложении, где предложение представлено набором слов. 227 с
Фильтрация по словарю. Так же, как исходный процесс, за исключением предложений, представленных набором слов в этом предложении, которые также находятся в некотором целевом наборе. Преимущество в том, что при сравнении нужно учитывать только подмножество слов в предложении. 110 с
Строки переводятся в целочисленный ключ, начиная с 0. Это также включает фильтрацию в пробной версии # 2 по необходимости. 86 с
Добавить инвертированный индекс. 4 с
Я также попробовал BitSets с инвертированным индексом. Это заняло 20 секунд, поэтому я не придерживался их. Я не уверен, почему замедление - возможно, я сделал что-то не так.
Кроме того, я думаю, что моя оригинальная идея великолепна (много слоев инвертированных индексов), но она довольно сложная, и у меня уже довольно хорошее ускорение!