Python кодирование, относящееся к функции any и ключевому слову "больше одного раза"
У меня есть этот простой кусок кода, который сообщает мне, появляется ли слово в данном списке в статье:
if not any(word in article.text for word in keywords):
print("Skipping article as there is no matching keyword\n")
Что мне нужно, так это если в статье появятся как минимум 3 слова из списка "ключевые слова" - если их нет, то статью следует пропустить.
Есть простой способ сделать это? Кажется, я ничего не могу найти.
3 ответа
Если набор ключевых слов достаточно велик, а искомая строка достаточно длинна, чтобы ее часто стоило замкнуть накоротко, это вариант других подходов, который остановится, когда будут найдены три совпадения (очень похоже на any
останавливается, когда один удар найден):
from itertools import islice
if sum(islice((1 for word in keywords if word in article.text), 3)) == 3:
Как только вы получите три попадания, он сразу же прекратит итерацию ключевых слов и тест пройден.
Вы можете посчитать количество элементов, которые удовлетворяют условию, используя этот шаблон:
sum(1 for x in xs if c(x))
Здесь вы бы сделали:
if sum(1 for word in keywords if word in article.text) >= 3:
#
Мой текст и списки довольно длинные
если текст большой и в нем много ключевых слов, вы можете использовать алгоритм Aho-Corasick (например, grep -Ff keywords.txt text.txt
) например, если вы хотите найти непересекающиеся вхождения, вы можете использовать noaho
пакет (не тестировался):
#!/usr/bin/env python
from itertools import islice
from noaho import NoAho # $ pip install noaho
trie = NoAho()
for word in keywords:
trie.add(word)
found_words = trie.findall_long(article.text)
if len(list(islice(found_words, 3))) == 3:
print('at least 3 words in the "keywords" list appear in the article')