Сначала вам нужно будет перевернуть словарь, чтобы ключевые слова стали ключевыми. Затем вы можете использовать регулярные выражения, чтобы разбить записи списка на ключевые слова. Затем используйте ключевые слова против обратного словаря, чтобы найти соответствующие токены
например:
lst = ['vitamin c juice', 'organic supplement']
dct = {0: 'organic', 1: 'juice', 2: 'supplement', 3: 'vitamin c'}
import re
from collections import Counter
keywords = { keyword:token for token,keyword in dct.items() } # inverted dictionary
sortedKw = sorted(keywords,key=lambda x:-len(x)) # keywords in reverse order of size
pattern = re.compile( "|".join(sortedKw) ) # regular expression
lstKeywords = [ pattern.findall(item) for item in lst ] # list items --> keywords
tokenGroups = [ [keywords[word] for word in words] for words in lstKeywords ] # keyword lists to lists of indexes
result = [ list(Counter(token).items()) for token in tokenGroups ] # lists of token indexes to (token,count)
print(result) # [[(3, 1), (1, 1)], [(0, 1), (2, 1)]]
Регулярное выражение имеет вид: keyword1 | keyword2 | keyword3
Потому что "|" Оператор в регулярных выражениях никогда не бывает жадным, более длинные ключевые слова должны появляться первыми в списке. Это причина их сортировки перед построением выражения.
После этого нужно просто преобразовать элементы списка в списки ключевых слов (это делает re.findall ()), а затем использовать инвертированный словарь, чтобы превратить каждое ключевое слово в индекс токена.
[ОБНОВЛЕНИЕ] Для подсчета количества вхождений токенов список ключевых слов, преобразованных в список индексов токенов, загружается в объект Counter (из модулей сбора), который выполняет счетная операция в специализированном словаре.