Реализация:
Вот частотомер Aho-Corasick:
import ahocorasick
def ac_frequency(needles, haystack):
frequencies = [0] * len(needles)
# Make a searcher
searcher = ahocorasick.Automaton()
for i, needle in enumerate(needles):
searcher.add_word(needle, i)
searcher.make_automaton()
# Add up all frequencies
for _, i in searcher.iter(haystack):
frequencies[i] += 1
return frequencies
(В вашем примере вы должны вызвать ac_frequency(my_list, my_string)
, чтобы получить список счетчиков)
Для средних и больших входных данных это будет значительно быстрее, чем другие методы.
Примечания:
Для реальных данных этот метод потенциально может дать результаты, отличные от других опубликованных решений, потому что Aho-Corasick ищет все вхождения целевых слов, включая подстроки.
Если вы хотите найти только полные слова, вы можете вызвать searcher.add_word
с версиями исходной строки, дополненными пробелами и знаками препинания:
...
padding_start = [" ", "\n", "\t"]
padding_end = [" ", ".", ";", ",", "-", "–", "—", "?", "!", "\n"]
for i, needle in enumerate(needles):
for s, e in [(s,e) for s in padding_start for e in padding_end]:
searcher.add_word(s + needle + e, i)
searcher.make_automaton()
# Add up all frequencies
for _, i in searcher.iter(" " + haystack + " "):
...
person
Ollin Boer Bohan
schedule
31.07.2018