Краткий ответ: Просто избегайте стемминга в соответствии с вашими потребностями, не считая slow
и slows
совпадением.
Длинный ответ:
Вопрос:
I want to avoid stemming, and instead would like to make each entry in my inverted index as a bag of words (inflections) such as (slow, slows, slowing, slowed, slower, slowest).
Позвольте мне попытаться прояснить некоторую путаницу, которую вы испытываете по поводу инвертированных списков. Это документы , которые хранятся в проводках для каждого термина (не сами термины).
Слова обычно хранятся в словаре в памяти (реализованном с помощью таблицы ha sh или tr ie), содержащей указатели на сохраненные сообщения (список документов, содержащих этот конкретный термин) и загружается на лету из вторичного хранилища.
Простой пример (без указания веса документа):
(information) --> [D1, D5, D9,...]
(informative) --> [D9, D10, D20,...]
(retrieval) --> [D1, D9, D17,...]
..
Итак, если вы не хотите применять stemming, это нормально ... На самом деле, в приведенном выше примере показан индекс unstemmed , где слова information
и informative
появляются в их несвязанных формах. В совмещенном индексе терминов (со стеммером или лемматизатором) вы должны заменить различные формы эквивалентным представлением (скажем, inform
). В этом случае индекс будет:
(inform) --> [D1, D5, D9, D10, D20...]. --- union of the different forms
(retrieval) --> [D1, D9, D17,...]
..
Таким образом, это объединенное представление соответствует всем возможным формам слова information
, например, informative
, informational
et c.
Более длинный ответ
Теперь давайте предположим, что вы хотите достичь лучшего из обоих миров, то есть представления, которое позволяет выполнять эту связь в управляемом пользователем например, wrapping a word around quotes to denote requiring an exact match (
"медленный" vs.
медленный in the query), or some indicator to include synonyms for a query term for semantic search (e.g.
syn (медленный) `для включения синонимов слова медленный).
Для этого вам нужно вести отдельные сообщения для несвязанных слова и поддерживать дополнительные equivalence indicating pointers
между набором equivalent (stem relation/synonym relation/ semantic relation etc.)
терминов.
Возвращаясь к нашему примеру, вы получите что-то вроде:
(E1)-->(information) --> [D1, D5, D9,...]
|---->(informative) --> [D9, D10, D20,...]
|---->(data) --> [D20, D23, D25,...]
(E2)-->(retrieval) --> [D1, D9, D17,...]
|---->(search) --> [D20, D30, D31,...]
..
Здесь я показал два примера классов эквивалентности (концептуальных представлений) двух наборов терминов information, data...
и retrieval, search...
. В зависимости от синтаксиса запроса тогда будет возможно во время поиска упростить точный поиск или упрощенный поиск (на основе перегибов / синонимов и т. Д. c.)