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')
Другие вопросы по тегам